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
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir, stat } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -50,7 +50,7 @@ describe('SlackBotCredentialManager', () => {
50
50
  })
51
51
 
52
52
  describe('load', () => {
53
- test('returns empty config when no file exists', async () => {
53
+ it('returns empty config when no file exists', async () => {
54
54
  const config = await manager.load()
55
55
 
56
56
  expect(config.current).toBeNull()
@@ -59,7 +59,7 @@ describe('SlackBotCredentialManager', () => {
59
59
  })
60
60
 
61
61
  describe('save and load', () => {
62
- test('persists config to file', async () => {
62
+ it('persists config to file', async () => {
63
63
  const config = {
64
64
  current: { workspace_id: 'T123', bot_id: 'deploy' },
65
65
  workspaces: {
@@ -81,11 +81,11 @@ describe('SlackBotCredentialManager', () => {
81
81
  })
82
82
 
83
83
  describe('getCredentials', () => {
84
- test('returns null when no credentials exist', async () => {
84
+ it('returns null when no credentials exist', async () => {
85
85
  expect(await manager.getCredentials()).toBeNull()
86
86
  })
87
87
 
88
- test('returns current bot credentials', async () => {
88
+ it('returns current bot credentials', async () => {
89
89
  await manager.setCredentials(CREDS_A)
90
90
 
91
91
  const creds = await manager.getCredentials()
@@ -93,7 +93,7 @@ describe('SlackBotCredentialManager', () => {
93
93
  expect(creds).toEqual(CREDS_A)
94
94
  })
95
95
 
96
- test('returns specific bot by id', async () => {
96
+ it('returns specific bot by id', async () => {
97
97
  await manager.setCredentials(CREDS_A)
98
98
  await manager.setCredentials(CREDS_B)
99
99
 
@@ -102,7 +102,7 @@ describe('SlackBotCredentialManager', () => {
102
102
  expect(creds).toEqual(CREDS_A)
103
103
  })
104
104
 
105
- test('returns specific bot by workspace_id/bot_id', async () => {
105
+ it('returns specific bot by workspace_id/bot_id', async () => {
106
106
  await manager.setCredentials(CREDS_A)
107
107
  await manager.setCredentials(CREDS_C)
108
108
 
@@ -111,7 +111,7 @@ describe('SlackBotCredentialManager', () => {
111
111
  expect(creds).toEqual(CREDS_A)
112
112
  })
113
113
 
114
- test('returns null for ambiguous bot_id across workspaces', async () => {
114
+ it('returns null for ambiguous bot_id across workspaces', async () => {
115
115
  await manager.setCredentials(CREDS_A)
116
116
  await manager.setCredentials(CREDS_C)
117
117
 
@@ -120,7 +120,7 @@ describe('SlackBotCredentialManager', () => {
120
120
  expect(creds).toBeNull()
121
121
  })
122
122
 
123
- test('env vars take precedence over file', async () => {
123
+ it('env vars take precedence over file', async () => {
124
124
  await manager.setCredentials(CREDS_A)
125
125
 
126
126
  process.env.E2E_SLACKBOT_TOKEN = 'xoxb-env-token'
@@ -136,7 +136,7 @@ describe('SlackBotCredentialManager', () => {
136
136
  })
137
137
 
138
138
  describe('setCredentials', () => {
139
- test('stores bot and sets as current', async () => {
139
+ it('stores bot and sets as current', async () => {
140
140
  await manager.setCredentials(CREDS_A)
141
141
 
142
142
  const config = await manager.load()
@@ -144,7 +144,7 @@ describe('SlackBotCredentialManager', () => {
144
144
  expect(config.workspaces.T123.bots.deploy.token).toBe('xoxb-token-a')
145
145
  })
146
146
 
147
- test('stores multiple bots in same workspace', async () => {
147
+ it('stores multiple bots in same workspace', async () => {
148
148
  await manager.setCredentials(CREDS_A)
149
149
  await manager.setCredentials(CREDS_B)
150
150
 
@@ -153,7 +153,7 @@ describe('SlackBotCredentialManager', () => {
153
153
  expect(config.current).toEqual({ workspace_id: 'T123', bot_id: 'alert' })
154
154
  })
155
155
 
156
- test('stores bots across workspaces', async () => {
156
+ it('stores bots across workspaces', async () => {
157
157
  await manager.setCredentials(CREDS_A)
158
158
  await manager.setCredentials(CREDS_C)
159
159
 
@@ -163,7 +163,7 @@ describe('SlackBotCredentialManager', () => {
163
163
  })
164
164
 
165
165
  describe('listAll', () => {
166
- test('returns all bots with current flag', async () => {
166
+ it('returns all bots with current flag', async () => {
167
167
  await manager.setCredentials(CREDS_A)
168
168
  await manager.setCredentials(CREDS_B)
169
169
 
@@ -176,7 +176,7 @@ describe('SlackBotCredentialManager', () => {
176
176
  })
177
177
 
178
178
  describe('setCurrent', () => {
179
- test('switches current bot', async () => {
179
+ it('switches current bot', async () => {
180
180
  await manager.setCredentials(CREDS_A)
181
181
  await manager.setCredentials(CREDS_B)
182
182
 
@@ -187,13 +187,13 @@ describe('SlackBotCredentialManager', () => {
187
187
  expect(creds?.bot_id).toBe('deploy')
188
188
  })
189
189
 
190
- test('returns false for unknown bot', async () => {
190
+ it('returns false for unknown bot', async () => {
191
191
  expect(await manager.setCurrent('nonexistent')).toBe(false)
192
192
  })
193
193
  })
194
194
 
195
195
  describe('removeBot', () => {
196
- test('removes a bot by id', async () => {
196
+ it('removes a bot by id', async () => {
197
197
  await manager.setCredentials(CREDS_A)
198
198
  await manager.setCredentials(CREDS_B)
199
199
 
@@ -204,7 +204,7 @@ describe('SlackBotCredentialManager', () => {
204
204
  expect(Object.keys(config.workspaces.T123.bots)).toEqual(['alert'])
205
205
  })
206
206
 
207
- test('removes workspace when last bot removed', async () => {
207
+ it('removes workspace when last bot removed', async () => {
208
208
  await manager.setCredentials(CREDS_A)
209
209
 
210
210
  await manager.removeBot('deploy')
@@ -213,7 +213,7 @@ describe('SlackBotCredentialManager', () => {
213
213
  expect(config.workspaces.T123).toBeUndefined()
214
214
  })
215
215
 
216
- test('clears current when current bot removed', async () => {
216
+ it('clears current when current bot removed', async () => {
217
217
  await manager.setCredentials(CREDS_A)
218
218
 
219
219
  await manager.removeBot('deploy')
@@ -222,11 +222,11 @@ describe('SlackBotCredentialManager', () => {
222
222
  expect(config.current).toBeNull()
223
223
  })
224
224
 
225
- test('returns false for unknown bot', async () => {
225
+ it('returns false for unknown bot', async () => {
226
226
  expect(await manager.removeBot('nonexistent')).toBe(false)
227
227
  })
228
228
 
229
- test('returns false for ambiguous bot_id across workspaces', async () => {
229
+ it('returns false for ambiguous bot_id across workspaces', async () => {
230
230
  await manager.setCredentials(CREDS_A)
231
231
  await manager.setCredentials(CREDS_C)
232
232
 
@@ -240,7 +240,7 @@ describe('SlackBotCredentialManager', () => {
240
240
  })
241
241
 
242
242
  describe('clearCredentials', () => {
243
- test('removes all credentials', async () => {
243
+ it('removes all credentials', async () => {
244
244
  await manager.setCredentials(CREDS_A)
245
245
  await manager.setCredentials(CREDS_B)
246
246
 
@@ -253,7 +253,7 @@ describe('SlackBotCredentialManager', () => {
253
253
  })
254
254
 
255
255
  describe('file permissions', () => {
256
- test('saves file with secure permissions (600)', async () => {
256
+ it('saves file with secure permissions (600)', async () => {
257
257
  await manager.setCredentials(CREDS_A)
258
258
 
259
259
  const credPath = join(tempDir, 'slackbot-credentials.json')
@@ -1,4 +1,4 @@
1
- import { describe, expect, test } from 'bun:test'
1
+ import { describe, expect, it } from 'bun:test'
2
2
 
3
3
  import {
4
4
  type SlackBotConfig,
@@ -9,7 +9,7 @@ import {
9
9
  } from './types'
10
10
 
11
11
  describe('SlackBotError', () => {
12
- test('creates error with message and code', () => {
12
+ it('creates error with message and code', () => {
13
13
  const error = new SlackBotError('Token is invalid', 'invalid_auth')
14
14
 
15
15
  expect(error.message).toBe('Token is invalid')
@@ -20,7 +20,7 @@ describe('SlackBotError', () => {
20
20
  })
21
21
 
22
22
  describe('SlackBotCredentialsSchema', () => {
23
- test('validates correct bot token credentials', () => {
23
+ it('validates correct bot token credentials', () => {
24
24
  const creds: SlackBotCredentials = {
25
25
  token: 'xoxb-123456789-abcdef',
26
26
  workspace_id: 'T12345678',
@@ -33,7 +33,7 @@ describe('SlackBotCredentialsSchema', () => {
33
33
  expect(result.success).toBe(true)
34
34
  })
35
35
 
36
- test('rejects user tokens (xoxp-)', () => {
36
+ it('rejects user tokens (xoxp-)', () => {
37
37
  const creds = {
38
38
  token: 'xoxp-123456789-abcdef',
39
39
  workspace_id: 'T12345678',
@@ -46,7 +46,7 @@ describe('SlackBotCredentialsSchema', () => {
46
46
  expect(result.success).toBe(false)
47
47
  })
48
48
 
49
- test('rejects missing fields', () => {
49
+ it('rejects missing fields', () => {
50
50
  const creds = {
51
51
  token: 'xoxb-123456789-abcdef',
52
52
  }
@@ -57,7 +57,7 @@ describe('SlackBotCredentialsSchema', () => {
57
57
  })
58
58
 
59
59
  describe('SlackBotConfigSchema', () => {
60
- test('validates correct config', () => {
60
+ it('validates correct config', () => {
61
61
  const config: SlackBotConfig = {
62
62
  current: { workspace_id: 'T12345678', bot_id: 'deploy' },
63
63
  workspaces: {
@@ -79,7 +79,7 @@ describe('SlackBotConfigSchema', () => {
79
79
  expect(result.success).toBe(true)
80
80
  })
81
81
 
82
- test('validates config with null current', () => {
82
+ it('validates config with null current', () => {
83
83
  const config: SlackBotConfig = {
84
84
  current: null,
85
85
  workspaces: {},
@@ -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
  import { unlinkSync } from 'node:fs'
3
3
 
4
4
  import { TeamsClient } from './client'
@@ -54,17 +54,17 @@ describe('TeamsClient', () => {
54
54
  }
55
55
 
56
56
  describe('login', () => {
57
- test('requires token', async () => {
57
+ it('requires token', async () => {
58
58
  await expect(new TeamsClient().login({ token: '', region: 'emea' })).rejects.toThrow(TeamsError)
59
59
  await expect(new TeamsClient().login({ token: '', region: 'emea' })).rejects.toThrow('Token is required')
60
60
  })
61
61
 
62
- test('accepts valid token', async () => {
62
+ it('accepts valid token', async () => {
63
63
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
64
64
  expect(client).toBeInstanceOf(TeamsClient)
65
65
  })
66
66
 
67
- test('accepts token with expiry time', async () => {
67
+ it('accepts token with expiry time', async () => {
68
68
  const expiresAt = new Date(Date.now() + 3600000).toISOString()
69
69
  const client = await new TeamsClient().login({ token: 'test-token', tokenExpiresAt: expiresAt, region: 'emea' })
70
70
  expect(client).toBeInstanceOf(TeamsClient)
@@ -72,7 +72,7 @@ describe('TeamsClient', () => {
72
72
  })
73
73
 
74
74
  describe('token expiry', () => {
75
- test('throws when token is expired', async () => {
75
+ it('throws when token is expired', async () => {
76
76
  const expiredAt = new Date(Date.now() - 1000).toISOString()
77
77
  const client = await new TeamsClient().login({
78
78
  token: 'expired-token',
@@ -84,7 +84,7 @@ describe('TeamsClient', () => {
84
84
  await expect(client.testAuth()).rejects.toThrow('Token has expired')
85
85
  })
86
86
 
87
- test('works when token is not expired', async () => {
87
+ it('works when token is not expired', async () => {
88
88
  const expiresAt = new Date(Date.now() + 3600000).toISOString()
89
89
  mockResponse({
90
90
  userDetails: JSON.stringify({ name: 'Test User' }),
@@ -100,7 +100,7 @@ describe('TeamsClient', () => {
100
100
  })
101
101
 
102
102
  describe('testAuth', () => {
103
- test('returns current user info', async () => {
103
+ it('returns current user info', async () => {
104
104
  mockResponse({
105
105
  userDetails: JSON.stringify({ name: 'Test User' }),
106
106
  locale: 'en-us',
@@ -118,7 +118,7 @@ describe('TeamsClient', () => {
118
118
  })
119
119
  })
120
120
 
121
- test('throws TeamsError on API error', async () => {
121
+ it('throws TeamsError on API error', async () => {
122
122
  mockResponse({ message: 'Unauthorized', code: 'unauthorized' }, 401)
123
123
 
124
124
  const client = await new TeamsClient().login({ token: 'bad-token', region: 'emea' })
@@ -127,7 +127,7 @@ describe('TeamsClient', () => {
127
127
  })
128
128
 
129
129
  describe('listTeams', () => {
130
- test('returns list of teams from conversations', async () => {
130
+ it('returns list of teams from conversations', async () => {
131
131
  mockResponse({
132
132
  conversations: [
133
133
  {
@@ -170,7 +170,7 @@ describe('TeamsClient', () => {
170
170
  })
171
171
 
172
172
  describe('getTeam', () => {
173
- test('returns team info', async () => {
173
+ it('returns team info', async () => {
174
174
  mockResponse({ id: '111', name: 'Test Team', description: 'A test team' })
175
175
 
176
176
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
@@ -183,7 +183,7 @@ describe('TeamsClient', () => {
183
183
  })
184
184
 
185
185
  describe('listChannels', () => {
186
- test('returns list of channels for team', async () => {
186
+ it('returns list of channels for team', async () => {
187
187
  mockResponse([
188
188
  { id: 'ch1', team_id: '111', name: 'General', type: 'standard' },
189
189
  { id: 'ch2', team_id: '111', name: 'Random', type: 'standard' },
@@ -199,7 +199,7 @@ describe('TeamsClient', () => {
199
199
  })
200
200
 
201
201
  describe('getChannel', () => {
202
- test('returns channel info', async () => {
202
+ it('returns channel info', async () => {
203
203
  mockResponse({ id: 'ch1', team_id: '111', name: 'General', type: 'standard' })
204
204
 
205
205
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
@@ -212,7 +212,7 @@ describe('TeamsClient', () => {
212
212
  })
213
213
 
214
214
  describe('sendMessage', () => {
215
- test('sends message to channel', async () => {
215
+ it('sends message to channel', async () => {
216
216
  mockResponse({
217
217
  id: 'msg1',
218
218
  channel_id: 'ch1',
@@ -232,7 +232,7 @@ describe('TeamsClient', () => {
232
232
  })
233
233
 
234
234
  describe('getMessages', () => {
235
- test('returns messages from channel', async () => {
235
+ it('returns messages from channel', async () => {
236
236
  mockResponse([
237
237
  {
238
238
  id: 'msg1',
@@ -253,7 +253,7 @@ describe('TeamsClient', () => {
253
253
  )
254
254
  })
255
255
 
256
- test('uses default limit of 50', async () => {
256
+ it('uses default limit of 50', async () => {
257
257
  mockResponse([])
258
258
 
259
259
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
@@ -266,7 +266,7 @@ describe('TeamsClient', () => {
266
266
  })
267
267
 
268
268
  describe('getMessage', () => {
269
- test('returns single message', async () => {
269
+ it('returns single message', async () => {
270
270
  mockResponse({
271
271
  id: 'msg1',
272
272
  channel_id: 'ch1',
@@ -286,7 +286,7 @@ describe('TeamsClient', () => {
286
286
  })
287
287
 
288
288
  describe('deleteMessage', () => {
289
- test('deletes message', async () => {
289
+ it('deletes message', async () => {
290
290
  mockResponse(null, 204)
291
291
 
292
292
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
@@ -300,7 +300,7 @@ describe('TeamsClient', () => {
300
300
  })
301
301
 
302
302
  describe('addReaction', () => {
303
- test('adds reaction to message', async () => {
303
+ it('adds reaction to message', async () => {
304
304
  mockResponse(null, 204)
305
305
 
306
306
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
@@ -315,7 +315,7 @@ describe('TeamsClient', () => {
315
315
  })
316
316
 
317
317
  describe('removeReaction', () => {
318
- test('removes reaction from message', async () => {
318
+ it('removes reaction from message', async () => {
319
319
  mockResponse(null, 204)
320
320
 
321
321
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
@@ -329,7 +329,7 @@ describe('TeamsClient', () => {
329
329
  })
330
330
 
331
331
  describe('listUsers', () => {
332
- test('returns list of team members', async () => {
332
+ it('returns list of team members', async () => {
333
333
  mockResponse([
334
334
  { id: 'u1', displayName: 'User 1', email: 'user1@example.com' },
335
335
  { id: 'u2', displayName: 'User 2', email: 'user2@example.com' },
@@ -345,7 +345,7 @@ describe('TeamsClient', () => {
345
345
  })
346
346
 
347
347
  describe('getUser', () => {
348
- test('returns user info', async () => {
348
+ it('returns user info', async () => {
349
349
  mockResponse({ id: 'u1', displayName: 'Test User', email: 'test@example.com' })
350
350
 
351
351
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
@@ -358,7 +358,7 @@ describe('TeamsClient', () => {
358
358
  })
359
359
 
360
360
  describe('uploadFile', () => {
361
- test('uploads file to channel', async () => {
361
+ it('uploads file to channel', async () => {
362
362
  const tempFile = '/tmp/test-teams-upload.txt'
363
363
  await Bun.write(tempFile, 'test content')
364
364
 
@@ -379,7 +379,7 @@ describe('TeamsClient', () => {
379
379
  })
380
380
 
381
381
  describe('listFiles', () => {
382
- test('returns files from channel', async () => {
382
+ it('returns files from channel', async () => {
383
383
  mockResponse([
384
384
  { id: 'file1', name: 'doc.pdf', size: 1024, url: 'https://example.com/doc.pdf' },
385
385
  { id: 'file2', name: 'image.png', size: 2048, url: 'https://example.com/image.png' },
@@ -395,7 +395,7 @@ describe('TeamsClient', () => {
395
395
  })
396
396
 
397
397
  describe('rate limiting', () => {
398
- test('waits when bucket is exhausted before making request', async () => {
398
+ it('waits when bucket is exhausted before making request', async () => {
399
399
  mockResponse({ userDetails: JSON.stringify({ name: 'User 1' }), locale: 'en-us' }, 200, {
400
400
  'X-RateLimit-Remaining': '0',
401
401
  'X-RateLimit-Reset': String(Date.now() / 1000 + 0.1),
@@ -416,7 +416,7 @@ describe('TeamsClient', () => {
416
416
  expect(fetchCalls.length).toBe(2)
417
417
  })
418
418
 
419
- test('retries on 429 with Retry-After header', async () => {
419
+ it('retries on 429 with Retry-After header', async () => {
420
420
  mockResponse({ message: 'Rate limited' }, 429, { 'Retry-After': '0.1' })
421
421
  mockResponse({ userDetails: JSON.stringify({ name: 'User' }), locale: 'en-us' })
422
422
 
@@ -427,7 +427,7 @@ describe('TeamsClient', () => {
427
427
  expect(fetchCalls.length).toBe(2)
428
428
  })
429
429
 
430
- test('throws after max retries exceeded', async () => {
430
+ it('throws after max retries exceeded', async () => {
431
431
  for (let i = 0; i <= 3; i++) {
432
432
  mockResponse({ message: 'Rate limited' }, 429, { 'Retry-After': '0.01' })
433
433
  }
@@ -439,7 +439,7 @@ describe('TeamsClient', () => {
439
439
  })
440
440
 
441
441
  describe('retry logic', () => {
442
- test('retries on 500 server error', async () => {
442
+ it('retries on 500 server error', async () => {
443
443
  mockResponse({ message: 'Internal Server Error' }, 500)
444
444
  mockResponse({ userDetails: JSON.stringify({ name: 'User' }), locale: 'en-us' })
445
445
 
@@ -450,7 +450,7 @@ describe('TeamsClient', () => {
450
450
  expect(fetchCalls.length).toBe(2)
451
451
  })
452
452
 
453
- test('does not retry on 4xx client errors (except 429)', async () => {
453
+ it('does not retry on 4xx client errors (except 429)', async () => {
454
454
  mockResponse({ message: 'Not Found' }, 404)
455
455
 
456
456
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
@@ -458,7 +458,7 @@ describe('TeamsClient', () => {
458
458
  expect(fetchCalls.length).toBe(1)
459
459
  })
460
460
 
461
- test('exponential backoff increases delay', async () => {
461
+ it('exponential backoff increases delay', async () => {
462
462
  mockResponse({ message: 'Error' }, 500)
463
463
  mockResponse({ message: 'Error' }, 500)
464
464
  mockResponse({ userDetails: JSON.stringify({ name: 'User' }), locale: 'en-us' })
@@ -474,7 +474,7 @@ describe('TeamsClient', () => {
474
474
  })
475
475
 
476
476
  describe('bucket key normalization', () => {
477
- test('normalizes team and channel IDs in routes', async () => {
477
+ it('normalizes team and channel IDs in routes', async () => {
478
478
  mockResponse([])
479
479
  mockResponse([])
480
480
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, spyOn, it } from 'bun:test'
2
2
 
3
3
  import { TeamsClient } from '../client'
4
4
  import { TeamsCredentialManager } from '../credential-manager'
@@ -54,7 +54,7 @@ afterEach(() => {
54
54
  clientGetRegionSpy?.mockRestore()
55
55
  })
56
56
 
57
- test('extract: calls TeamsTokenExtractor', async () => {
57
+ it('extract: calls TeamsTokenExtractor', async () => {
58
58
  const extractor = new TeamsTokenExtractor()
59
59
  const result = await extractor.extract()
60
60
  expect(result).toHaveLength(1)
@@ -62,7 +62,7 @@ test('extract: calls TeamsTokenExtractor', async () => {
62
62
  expect(result[0].accountType).toBe('work')
63
63
  })
64
64
 
65
- test('extract: validates token with TeamsClient', async () => {
65
+ it('extract: validates token with TeamsClient', async () => {
66
66
  const client = await new TeamsClient().login({ token: 'test-skype-token-123', region: 'emea' })
67
67
  const authInfo = await client.testAuth()
68
68
  expect(authInfo).toBeDefined()
@@ -70,31 +70,31 @@ test('extract: validates token with TeamsClient', async () => {
70
70
  expect(authInfo.displayName).toBe('Test User')
71
71
  })
72
72
 
73
- test('extract: discovers teams', async () => {
73
+ it('extract: discovers teams', async () => {
74
74
  const client = await new TeamsClient().login({ token: 'test-skype-token-123', region: 'emea' })
75
75
  const teams = await client.listTeams()
76
76
  expect(teams).toHaveLength(2)
77
77
  expect(teams[0].id).toBe('team-1')
78
78
  })
79
79
 
80
- test('logout: clears credentials', async () => {
80
+ it('logout: clears credentials', async () => {
81
81
  const credManager = new TeamsCredentialManager()
82
82
  await credManager.clearCredentials()
83
83
  expect(credManager.clearCredentials).toHaveBeenCalled()
84
84
  })
85
85
 
86
- test('status: returns auth state when not authenticated', async () => {
86
+ it('status: returns auth state when not authenticated', async () => {
87
87
  const credManager = new TeamsCredentialManager()
88
88
  const config = await credManager.loadConfig()
89
89
  expect(config).toBeNull()
90
90
  })
91
91
 
92
- test('status: checks token expiry', async () => {
92
+ it('status: checks token expiry', async () => {
93
93
  const credManager = new TeamsCredentialManager()
94
94
  const isExpired = await credManager.isTokenExpired()
95
95
  expect(isExpired).toBe(false)
96
96
  })
97
97
 
98
- test('no-token message mentions desktop app and browser fallback', () => {
98
+ it('no-token message mentions desktop app and browser fallback', () => {
99
99
  expect(getNoTeamsTokenFoundMessage()).toContain('desktop app or a supported Chromium browser')
100
100
  })
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, spyOn, it } from 'bun:test'
2
2
 
3
3
  import { TeamsClient } from '../client'
4
4
  import { TeamsCredentialManager } from '../credential-manager'
@@ -65,7 +65,7 @@ afterEach(() => {
65
65
  credManagerLoadConfigSpy?.mockRestore()
66
66
  })
67
67
 
68
- test('list: returns channels from team', async () => {
68
+ it('list: returns channels from team', async () => {
69
69
  // given
70
70
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
71
71
 
@@ -78,7 +78,7 @@ test('list: returns channels from team', async () => {
78
78
  expect(channels[1].name).toBe('Announcements')
79
79
  })
80
80
 
81
- test('list: includes channel metadata', async () => {
81
+ it('list: includes channel metadata', async () => {
82
82
  // given
83
83
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
84
84
  const channels = await client.listChannels('team-1')
@@ -93,7 +93,7 @@ test('list: includes channel metadata', async () => {
93
93
  expect(channel.team_id).toBe('team-1')
94
94
  })
95
95
 
96
- test('info: returns channel details', async () => {
96
+ it('info: returns channel details', async () => {
97
97
  // given
98
98
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
99
99
 
@@ -106,7 +106,7 @@ test('info: returns channel details', async () => {
106
106
  expect(channel.type).toBe('standard')
107
107
  })
108
108
 
109
- test('info: throws error for non-existent channel', async () => {
109
+ it('info: throws error for non-existent channel', async () => {
110
110
  // given
111
111
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
112
112
 
@@ -119,7 +119,7 @@ test('info: throws error for non-existent channel', async () => {
119
119
  }
120
120
  })
121
121
 
122
- test('history: returns messages', async () => {
122
+ it('history: returns messages', async () => {
123
123
  // given
124
124
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
125
125
 
@@ -134,7 +134,7 @@ test('history: returns messages', async () => {
134
134
  expect(messages[1].author.displayName).toBe('Bob')
135
135
  })
136
136
 
137
- test('history: includes message metadata', async () => {
137
+ it('history: includes message metadata', async () => {
138
138
  // given
139
139
  const client = await new TeamsClient().login({ token: 'test-token', region: 'emea' })
140
140
  const messages = await client.getMessages('team-1', 'ch-1', 50)
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  import { TeamsClient } from '../client'
4
4
  import { TeamsCredentialManager } from '../credential-manager'
@@ -55,7 +55,7 @@ afterEach(() => {
55
55
  console.log = originalConsoleLog
56
56
  })
57
57
 
58
- test('upload: sends multipart request and returns file info', async () => {
58
+ it('upload: sends multipart request and returns file info', async () => {
59
59
  const consoleSpy = mock((_msg: string) => {})
60
60
  console.log = consoleSpy
61
61
 
@@ -67,7 +67,7 @@ test('upload: sends multipart request and returns file info', async () => {
67
67
  expect(output).toContain('test.pdf')
68
68
  })
69
69
 
70
- test('list: returns files in channel', async () => {
70
+ it('list: returns files in channel', async () => {
71
71
  const consoleSpy = mock((_msg: string) => {})
72
72
  console.log = consoleSpy
73
73
 
@@ -79,7 +79,7 @@ test('list: returns files in channel', async () => {
79
79
  expect(output).toContain('file_124')
80
80
  })
81
81
 
82
- test('info: returns single file details', async () => {
82
+ it('info: returns single file details', async () => {
83
83
  const consoleSpy = mock((_msg: string) => {})
84
84
  console.log = consoleSpy
85
85