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, 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'
@@ -120,7 +120,7 @@ describe('message commands', () => {
120
120
  })
121
121
 
122
122
  describe('sendAction', () => {
123
- test('sends message to channel by name', async () => {
123
+ it('sends message to channel by name', async () => {
124
124
  const result = await sendAction('general', 'hello world', { _credManager: manager })
125
125
 
126
126
  expect(result.id).toBe('msg1')
@@ -130,7 +130,7 @@ describe('message commands', () => {
130
130
  expect(mockSendMessage).toHaveBeenCalledWith('ch1', 'hello world', { thread_id: undefined })
131
131
  })
132
132
 
133
- test('sends message to channel by ID', async () => {
133
+ it('sends message to channel by ID', async () => {
134
134
  const result = await sendAction('123456', 'hi', { _credManager: manager })
135
135
 
136
136
  expect(result.id).toBe('msg1')
@@ -138,7 +138,7 @@ describe('message commands', () => {
138
138
  expect(mockSendMessage).toHaveBeenCalledWith('123456', 'hi', { thread_id: undefined })
139
139
  })
140
140
 
141
- test('sends message to thread', async () => {
141
+ it('sends message to thread', async () => {
142
142
  const result = await sendAction('general', 'thread reply', {
143
143
  _credManager: manager,
144
144
  thread: 'thread123',
@@ -148,13 +148,13 @@ describe('message commands', () => {
148
148
  expect(mockSendMessage).toHaveBeenCalledWith('ch1', 'thread reply', { thread_id: 'thread123' })
149
149
  })
150
150
 
151
- test('returns error on channel not found', async () => {
151
+ it('returns error on channel not found', async () => {
152
152
  const result = await sendAction('unknown', 'hi', { _credManager: manager })
153
153
 
154
154
  expect(result.error).toContain('Channel not found')
155
155
  })
156
156
 
157
- test('returns error on client failure', async () => {
157
+ it('returns error on client failure', async () => {
158
158
  mockSendMessage.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
159
159
 
160
160
  const result = await sendAction('general', 'hi', { _credManager: manager })
@@ -164,7 +164,7 @@ describe('message commands', () => {
164
164
  })
165
165
 
166
166
  describe('listAction', () => {
167
- test('lists messages in channel', async () => {
167
+ it('lists messages in channel', async () => {
168
168
  const result = await listAction('general', { _credManager: manager })
169
169
 
170
170
  expect(result.messages).toHaveLength(2)
@@ -174,25 +174,25 @@ describe('message commands', () => {
174
174
  expect(mockGetMessages).toHaveBeenCalledWith('ch1', 50)
175
175
  })
176
176
 
177
- test('uses custom limit', async () => {
177
+ it('uses custom limit', async () => {
178
178
  await listAction('general', { _credManager: manager, limit: '10' })
179
179
 
180
180
  expect(mockGetMessages).toHaveBeenCalledWith('ch1', 10)
181
181
  })
182
182
 
183
- test('defaults to 50 messages', async () => {
183
+ it('defaults to 50 messages', async () => {
184
184
  await listAction('general', { _credManager: manager })
185
185
 
186
186
  expect(mockGetMessages).toHaveBeenCalledWith('ch1', 50)
187
187
  })
188
188
 
189
- test('resolves channel name', async () => {
189
+ it('resolves channel name', async () => {
190
190
  await listAction('general', { _credManager: manager })
191
191
 
192
192
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
193
193
  })
194
194
 
195
- test('returns error on failure', async () => {
195
+ it('returns error on failure', async () => {
196
196
  mockGetMessages.mockImplementationOnce(() => Promise.reject(new Error('Forbidden')))
197
197
 
198
198
  const result = await listAction('general', { _credManager: manager })
@@ -202,7 +202,7 @@ describe('message commands', () => {
202
202
  })
203
203
 
204
204
  describe('getAction', () => {
205
- test('gets a single message', async () => {
205
+ it('gets a single message', async () => {
206
206
  const result = await getAction('general', 'msg1', { _credManager: manager })
207
207
 
208
208
  expect(result.id).toBe('msg1')
@@ -211,13 +211,13 @@ describe('message commands', () => {
211
211
  expect(mockGetMessage).toHaveBeenCalledWith('ch1', 'msg1')
212
212
  })
213
213
 
214
- test('resolves channel name', async () => {
214
+ it('resolves channel name', async () => {
215
215
  await getAction('general', 'msg1', { _credManager: manager })
216
216
 
217
217
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
218
218
  })
219
219
 
220
- test('returns error on failure', async () => {
220
+ it('returns error on failure', async () => {
221
221
  mockGetMessage.mockImplementationOnce(() => Promise.reject(new Error('Not Found')))
222
222
 
223
223
  const result = await getAction('general', 'msg999', { _credManager: manager })
@@ -227,7 +227,7 @@ describe('message commands', () => {
227
227
  })
228
228
 
229
229
  describe('updateAction', () => {
230
- test('updates a message', async () => {
230
+ it('updates a message', async () => {
231
231
  const result = await updateAction('general', 'msg1', 'updated text', { _credManager: manager })
232
232
 
233
233
  expect(result.id).toBe('msg1')
@@ -236,13 +236,13 @@ describe('message commands', () => {
236
236
  expect(mockEditMessage).toHaveBeenCalledWith('ch1', 'msg1', 'updated text')
237
237
  })
238
238
 
239
- test('resolves channel name', async () => {
239
+ it('resolves channel name', async () => {
240
240
  await updateAction('general', 'msg1', 'new', { _credManager: manager })
241
241
 
242
242
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
243
243
  })
244
244
 
245
- test('returns error on failure', async () => {
245
+ it('returns error on failure', async () => {
246
246
  mockEditMessage.mockImplementationOnce(() => Promise.reject(new Error('Cannot edit')))
247
247
 
248
248
  const result = await updateAction('general', 'msg1', 'new', { _credManager: manager })
@@ -252,34 +252,34 @@ describe('message commands', () => {
252
252
  })
253
253
 
254
254
  describe('deleteAction', () => {
255
- test('deletes message with --force', async () => {
255
+ it('deletes message with --force', async () => {
256
256
  const result = await deleteAction('general', 'msg1', { _credManager: manager, force: true })
257
257
 
258
258
  expect(result.deleted).toBe('msg1')
259
259
  expect(mockDeleteMessage).toHaveBeenCalledWith('ch1', 'msg1')
260
260
  })
261
261
 
262
- test('returns error without --force', async () => {
262
+ it('returns error without --force', async () => {
263
263
  const result = await deleteAction('general', 'msg1', { _credManager: manager })
264
264
 
265
265
  expect(result.error).toBe('Use --force to confirm deletion')
266
266
  expect(mockDeleteMessage).not.toHaveBeenCalled()
267
267
  })
268
268
 
269
- test('returns error with force=false', async () => {
269
+ it('returns error with force=false', async () => {
270
270
  const result = await deleteAction('general', 'msg1', { _credManager: manager, force: false })
271
271
 
272
272
  expect(result.error).toBe('Use --force to confirm deletion')
273
273
  expect(mockDeleteMessage).not.toHaveBeenCalled()
274
274
  })
275
275
 
276
- test('resolves channel name', async () => {
276
+ it('resolves channel name', async () => {
277
277
  await deleteAction('general', 'msg1', { _credManager: manager, force: true })
278
278
 
279
279
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
280
280
  })
281
281
 
282
- test('returns error on failure', async () => {
282
+ it('returns error on failure', async () => {
283
283
  mockDeleteMessage.mockImplementationOnce(() => Promise.reject(new Error('Forbidden')))
284
284
 
285
285
  const result = await deleteAction('general', 'msg1', { _credManager: manager, force: true })
@@ -289,20 +289,20 @@ describe('message commands', () => {
289
289
  })
290
290
 
291
291
  describe('repliesAction', () => {
292
- test('fetches thread messages', async () => {
292
+ it('fetches thread messages', async () => {
293
293
  const result = await repliesAction('general', 'thread1', { _credManager: manager })
294
294
 
295
295
  expect(result.messages).toHaveLength(2)
296
296
  expect(mockGetMessages).toHaveBeenCalledWith('thread1', 50)
297
297
  })
298
298
 
299
- test('uses custom limit', async () => {
299
+ it('uses custom limit', async () => {
300
300
  await repliesAction('general', 'thread1', { _credManager: manager, limit: '25' })
301
301
 
302
302
  expect(mockGetMessages).toHaveBeenCalledWith('thread1', 25)
303
303
  })
304
304
 
305
- test('returns error on failure', async () => {
305
+ it('returns error on failure', async () => {
306
306
  mockGetMessages.mockImplementationOnce(() => Promise.reject(new Error('Thread not found')))
307
307
 
308
308
  const result = await repliesAction('general', 'thread999', { _credManager: manager })
@@ -19,7 +19,7 @@ describe('reaction commands', () => {
19
19
  })
20
20
 
21
21
  describe('addAction', () => {
22
- it('should add reaction successfully', async () => {
22
+ it('adds reaction successfully', async () => {
23
23
  const result = await addAction('general', 'msg-456', '👍', {
24
24
  ...options,
25
25
  _credManager: mockCredManager,
@@ -28,14 +28,14 @@ describe('reaction commands', () => {
28
28
  expect(result).toBeDefined()
29
29
  })
30
30
 
31
- it('should return error when channel resolution fails', async () => {
31
+ it('returns error when channel resolution fails', async () => {
32
32
  const result = await addAction('nonexistent', 'msg-456', '👍', options)
33
33
  expect(result.error).toBeDefined()
34
34
  })
35
35
  })
36
36
 
37
37
  describe('removeAction', () => {
38
- it('should remove reaction successfully', async () => {
38
+ it('removes reaction successfully', async () => {
39
39
  const result = await removeAction('general', 'msg-456', '👍', {
40
40
  ...options,
41
41
  _credManager: mockCredManager,
@@ -44,14 +44,14 @@ describe('reaction commands', () => {
44
44
  expect(result).toBeDefined()
45
45
  })
46
46
 
47
- it('should return error when channel resolution fails', async () => {
47
+ it('returns error when channel resolution fails', async () => {
48
48
  const result = await removeAction('nonexistent', 'msg-456', '👍', options)
49
49
  expect(result.error).toBeDefined()
50
50
  })
51
51
  })
52
52
 
53
53
  describe('action result structure', () => {
54
- it('addAction should return success result with channel, messageId, emoji', async () => {
54
+ it('returns success result with channel, messageId, and emoji for addAction', async () => {
55
55
  const result = await addAction('general', 'msg-456', '👍', {
56
56
  ...options,
57
57
  _credManager: mockCredManager,
@@ -64,7 +64,7 @@ describe('reaction commands', () => {
64
64
  }
65
65
  })
66
66
 
67
- it('removeAction should return success result with channel, messageId, emoji', async () => {
67
+ it('returns success result with channel, messageId, and emoji for removeAction', async () => {
68
68
  const result = await removeAction('general', 'msg-456', '👍', {
69
69
  ...options,
70
70
  _credManager: mockCredManager,
@@ -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'
@@ -56,7 +56,7 @@ describe('server commands', () => {
56
56
  })
57
57
 
58
58
  describe('listAction', () => {
59
- test('lists all servers from client', async () => {
59
+ it('lists all servers from client', async () => {
60
60
  const manager = new DiscordBotCredentialManager(tempDir)
61
61
  await manager.setCredentials({
62
62
  token: 'token123',
@@ -79,7 +79,7 @@ describe('server commands', () => {
79
79
  })
80
80
  })
81
81
 
82
- test('marks current server in list', async () => {
82
+ it('marks current server in list', async () => {
83
83
  const manager = new DiscordBotCredentialManager(tempDir)
84
84
  await manager.setCredentials({
85
85
  token: 'token123',
@@ -94,7 +94,7 @@ describe('server commands', () => {
94
94
  expect(result.servers?.[1].current).toBe(false)
95
95
  })
96
96
 
97
- test('handles client errors', async () => {
97
+ it('handles client errors', async () => {
98
98
  mockListGuilds.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
99
99
 
100
100
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -112,7 +112,7 @@ describe('server commands', () => {
112
112
  })
113
113
 
114
114
  describe('currentAction', () => {
115
- test('returns current server info', async () => {
115
+ it('returns current server info', async () => {
116
116
  const manager = new DiscordBotCredentialManager(tempDir)
117
117
  await manager.setCredentials({
118
118
  token: 'token123',
@@ -127,7 +127,7 @@ describe('server commands', () => {
127
127
  expect(result.name).toBe('Test Guild')
128
128
  })
129
129
 
130
- test('returns error when no server set', async () => {
130
+ it('returns error when no server set', async () => {
131
131
  const manager = new DiscordBotCredentialManager(tempDir)
132
132
  await manager.setCredentials({
133
133
  token: 'token123',
@@ -141,7 +141,7 @@ describe('server commands', () => {
141
141
  expect(result.error).toContain('No server set')
142
142
  })
143
143
 
144
- test('handles client errors', async () => {
144
+ it('handles client errors', async () => {
145
145
  mockGetGuild.mockImplementationOnce(() => Promise.reject(new Error('Guild not found')))
146
146
 
147
147
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -160,7 +160,7 @@ describe('server commands', () => {
160
160
  })
161
161
 
162
162
  describe('switchAction', () => {
163
- test('switches to a new server', async () => {
163
+ it('switches to a new server', async () => {
164
164
  const manager = new DiscordBotCredentialManager(tempDir)
165
165
  await manager.setCredentials({
166
166
  token: 'token123',
@@ -177,7 +177,7 @@ describe('server commands', () => {
177
177
  expect(currentServer).toBe('guild2')
178
178
  })
179
179
 
180
- test('updates server name in credential manager', async () => {
180
+ it('updates server name in credential manager', async () => {
181
181
  const manager = new DiscordBotCredentialManager(tempDir)
182
182
  await manager.setCredentials({
183
183
  token: 'token123',
@@ -194,7 +194,7 @@ describe('server commands', () => {
194
194
  })
195
195
  })
196
196
 
197
- test('handles client errors', async () => {
197
+ it('handles client errors', async () => {
198
198
  mockGetGuild.mockImplementationOnce(() => Promise.reject(new Error('Unauthorized')))
199
199
 
200
200
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -212,7 +212,7 @@ describe('server commands', () => {
212
212
  })
213
213
 
214
214
  describe('infoAction', () => {
215
- test('returns server info', async () => {
215
+ it('returns server info', async () => {
216
216
  const manager = new DiscordBotCredentialManager(tempDir)
217
217
  await manager.setCredentials({
218
218
  token: 'token123',
@@ -228,7 +228,7 @@ describe('server commands', () => {
228
228
  expect(result.owner).toBe(true)
229
229
  })
230
230
 
231
- test('handles client errors', async () => {
231
+ it('handles client errors', async () => {
232
232
  mockGetGuild.mockImplementationOnce(() => Promise.reject(new Error('Guild not found')))
233
233
 
234
234
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -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'
@@ -87,7 +87,7 @@ describe('snapshot command', () => {
87
87
  })
88
88
 
89
89
  describe('default (brief)', () => {
90
- test('returns channels with id and name only', async () => {
90
+ it('returns channels with id and name only', async () => {
91
91
  const manager = await setupManager(tempDir)
92
92
 
93
93
  const result = await snapshotAction({ _credManager: manager })
@@ -99,7 +99,7 @@ describe('snapshot command', () => {
99
99
  expect(result.hint).toBeDefined()
100
100
  })
101
101
 
102
- test('filters out non-text channels', async () => {
102
+ it('filters out non-text channels', async () => {
103
103
  const manager = await setupManager(tempDir)
104
104
 
105
105
  const result = await snapshotAction({ _credManager: manager })
@@ -108,7 +108,7 @@ describe('snapshot command', () => {
108
108
  expect(channelNames).not.toContain('voice')
109
109
  })
110
110
 
111
- test('does not fetch messages', async () => {
111
+ it('does not fetch messages', async () => {
112
112
  const manager = await setupManager(tempDir)
113
113
 
114
114
  await snapshotAction({ _credManager: manager })
@@ -118,7 +118,7 @@ describe('snapshot command', () => {
118
118
  })
119
119
 
120
120
  describe('--full (channels + messages)', () => {
121
- test('returns channels with recent messages', async () => {
121
+ it('returns channels with recent messages', async () => {
122
122
  const manager = await setupManager(tempDir)
123
123
 
124
124
  const result = await snapshotAction({ _credManager: manager, full: true })
@@ -136,7 +136,7 @@ describe('snapshot command', () => {
136
136
  })
137
137
  })
138
138
 
139
- test('fetches messages in parallel for all text channels', async () => {
139
+ it('fetches messages in parallel for all text channels', async () => {
140
140
  const manager = await setupManager(tempDir)
141
141
 
142
142
  await snapshotAction({ _credManager: manager, full: true })
@@ -146,7 +146,7 @@ describe('snapshot command', () => {
146
146
  expect(mockGetMessages).toHaveBeenCalledWith('ch2', 5)
147
147
  })
148
148
 
149
- test('respects --limit option', async () => {
149
+ it('respects --limit option', async () => {
150
150
  const manager = await setupManager(tempDir)
151
151
 
152
152
  await snapshotAction({ _credManager: manager, full: true, limit: 10 })
@@ -155,7 +155,7 @@ describe('snapshot command', () => {
155
155
  expect(mockGetMessages).toHaveBeenCalledWith('ch2', 10)
156
156
  })
157
157
 
158
- test('defaults limit to 5', async () => {
158
+ it('defaults limit to 5', async () => {
159
159
  const manager = await setupManager(tempDir)
160
160
 
161
161
  await snapshotAction({ _credManager: manager, full: true })
@@ -165,7 +165,7 @@ describe('snapshot command', () => {
165
165
  })
166
166
 
167
167
  describe('--full --channels-only', () => {
168
- test('returns only channel list without messages', async () => {
168
+ it('returns only channel list without messages', async () => {
169
169
  const manager = await setupManager(tempDir)
170
170
 
171
171
  const result = await snapshotAction({ _credManager: manager, full: true, channelsOnly: true })
@@ -179,7 +179,7 @@ describe('snapshot command', () => {
179
179
  })
180
180
 
181
181
  describe('--full --users-only', () => {
182
- test('returns only user list', async () => {
182
+ it('returns only user list', async () => {
183
183
  const manager = await setupManager(tempDir)
184
184
 
185
185
  const result = await snapshotAction({ _credManager: manager, full: true, usersOnly: true })
@@ -195,7 +195,7 @@ describe('snapshot command', () => {
195
195
  })
196
196
 
197
197
  describe('--server option', () => {
198
- test('uses explicit server ID', async () => {
198
+ it('uses explicit server ID', async () => {
199
199
  const manager = await setupManager(tempDir)
200
200
 
201
201
  const result = await snapshotAction({ _credManager: manager, server: 'other-guild' })
@@ -206,7 +206,7 @@ describe('snapshot command', () => {
206
206
  })
207
207
 
208
208
  describe('error handling', () => {
209
- test('returns error when no server set', async () => {
209
+ it('returns error when no server set', async () => {
210
210
  const manager = new DiscordBotCredentialManager(tempDir)
211
211
  await manager.setCredentials({
212
212
  token: 'token123',
@@ -219,7 +219,7 @@ describe('snapshot command', () => {
219
219
  expect(result.error).toBeDefined()
220
220
  })
221
221
 
222
- test('returns error on API failure', async () => {
222
+ it('returns error on API failure', async () => {
223
223
  mockListChannels.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
224
224
  const manager = await setupManager(tempDir)
225
225
 
@@ -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'
@@ -75,7 +75,7 @@ describe('thread commands', () => {
75
75
  })
76
76
 
77
77
  describe('createAction', () => {
78
- test('creates thread successfully', async () => {
78
+ it('creates thread successfully', async () => {
79
79
  const result = await createAction('general', 'test-thread', { _credManager: manager })
80
80
 
81
81
  expect(result.success).toBe(true)
@@ -87,7 +87,7 @@ describe('thread commands', () => {
87
87
  }
88
88
  })
89
89
 
90
- test('includes auto_archive_duration when provided', async () => {
90
+ it('includes auto_archive_duration when provided', async () => {
91
91
  const result = await createAction('general', 'test-thread', {
92
92
  _credManager: manager,
93
93
  autoArchiveDuration: '60',
@@ -98,19 +98,19 @@ describe('thread commands', () => {
98
98
  expect(mockCreateThread).toHaveBeenCalledWith('channel-456', 'test-thread', { auto_archive_duration: 60 })
99
99
  })
100
100
 
101
- test('resolves channel name', async () => {
101
+ it('resolves channel name', async () => {
102
102
  await createAction('general', 'test-thread', { _credManager: manager })
103
103
 
104
104
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
105
105
  })
106
106
 
107
- test('returns error when channel resolution fails', async () => {
107
+ it('returns error when channel resolution fails', async () => {
108
108
  const result = await createAction('nonexistent', 'test-thread', { _credManager: manager })
109
109
 
110
110
  expect(result.error).toContain('Channel not found')
111
111
  })
112
112
 
113
- test('returns error when thread creation fails', async () => {
113
+ it('returns error when thread creation fails', async () => {
114
114
  mockCreateThread.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
115
115
 
116
116
  const result = await createAction('general', 'test-thread', { _credManager: manager })
@@ -120,7 +120,7 @@ describe('thread commands', () => {
120
120
  })
121
121
 
122
122
  describe('archiveAction', () => {
123
- test('archives thread successfully', async () => {
123
+ it('archives thread successfully', async () => {
124
124
  const result = await archiveAction('thread-789', { _credManager: manager })
125
125
 
126
126
  expect(result.success).toBe(true)
@@ -128,7 +128,7 @@ describe('thread commands', () => {
128
128
  expect(mockArchiveThread).toHaveBeenCalledWith('thread-789')
129
129
  })
130
130
 
131
- test('returns error when archive fails', async () => {
131
+ it('returns error when archive fails', async () => {
132
132
  mockArchiveThread.mockImplementationOnce(() => Promise.reject(new Error('Forbidden')))
133
133
 
134
134
  const result = await archiveAction('thread-789', { _credManager: manager })
@@ -138,7 +138,7 @@ describe('thread commands', () => {
138
138
  })
139
139
 
140
140
  describe('action result structure', () => {
141
- test('createAction returns success result with thread info', async () => {
141
+ it('createAction returns success result with thread info', async () => {
142
142
  const result = await createAction('general', 'test-thread', { _credManager: manager })
143
143
 
144
144
  if (!result.error) {
@@ -152,7 +152,7 @@ describe('thread commands', () => {
152
152
  }
153
153
  })
154
154
 
155
- test('archiveAction returns success result with threadId', async () => {
155
+ it('archiveAction returns success result with threadId', async () => {
156
156
  const result = await archiveAction('thread-789', { _credManager: manager })
157
157
 
158
158
  if (!result.error) {
@@ -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'
@@ -61,7 +61,7 @@ describe('user commands', () => {
61
61
  })
62
62
 
63
63
  describe('listAction', () => {
64
- test('lists users from current server', async () => {
64
+ it('lists users from current server', async () => {
65
65
  const manager = new DiscordBotCredentialManager(tempDir)
66
66
  await manager.setCredentials({
67
67
  token: 'token123',
@@ -89,7 +89,7 @@ describe('user commands', () => {
89
89
  })
90
90
  })
91
91
 
92
- test('includes bot users in list', async () => {
92
+ it('includes bot users in list', async () => {
93
93
  const manager = new DiscordBotCredentialManager(tempDir)
94
94
  await manager.setCredentials({
95
95
  token: 'token123',
@@ -105,7 +105,7 @@ describe('user commands', () => {
105
105
  expect(botUser?.username).toBe('mybot')
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('user 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
  mockListUsers.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
124
124
 
125
125
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -138,7 +138,7 @@ describe('user commands', () => {
138
138
  })
139
139
 
140
140
  describe('infoAction', () => {
141
- test('returns user info by ID', async () => {
141
+ it('returns user info by ID', async () => {
142
142
  const manager = new DiscordBotCredentialManager(tempDir)
143
143
  await manager.setCredentials({
144
144
  token: 'token123',
@@ -155,7 +155,7 @@ describe('user commands', () => {
155
155
  expect(result.bot).toBe(false)
156
156
  })
157
157
 
158
- test('returns bot user info', async () => {
158
+ it('returns bot user info', async () => {
159
159
  const manager = new DiscordBotCredentialManager(tempDir)
160
160
  await manager.setCredentials({
161
161
  token: 'token123',
@@ -170,7 +170,7 @@ describe('user commands', () => {
170
170
  expect(result.bot).toBe(true)
171
171
  })
172
172
 
173
- test('returns error for nonexistent user', async () => {
173
+ it('returns error for nonexistent user', async () => {
174
174
  const manager = new DiscordBotCredentialManager(tempDir)
175
175
  await manager.setCredentials({
176
176
  token: 'token123',
@@ -184,7 +184,7 @@ describe('user commands', () => {
184
184
  expect(result.error).toContain('User not found')
185
185
  })
186
186
 
187
- test('handles client errors', async () => {
187
+ it('handles client errors', async () => {
188
188
  mockGetUser.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
189
189
 
190
190
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -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'
@@ -45,7 +45,7 @@ describe('whoami command', () => {
45
45
  process.env = originalEnv
46
46
  })
47
47
 
48
- test('returns auth info for current bot', async () => {
48
+ it('returns auth info for current bot', async () => {
49
49
  const manager = new DiscordBotCredentialManager(tempDir)
50
50
  await manager.setCredentials({
51
51
  token: 'bot-token-123',
@@ -63,7 +63,7 @@ describe('whoami command', () => {
63
63
  expect(result.error).toBeUndefined()
64
64
  })
65
65
 
66
- test('returns auth info for specific --bot', async () => {
66
+ it('returns auth info for specific --bot', async () => {
67
67
  const manager = new DiscordBotCredentialManager(tempDir)
68
68
  await manager.setCredentials({
69
69
  token: 'bot-token-123',
@@ -78,7 +78,7 @@ describe('whoami command', () => {
78
78
  expect(mockTestAuth).toHaveBeenCalledTimes(1)
79
79
  })
80
80
 
81
- test('returns error when client throws', async () => {
81
+ it('returns error when client throws', async () => {
82
82
  mockTestAuth.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
83
83
 
84
84
  const manager = new DiscordBotCredentialManager(tempDir)