agent-messenger 2.10.1 → 2.11.0

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 (536) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.env.template +4 -1
  3. package/README.md +77 -27
  4. package/bun.lock +26 -0
  5. package/dist/package.json +14 -1
  6. package/dist/src/platforms/channeltalk/commands/auth.d.ts +2 -1
  7. package/dist/src/platforms/channeltalk/commands/auth.d.ts.map +1 -1
  8. package/dist/src/platforms/channeltalk/commands/auth.js +5 -3
  9. package/dist/src/platforms/channeltalk/commands/auth.js.map +1 -1
  10. package/dist/src/platforms/channeltalk/token-extractor.d.ts +2 -1
  11. package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
  12. package/dist/src/platforms/channeltalk/token-extractor.js +22 -6
  13. package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
  14. package/dist/src/platforms/channeltalkbot/cli.d.ts.map +1 -1
  15. package/dist/src/platforms/channeltalkbot/cli.js +11 -1
  16. package/dist/src/platforms/channeltalkbot/cli.js.map +1 -1
  17. package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
  18. package/dist/src/platforms/channeltalkbot/commands/auth.js +1 -5
  19. package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
  20. package/dist/src/platforms/channeltalkbot/commands/bot.d.ts.map +1 -1
  21. package/dist/src/platforms/channeltalkbot/commands/bot.js +1 -6
  22. package/dist/src/platforms/channeltalkbot/commands/bot.js.map +1 -1
  23. package/dist/src/platforms/channeltalkbot/commands/chat.d.ts.map +1 -1
  24. package/dist/src/platforms/channeltalkbot/commands/chat.js +1 -6
  25. package/dist/src/platforms/channeltalkbot/commands/chat.js.map +1 -1
  26. package/dist/src/platforms/channeltalkbot/commands/group.d.ts.map +1 -1
  27. package/dist/src/platforms/channeltalkbot/commands/group.js +1 -6
  28. package/dist/src/platforms/channeltalkbot/commands/group.js.map +1 -1
  29. package/dist/src/platforms/channeltalkbot/commands/manager.d.ts.map +1 -1
  30. package/dist/src/platforms/channeltalkbot/commands/manager.js +1 -6
  31. package/dist/src/platforms/channeltalkbot/commands/manager.js.map +1 -1
  32. package/dist/src/platforms/channeltalkbot/commands/message.d.ts.map +1 -1
  33. package/dist/src/platforms/channeltalkbot/commands/message.js +1 -6
  34. package/dist/src/platforms/channeltalkbot/commands/message.js.map +1 -1
  35. package/dist/src/platforms/channeltalkbot/commands/whoami.d.ts.map +1 -1
  36. package/dist/src/platforms/channeltalkbot/commands/whoami.js +1 -6
  37. package/dist/src/platforms/channeltalkbot/commands/whoami.js.map +1 -1
  38. package/dist/src/platforms/channeltalkbot/credential-manager.d.ts +5 -0
  39. package/dist/src/platforms/channeltalkbot/credential-manager.d.ts.map +1 -1
  40. package/dist/src/platforms/channeltalkbot/credential-manager.js +34 -4
  41. package/dist/src/platforms/channeltalkbot/credential-manager.js.map +1 -1
  42. package/dist/src/platforms/discord/commands/auth.d.ts +1 -0
  43. package/dist/src/platforms/discord/commands/auth.d.ts.map +1 -1
  44. package/dist/src/platforms/discord/commands/auth.js +3 -1
  45. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  46. package/dist/src/platforms/discord/listener.d.ts +2 -0
  47. package/dist/src/platforms/discord/listener.d.ts.map +1 -1
  48. package/dist/src/platforms/discord/listener.js +51 -21
  49. package/dist/src/platforms/discord/listener.js.map +1 -1
  50. package/dist/src/platforms/discord/token-extractor.d.ts +2 -1
  51. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  52. package/dist/src/platforms/discord/token-extractor.js +21 -6
  53. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  54. package/dist/src/platforms/discordbot/cli.d.ts.map +1 -1
  55. package/dist/src/platforms/discordbot/cli.js +12 -1
  56. package/dist/src/platforms/discordbot/cli.js.map +1 -1
  57. package/dist/src/platforms/discordbot/client.d.ts +3 -0
  58. package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
  59. package/dist/src/platforms/discordbot/client.js +3 -0
  60. package/dist/src/platforms/discordbot/client.js.map +1 -1
  61. package/dist/src/platforms/discordbot/commands/auth.d.ts.map +1 -1
  62. package/dist/src/platforms/discordbot/commands/auth.js +1 -5
  63. package/dist/src/platforms/discordbot/commands/auth.js.map +1 -1
  64. package/dist/src/platforms/discordbot/commands/message.d.ts.map +1 -1
  65. package/dist/src/platforms/discordbot/commands/message.js +1 -6
  66. package/dist/src/platforms/discordbot/commands/message.js.map +1 -1
  67. package/dist/src/platforms/discordbot/commands/server.d.ts.map +1 -1
  68. package/dist/src/platforms/discordbot/commands/server.js +1 -4
  69. package/dist/src/platforms/discordbot/commands/server.js.map +1 -1
  70. package/dist/src/platforms/discordbot/commands/whoami.d.ts.map +1 -1
  71. package/dist/src/platforms/discordbot/commands/whoami.js +1 -6
  72. package/dist/src/platforms/discordbot/commands/whoami.js.map +1 -1
  73. package/dist/src/platforms/discordbot/index.d.ts +3 -1
  74. package/dist/src/platforms/discordbot/index.d.ts.map +1 -1
  75. package/dist/src/platforms/discordbot/index.js +2 -1
  76. package/dist/src/platforms/discordbot/index.js.map +1 -1
  77. package/dist/src/platforms/discordbot/listener.d.ts +43 -0
  78. package/dist/src/platforms/discordbot/listener.d.ts.map +1 -0
  79. package/dist/src/platforms/discordbot/listener.js +292 -0
  80. package/dist/src/platforms/discordbot/listener.js.map +1 -0
  81. package/dist/src/platforms/discordbot/types.d.ts +161 -0
  82. package/dist/src/platforms/discordbot/types.d.ts.map +1 -1
  83. package/dist/src/platforms/discordbot/types.js +34 -0
  84. package/dist/src/platforms/discordbot/types.js.map +1 -1
  85. package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
  86. package/dist/src/platforms/instagram/commands/auth.js +3 -1
  87. package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
  88. package/dist/src/platforms/instagram/token-extractor.d.ts +2 -1
  89. package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
  90. package/dist/src/platforms/instagram/token-extractor.js +11 -2
  91. package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
  92. package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -1
  93. package/dist/src/platforms/slack/commands/auth.js +4 -2
  94. package/dist/src/platforms/slack/commands/auth.js.map +1 -1
  95. package/dist/src/platforms/slack/token-extractor.d.ts +4 -1
  96. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  97. package/dist/src/platforms/slack/token-extractor.js +64 -15
  98. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  99. package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
  100. package/dist/src/platforms/slackbot/cli.js +15 -3
  101. package/dist/src/platforms/slackbot/cli.js.map +1 -1
  102. package/dist/src/platforms/slackbot/client.d.ts +22 -1
  103. package/dist/src/platforms/slackbot/client.d.ts.map +1 -1
  104. package/dist/src/platforms/slackbot/client.js +104 -1
  105. package/dist/src/platforms/slackbot/client.js.map +1 -1
  106. package/dist/src/platforms/slackbot/commands/auth.d.ts.map +1 -1
  107. package/dist/src/platforms/slackbot/commands/auth.js +1 -5
  108. package/dist/src/platforms/slackbot/commands/auth.js.map +1 -1
  109. package/dist/src/platforms/slackbot/commands/file.d.ts +3 -0
  110. package/dist/src/platforms/slackbot/commands/file.d.ts.map +1 -0
  111. package/dist/src/platforms/slackbot/commands/file.js +164 -0
  112. package/dist/src/platforms/slackbot/commands/file.js.map +1 -0
  113. package/dist/src/platforms/slackbot/commands/index.d.ts +1 -0
  114. package/dist/src/platforms/slackbot/commands/index.d.ts.map +1 -1
  115. package/dist/src/platforms/slackbot/commands/index.js +1 -0
  116. package/dist/src/platforms/slackbot/commands/index.js.map +1 -1
  117. package/dist/src/platforms/slackbot/commands/message.d.ts.map +1 -1
  118. package/dist/src/platforms/slackbot/commands/message.js +19 -0
  119. package/dist/src/platforms/slackbot/commands/message.js.map +1 -1
  120. package/dist/src/platforms/slackbot/commands/whoami.d.ts.map +1 -1
  121. package/dist/src/platforms/slackbot/commands/whoami.js +1 -6
  122. package/dist/src/platforms/slackbot/commands/whoami.js.map +1 -1
  123. package/dist/src/platforms/slackbot/credential-manager.d.ts +1 -0
  124. package/dist/src/platforms/slackbot/credential-manager.d.ts.map +1 -1
  125. package/dist/src/platforms/slackbot/credential-manager.js +30 -2
  126. package/dist/src/platforms/slackbot/credential-manager.js.map +1 -1
  127. package/dist/src/platforms/slackbot/index.d.ts +4 -1
  128. package/dist/src/platforms/slackbot/index.d.ts.map +1 -1
  129. package/dist/src/platforms/slackbot/index.js +1 -0
  130. package/dist/src/platforms/slackbot/index.js.map +1 -1
  131. package/dist/src/platforms/slackbot/listener.d.ts +44 -0
  132. package/dist/src/platforms/slackbot/listener.d.ts.map +1 -0
  133. package/dist/src/platforms/slackbot/listener.js +313 -0
  134. package/dist/src/platforms/slackbot/listener.js.map +1 -0
  135. package/dist/src/platforms/slackbot/types.d.ts +196 -1
  136. package/dist/src/platforms/slackbot/types.d.ts.map +1 -1
  137. package/dist/src/platforms/slackbot/types.js +4 -1
  138. package/dist/src/platforms/slackbot/types.js.map +1 -1
  139. package/dist/src/platforms/teams/commands/auth.d.ts +1 -0
  140. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  141. package/dist/src/platforms/teams/commands/auth.js +37 -6
  142. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  143. package/dist/src/platforms/teams/ensure-auth.js +31 -9
  144. package/dist/src/platforms/teams/ensure-auth.js.map +1 -1
  145. package/dist/src/platforms/teams/token-extractor.d.ts +4 -1
  146. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  147. package/dist/src/platforms/teams/token-extractor.js +80 -31
  148. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  149. package/dist/src/platforms/webex/commands/auth.d.ts +1 -0
  150. package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
  151. package/dist/src/platforms/webex/commands/auth.js +3 -1
  152. package/dist/src/platforms/webex/commands/auth.js.map +1 -1
  153. package/dist/src/platforms/webex/token-extractor.d.ts +3 -1
  154. package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
  155. package/dist/src/platforms/webex/token-extractor.js +16 -2
  156. package/dist/src/platforms/webex/token-extractor.js.map +1 -1
  157. package/dist/src/platforms/wechatbot/cli.d.ts.map +1 -1
  158. package/dist/src/platforms/wechatbot/cli.js +11 -1
  159. package/dist/src/platforms/wechatbot/cli.js.map +1 -1
  160. package/dist/src/platforms/wechatbot/commands/auth.d.ts.map +1 -1
  161. package/dist/src/platforms/wechatbot/commands/auth.js +1 -5
  162. package/dist/src/platforms/wechatbot/commands/auth.js.map +1 -1
  163. package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
  164. package/dist/src/platforms/wechatbot/commands/message.js +1 -6
  165. package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
  166. package/dist/src/platforms/wechatbot/commands/template.d.ts.map +1 -1
  167. package/dist/src/platforms/wechatbot/commands/template.js +1 -6
  168. package/dist/src/platforms/wechatbot/commands/template.js.map +1 -1
  169. package/dist/src/platforms/wechatbot/commands/user.d.ts.map +1 -1
  170. package/dist/src/platforms/wechatbot/commands/user.js +1 -6
  171. package/dist/src/platforms/wechatbot/commands/user.js.map +1 -1
  172. package/dist/src/platforms/wechatbot/commands/whoami.d.ts.map +1 -1
  173. package/dist/src/platforms/wechatbot/commands/whoami.js +1 -6
  174. package/dist/src/platforms/wechatbot/commands/whoami.js.map +1 -1
  175. package/dist/src/platforms/whatsappbot/cli.d.ts.map +1 -1
  176. package/dist/src/platforms/whatsappbot/cli.js +11 -1
  177. package/dist/src/platforms/whatsappbot/cli.js.map +1 -1
  178. package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
  179. package/dist/src/platforms/whatsappbot/commands/auth.js +1 -5
  180. package/dist/src/platforms/whatsappbot/commands/auth.js.map +1 -1
  181. package/dist/src/platforms/whatsappbot/commands/message.d.ts.map +1 -1
  182. package/dist/src/platforms/whatsappbot/commands/message.js +1 -6
  183. package/dist/src/platforms/whatsappbot/commands/message.js.map +1 -1
  184. package/dist/src/platforms/whatsappbot/commands/template.d.ts.map +1 -1
  185. package/dist/src/platforms/whatsappbot/commands/template.js +1 -6
  186. package/dist/src/platforms/whatsappbot/commands/template.js.map +1 -1
  187. package/dist/src/platforms/whatsappbot/commands/whoami.d.ts.map +1 -1
  188. package/dist/src/platforms/whatsappbot/commands/whoami.js +1 -6
  189. package/dist/src/platforms/whatsappbot/commands/whoami.js.map +1 -1
  190. package/dist/src/shared/chromium/browsers.d.ts +8 -0
  191. package/dist/src/shared/chromium/browsers.d.ts.map +1 -1
  192. package/dist/src/shared/chromium/browsers.js +58 -3
  193. package/dist/src/shared/chromium/browsers.js.map +1 -1
  194. package/dist/src/shared/chromium/cli-options.d.ts +5 -0
  195. package/dist/src/shared/chromium/cli-options.d.ts.map +1 -0
  196. package/dist/src/shared/chromium/cli-options.js +8 -0
  197. package/dist/src/shared/chromium/cli-options.js.map +1 -0
  198. package/dist/src/shared/chromium/decryptor.d.ts +6 -0
  199. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
  200. package/dist/src/shared/chromium/decryptor.js +26 -6
  201. package/dist/src/shared/chromium/decryptor.js.map +1 -1
  202. package/dist/src/shared/chromium/index.d.ts +3 -1
  203. package/dist/src/shared/chromium/index.d.ts.map +1 -1
  204. package/dist/src/shared/chromium/index.js +2 -1
  205. package/dist/src/shared/chromium/index.js.map +1 -1
  206. package/dist/src/shared/utils/cli-output.d.ts +7 -0
  207. package/dist/src/shared/utils/cli-output.d.ts.map +1 -0
  208. package/dist/src/shared/utils/cli-output.js +7 -0
  209. package/dist/src/shared/utils/cli-output.js.map +1 -0
  210. package/dist/src/tui/app.d.ts.map +1 -1
  211. package/dist/src/tui/app.js +73 -20
  212. package/dist/src/tui/app.js.map +1 -1
  213. package/docs/content/docs/cli/channeltalk.mdx +4 -0
  214. package/docs/content/docs/cli/discord.mdx +5 -0
  215. package/docs/content/docs/cli/instagram.mdx +3 -0
  216. package/docs/content/docs/cli/slack.mdx +5 -0
  217. package/docs/content/docs/cli/slackbot.mdx +60 -22
  218. package/docs/content/docs/cli/teams.mdx +5 -0
  219. package/docs/content/docs/cli/webex.mdx +3 -0
  220. package/docs/content/docs/sdk/channeltalkbot.mdx +38 -1
  221. package/docs/content/docs/sdk/discordbot.mdx +501 -0
  222. package/docs/content/docs/sdk/meta.json +2 -0
  223. package/docs/content/docs/sdk/slackbot.mdx +576 -0
  224. package/e2e/README.md +1 -1
  225. package/e2e/channeltalk.e2e.test.ts +13 -13
  226. package/e2e/channeltalkbot.e2e.test.ts +13 -13
  227. package/e2e/config.ts +9 -4
  228. package/e2e/discord.e2e.test.ts +24 -24
  229. package/e2e/discordbot.e2e.test.ts +16 -16
  230. package/e2e/instagram.e2e.test.ts +10 -10
  231. package/e2e/kakaotalk.e2e.test.ts +7 -7
  232. package/e2e/line.e2e.test.ts +8 -8
  233. package/e2e/slack.e2e.test.ts +34 -34
  234. package/e2e/slackbot.e2e.test.ts +14 -14
  235. package/e2e/teams.e2e.test.ts +23 -23
  236. package/e2e/telegram.e2e.test.ts +8 -8
  237. package/e2e/webex.e2e.test.ts +14 -14
  238. package/e2e/whatsapp.e2e.test.ts +8 -8
  239. package/e2e/whatsappbot.e2e.test.ts +6 -6
  240. package/examples/discordbot-listen.ts +65 -0
  241. package/examples/slackbot-listen.ts +65 -0
  242. package/package.json +14 -1
  243. package/skills/agent-channeltalk/SKILL.md +5 -1
  244. package/skills/agent-channeltalk/references/authentication.md +5 -1
  245. package/skills/agent-channeltalkbot/SKILL.md +17 -3
  246. package/skills/agent-channeltalkbot/references/authentication.md +7 -5
  247. package/skills/agent-discord/SKILL.md +5 -1
  248. package/skills/agent-discord/references/authentication.md +7 -1
  249. package/skills/agent-discordbot/SKILL.md +13 -2
  250. package/skills/agent-discordbot/references/common-patterns.md +1 -1
  251. package/skills/agent-instagram/SKILL.md +7 -1
  252. package/skills/agent-instagram/references/authentication.md +6 -0
  253. package/skills/agent-kakaotalk/SKILL.md +1 -1
  254. package/skills/agent-line/SKILL.md +1 -1
  255. package/skills/agent-slack/SKILL.md +5 -1
  256. package/skills/agent-slack/references/authentication.md +7 -1
  257. package/skills/agent-slackbot/SKILL.md +56 -4
  258. package/skills/agent-slackbot/references/authentication.md +4 -0
  259. package/skills/agent-teams/SKILL.md +5 -1
  260. package/skills/agent-teams/references/authentication.md +7 -1
  261. package/skills/agent-telegram/SKILL.md +1 -1
  262. package/skills/agent-webex/SKILL.md +7 -1
  263. package/skills/agent-webex/references/authentication.md +6 -0
  264. package/skills/agent-wechatbot/SKILL.md +16 -1
  265. package/skills/agent-wechatbot/references/authentication.md +219 -0
  266. package/skills/agent-wechatbot/references/common-patterns.md +358 -0
  267. package/skills/agent-wechatbot/templates/account-summary.sh +122 -0
  268. package/skills/agent-wechatbot/templates/post-message.sh +122 -0
  269. package/skills/agent-wechatbot/templates/send-template.sh +152 -0
  270. package/skills/agent-whatsapp/SKILL.md +1 -1
  271. package/skills/agent-whatsappbot/SKILL.md +30 -1
  272. package/src/platforms/channeltalk/client.test.ts +26 -26
  273. package/src/platforms/channeltalk/commands/auth.test.ts +31 -19
  274. package/src/platforms/channeltalk/commands/auth.ts +15 -5
  275. package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
  276. package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
  277. package/src/platforms/channeltalk/commands/group.test.ts +4 -4
  278. package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
  279. package/src/platforms/channeltalk/commands/message.test.ts +17 -17
  280. package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
  281. package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
  282. package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
  283. package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
  284. package/src/platforms/channeltalk/index.test.ts +23 -23
  285. package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
  286. package/src/platforms/channeltalk/token-extractor.ts +24 -5
  287. package/src/platforms/channeltalk/types.test.ts +12 -12
  288. package/src/platforms/channeltalkbot/cli.ts +9 -0
  289. package/src/platforms/channeltalkbot/client.test.ts +14 -14
  290. package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
  291. package/src/platforms/channeltalkbot/commands/auth.ts +1 -5
  292. package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
  293. package/src/platforms/channeltalkbot/commands/bot.ts +1 -6
  294. package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
  295. package/src/platforms/channeltalkbot/commands/chat.ts +1 -6
  296. package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
  297. package/src/platforms/channeltalkbot/commands/group.ts +1 -6
  298. package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
  299. package/src/platforms/channeltalkbot/commands/manager.ts +1 -6
  300. package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
  301. package/src/platforms/channeltalkbot/commands/message.ts +1 -6
  302. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
  303. package/src/platforms/channeltalkbot/commands/whoami.test.ts +6 -4
  304. package/src/platforms/channeltalkbot/commands/whoami.ts +1 -6
  305. package/src/platforms/channeltalkbot/credential-manager.test.ts +123 -29
  306. package/src/platforms/channeltalkbot/credential-manager.ts +37 -4
  307. package/src/platforms/channeltalkbot/index.test.ts +15 -15
  308. package/src/platforms/discord/client.test.ts +28 -28
  309. package/src/platforms/discord/commands/auth.test.ts +7 -7
  310. package/src/platforms/discord/commands/auth.ts +13 -2
  311. package/src/platforms/discord/commands/channel.test.ts +7 -7
  312. package/src/platforms/discord/commands/dm.test.ts +4 -4
  313. package/src/platforms/discord/commands/file.test.ts +4 -4
  314. package/src/platforms/discord/commands/friend.test.ts +6 -6
  315. package/src/platforms/discord/commands/member.test.ts +5 -5
  316. package/src/platforms/discord/commands/mention.test.ts +5 -5
  317. package/src/platforms/discord/commands/message.test.ts +9 -9
  318. package/src/platforms/discord/commands/note.test.ts +6 -6
  319. package/src/platforms/discord/commands/profile.test.ts +4 -4
  320. package/src/platforms/discord/commands/reaction.test.ts +5 -5
  321. package/src/platforms/discord/commands/server.test.ts +7 -7
  322. package/src/platforms/discord/commands/snapshot.test.ts +6 -6
  323. package/src/platforms/discord/commands/thread.test.ts +6 -6
  324. package/src/platforms/discord/commands/user.test.ts +5 -5
  325. package/src/platforms/discord/commands/whoami.test.ts +6 -6
  326. package/src/platforms/discord/credential-manager.test.ts +16 -16
  327. package/src/platforms/discord/ensure-auth.test.ts +8 -8
  328. package/src/platforms/discord/index.test.ts +17 -17
  329. package/src/platforms/discord/listener.test.ts +92 -34
  330. package/src/platforms/discord/listener.ts +43 -19
  331. package/src/platforms/discord/token-extractor.test.ts +53 -53
  332. package/src/platforms/discord/token-extractor.ts +30 -6
  333. package/src/platforms/discord/types.test.ts +26 -26
  334. package/src/platforms/discordbot/cli.ts +10 -0
  335. package/src/platforms/discordbot/client.test.ts +31 -31
  336. package/src/platforms/discordbot/client.ts +4 -0
  337. package/src/platforms/discordbot/commands/auth.test.ts +18 -18
  338. package/src/platforms/discordbot/commands/auth.ts +1 -5
  339. package/src/platforms/discordbot/commands/channel.test.ts +11 -11
  340. package/src/platforms/discordbot/commands/file.test.ts +7 -7
  341. package/src/platforms/discordbot/commands/message.test.ts +25 -25
  342. package/src/platforms/discordbot/commands/message.ts +1 -6
  343. package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
  344. package/src/platforms/discordbot/commands/server.test.ts +12 -12
  345. package/src/platforms/discordbot/commands/server.ts +1 -5
  346. package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
  347. package/src/platforms/discordbot/commands/thread.test.ts +10 -10
  348. package/src/platforms/discordbot/commands/user.test.ts +9 -9
  349. package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
  350. package/src/platforms/discordbot/commands/whoami.ts +1 -6
  351. package/src/platforms/discordbot/credential-manager.test.ts +28 -28
  352. package/src/platforms/discordbot/index.test.ts +82 -0
  353. package/src/platforms/discordbot/index.ts +27 -9
  354. package/src/platforms/discordbot/listener.test.ts +1002 -0
  355. package/src/platforms/discordbot/listener.ts +321 -0
  356. package/src/platforms/discordbot/types.ts +163 -0
  357. package/src/platforms/instagram/client.test.ts +18 -18
  358. package/src/platforms/instagram/commands/auth.test.ts +11 -11
  359. package/src/platforms/instagram/commands/auth.ts +9 -1
  360. package/src/platforms/instagram/commands/chat.test.ts +6 -6
  361. package/src/platforms/instagram/commands/message.test.ts +11 -11
  362. package/src/platforms/instagram/commands/shared.test.ts +12 -12
  363. package/src/platforms/instagram/commands/whoami.test.ts +3 -3
  364. package/src/platforms/instagram/credential-manager.test.ts +21 -21
  365. package/src/platforms/instagram/ensure-auth.test.ts +4 -4
  366. package/src/platforms/instagram/index.test.ts +9 -9
  367. package/src/platforms/instagram/listener.test.ts +8 -8
  368. package/src/platforms/instagram/token-extractor.test.ts +35 -35
  369. package/src/platforms/instagram/token-extractor.ts +13 -1
  370. package/src/platforms/kakaotalk/client.test.ts +33 -33
  371. package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
  372. package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
  373. package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
  374. package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
  375. package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
  376. package/src/platforms/kakaotalk/index.test.ts +15 -15
  377. package/src/platforms/kakaotalk/listener.test.ts +17 -17
  378. package/src/platforms/line/client.test.ts +17 -17
  379. package/src/platforms/line/commands/auth.test.ts +8 -8
  380. package/src/platforms/line/commands/chat.test.ts +7 -7
  381. package/src/platforms/line/commands/friend.test.ts +6 -6
  382. package/src/platforms/line/commands/message.test.ts +7 -7
  383. package/src/platforms/line/commands/whoami.test.ts +6 -6
  384. package/src/platforms/line/credential-manager.test.ts +17 -17
  385. package/src/platforms/line/index.test.ts +10 -10
  386. package/src/platforms/line/listener.test.ts +15 -15
  387. package/src/platforms/line/types.test.ts +14 -14
  388. package/src/platforms/slack/cli.test.ts +8 -8
  389. package/src/platforms/slack/client.test.ts +151 -151
  390. package/src/platforms/slack/commands/activity.test.ts +13 -13
  391. package/src/platforms/slack/commands/auth.test.ts +34 -34
  392. package/src/platforms/slack/commands/auth.ts +11 -2
  393. package/src/platforms/slack/commands/bookmark.test.ts +9 -9
  394. package/src/platforms/slack/commands/channel.test.ts +17 -17
  395. package/src/platforms/slack/commands/drafts.test.ts +7 -7
  396. package/src/platforms/slack/commands/emoji.test.ts +3 -3
  397. package/src/platforms/slack/commands/file.test.ts +12 -12
  398. package/src/platforms/slack/commands/message.test.ts +19 -19
  399. package/src/platforms/slack/commands/pin.test.ts +7 -7
  400. package/src/platforms/slack/commands/reaction.test.ts +10 -10
  401. package/src/platforms/slack/commands/reminder.test.ts +9 -9
  402. package/src/platforms/slack/commands/saved.test.ts +7 -7
  403. package/src/platforms/slack/commands/sections.test.ts +5 -5
  404. package/src/platforms/slack/commands/snapshot.test.ts +13 -13
  405. package/src/platforms/slack/commands/unread.test.ts +6 -6
  406. package/src/platforms/slack/commands/user.test.ts +10 -10
  407. package/src/platforms/slack/commands/usergroup.test.ts +15 -15
  408. package/src/platforms/slack/commands/whoami.test.ts +6 -6
  409. package/src/platforms/slack/commands/workspace.test.ts +26 -26
  410. package/src/platforms/slack/credential-manager.test.ts +14 -14
  411. package/src/platforms/slack/ensure-auth.test.ts +21 -21
  412. package/src/platforms/slack/index.test.ts +12 -12
  413. package/src/platforms/slack/listener.test.ts +17 -17
  414. package/src/platforms/slack/token-extractor-node.test.ts +2 -2
  415. package/src/platforms/slack/token-extractor.test.ts +133 -37
  416. package/src/platforms/slack/token-extractor.ts +76 -13
  417. package/src/platforms/slack/types.test.ts +21 -21
  418. package/src/platforms/slackbot/cli.ts +13 -1
  419. package/src/platforms/slackbot/client.test.ts +296 -22
  420. package/src/platforms/slackbot/client.ts +130 -2
  421. package/src/platforms/slackbot/commands/auth.test.ts +14 -14
  422. package/src/platforms/slackbot/commands/auth.ts +1 -5
  423. package/src/platforms/slackbot/commands/channel.test.ts +7 -7
  424. package/src/platforms/slackbot/commands/file.test.ts +201 -0
  425. package/src/platforms/slackbot/commands/file.ts +212 -0
  426. package/src/platforms/slackbot/commands/index.ts +1 -0
  427. package/src/platforms/slackbot/commands/message.test.ts +13 -13
  428. package/src/platforms/slackbot/commands/message.ts +22 -0
  429. package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
  430. package/src/platforms/slackbot/commands/user.test.ts +7 -7
  431. package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
  432. package/src/platforms/slackbot/commands/whoami.ts +1 -6
  433. package/src/platforms/slackbot/credential-manager.test.ts +83 -23
  434. package/src/platforms/slackbot/credential-manager.ts +32 -2
  435. package/src/platforms/slackbot/index.test.ts +59 -0
  436. package/src/platforms/slackbot/index.ts +31 -7
  437. package/src/platforms/slackbot/listener.test.ts +1012 -0
  438. package/src/platforms/slackbot/listener.ts +362 -0
  439. package/src/platforms/slackbot/types.test.ts +7 -7
  440. package/src/platforms/slackbot/types.ts +224 -1
  441. package/src/platforms/teams/client.test.ts +30 -30
  442. package/src/platforms/teams/commands/auth.test.ts +9 -9
  443. package/src/platforms/teams/commands/auth.ts +66 -7
  444. package/src/platforms/teams/commands/channel.test.ts +7 -7
  445. package/src/platforms/teams/commands/file.test.ts +4 -4
  446. package/src/platforms/teams/commands/message.test.ts +5 -5
  447. package/src/platforms/teams/commands/reaction.test.ts +4 -4
  448. package/src/platforms/teams/commands/snapshot.test.ts +7 -7
  449. package/src/platforms/teams/commands/team.test.ts +8 -8
  450. package/src/platforms/teams/commands/user.test.ts +4 -4
  451. package/src/platforms/teams/commands/whoami.test.ts +6 -6
  452. package/src/platforms/teams/credential-manager.test.ts +17 -17
  453. package/src/platforms/teams/ensure-auth.test.ts +69 -18
  454. package/src/platforms/teams/ensure-auth.ts +39 -11
  455. package/src/platforms/teams/index.test.ts +15 -15
  456. package/src/platforms/teams/token-extractor.test.ts +251 -69
  457. package/src/platforms/teams/token-extractor.ts +94 -31
  458. package/src/platforms/teams/types.test.ts +26 -26
  459. package/src/platforms/telegram/app-config.test.ts +4 -4
  460. package/src/platforms/telegram/chat-utils.test.ts +12 -12
  461. package/src/platforms/telegram/client.test.ts +4 -4
  462. package/src/platforms/telegram/commands/auth.test.ts +16 -16
  463. package/src/platforms/telegram/commands/chat.test.ts +9 -9
  464. package/src/platforms/telegram/commands/message.test.ts +6 -6
  465. package/src/platforms/telegram/commands/shared.test.ts +3 -3
  466. package/src/platforms/telegram/commands/whoami.test.ts +3 -3
  467. package/src/platforms/telegram/credential-manager.test.ts +10 -10
  468. package/src/platforms/telegram/types.test.ts +6 -6
  469. package/src/platforms/webex/app-config.test.ts +8 -8
  470. package/src/platforms/webex/cli.test.ts +5 -5
  471. package/src/platforms/webex/client.test.ts +65 -65
  472. package/src/platforms/webex/commands/auth.test.ts +18 -18
  473. package/src/platforms/webex/commands/auth.ts +13 -2
  474. package/src/platforms/webex/commands/member.test.ts +5 -5
  475. package/src/platforms/webex/commands/message.test.ts +12 -12
  476. package/src/platforms/webex/commands/snapshot.test.ts +5 -5
  477. package/src/platforms/webex/commands/space.test.ts +10 -10
  478. package/src/platforms/webex/commands/whoami.test.ts +6 -6
  479. package/src/platforms/webex/credential-manager.test.ts +22 -22
  480. package/src/platforms/webex/encryption.test.ts +4 -4
  481. package/src/platforms/webex/ensure-auth.test.ts +5 -5
  482. package/src/platforms/webex/index.test.ts +5 -5
  483. package/src/platforms/webex/markdown-to-html.test.ts +33 -33
  484. package/src/platforms/webex/token-extractor.test.ts +23 -23
  485. package/src/platforms/webex/token-extractor.ts +25 -3
  486. package/src/platforms/webex/types.test.ts +27 -27
  487. package/src/platforms/wechatbot/cli.ts +9 -0
  488. package/src/platforms/wechatbot/client.test.ts +27 -27
  489. package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
  490. package/src/platforms/wechatbot/commands/auth.ts +1 -5
  491. package/src/platforms/wechatbot/commands/message.test.ts +8 -8
  492. package/src/platforms/wechatbot/commands/message.ts +1 -6
  493. package/src/platforms/wechatbot/commands/template.test.ts +9 -9
  494. package/src/platforms/wechatbot/commands/template.ts +1 -6
  495. package/src/platforms/wechatbot/commands/user.test.ts +7 -7
  496. package/src/platforms/wechatbot/commands/user.ts +1 -6
  497. package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
  498. package/src/platforms/wechatbot/commands/whoami.ts +1 -6
  499. package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
  500. package/src/platforms/wechatbot/index.test.ts +10 -10
  501. package/src/platforms/wechatbot/types.test.ts +25 -25
  502. package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
  503. package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
  504. package/src/platforms/whatsapp/commands/message.test.ts +10 -10
  505. package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
  506. package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
  507. package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
  508. package/src/platforms/whatsapp/index.test.ts +8 -8
  509. package/src/platforms/whatsapp/types.test.ts +42 -42
  510. package/src/platforms/whatsappbot/cli.ts +9 -0
  511. package/src/platforms/whatsappbot/client.test.ts +27 -27
  512. package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
  513. package/src/platforms/whatsappbot/commands/auth.ts +1 -5
  514. package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
  515. package/src/platforms/whatsappbot/commands/message.ts +1 -6
  516. package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
  517. package/src/platforms/whatsappbot/commands/template.ts +1 -6
  518. package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
  519. package/src/platforms/whatsappbot/commands/whoami.ts +1 -6
  520. package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
  521. package/src/platforms/whatsappbot/index.test.ts +7 -7
  522. package/src/platforms/whatsappbot/types.test.ts +18 -18
  523. package/src/shared/chromium/browsers.test.ts +102 -22
  524. package/src/shared/chromium/browsers.ts +72 -3
  525. package/src/shared/chromium/cli-options.test.ts +22 -0
  526. package/src/shared/chromium/cli-options.ts +12 -0
  527. package/src/shared/chromium/cookie-reader.test.ts +13 -13
  528. package/src/shared/chromium/decryptor.test.ts +97 -32
  529. package/src/shared/chromium/decryptor.ts +27 -6
  530. package/src/shared/chromium/index.ts +3 -0
  531. package/src/shared/utils/cli-output.test.ts +57 -0
  532. package/src/shared/utils/cli-output.ts +8 -0
  533. package/src/shared/utils/concurrency.test.ts +6 -6
  534. package/src/shared/utils/derived-key-cache.test.ts +11 -11
  535. package/src/tui/app.ts +129 -20
  536. package/src/tui/utils.test.ts +31 -31
@@ -1,13 +1,28 @@
1
1
  import { WebClient } from '@slack/web-api'
2
2
 
3
3
  import { SlackBotCredentialManager } from './credential-manager'
4
- import { SlackBotError, type SlackChannel, type SlackMessage, type SlackUser } from './types'
4
+ import { SlackBotError, type SlackChannel, type SlackFile, type SlackMessage, type SlackUser } from './types'
5
5
 
6
6
  const MAX_RETRIES = 3
7
7
  const RATE_LIMIT_ERROR_CODE = 'slack_webapi_rate_limited_error'
8
8
 
9
+ function mapSlackFile(f: any): SlackFile {
10
+ return {
11
+ id: f?.id || '',
12
+ name: f?.name || '',
13
+ title: f?.title || f?.name || '',
14
+ mimetype: f?.mimetype || 'application/octet-stream',
15
+ size: f?.size || 0,
16
+ url_private: f?.url_private || '',
17
+ created: f?.created || 0,
18
+ user: f?.user || '',
19
+ channels: f?.channels,
20
+ }
21
+ }
22
+
9
23
  export class SlackBotClient {
10
24
  private client: WebClient | null = null
25
+ private token: string | null = null
11
26
 
12
27
  async login(credentials?: { token: string }): Promise<this> {
13
28
  if (credentials) {
@@ -18,6 +33,7 @@ export class SlackBotClient {
18
33
  if (!token.startsWith('xoxb-')) {
19
34
  throw new SlackBotError('Token must be a bot token (xoxb-)', 'invalid_token_type')
20
35
  }
36
+ this.token = token
21
37
  this.client = new WebClient(token)
22
38
  } else {
23
39
  const credManager = new SlackBotCredentialManager()
@@ -52,7 +68,9 @@ export class SlackBotClient {
52
68
  break
53
69
  }
54
70
  }
55
- throw new SlackBotError(lastError?.message || 'Unknown error', (lastError as any)?.code || 'unknown_error')
71
+ const code = (lastError as any)?.code || 'unknown_error'
72
+ const retryAfter = code === RATE_LIMIT_ERROR_CODE ? (lastError as any)?.retryAfter : undefined
73
+ throw new SlackBotError(lastError?.message || 'Unknown error', code, retryAfter)
56
74
  }
57
75
 
58
76
  private sleep(ms: number): Promise<void> {
@@ -451,6 +469,17 @@ export class SlackBotClient {
451
469
  })
452
470
  }
453
471
 
472
+ async setAssistantStatus(channel: string, threadTs: string, status: string): Promise<void> {
473
+ return this.withRetry(async () => {
474
+ const response = await this.ensureAuth().assistant.threads.setStatus({
475
+ channel_id: channel,
476
+ thread_ts: threadTs,
477
+ status,
478
+ })
479
+ this.checkResponse(response)
480
+ })
481
+ }
482
+
454
483
  async joinChannel(channel: string): Promise<void> {
455
484
  return this.withRetry(async () => {
456
485
  const response = await this.ensureAuth().conversations.join({ channel })
@@ -464,4 +493,103 @@ export class SlackBotClient {
464
493
  this.checkResponse(response)
465
494
  })
466
495
  }
496
+
497
+ async uploadFile(
498
+ channel: string,
499
+ file: Buffer,
500
+ filename: string,
501
+ options?: { thread_ts?: string; title?: string; initial_comment?: string },
502
+ ): Promise<SlackFile> {
503
+ return this.withRetry(async () => {
504
+ const response = await this.ensureAuth().files.uploadV2({
505
+ channel_id: channel,
506
+ file,
507
+ filename,
508
+ thread_ts: options?.thread_ts,
509
+ title: options?.title,
510
+ initial_comment: options?.initial_comment,
511
+ })
512
+ this.checkResponse(response)
513
+
514
+ const completionFiles = (response as any).files?.[0]?.files
515
+ const f = completionFiles?.[0]
516
+ if (!f) {
517
+ throw new SlackBotError('No file returned in upload response', 'file_not_found')
518
+ }
519
+ return mapSlackFile(f)
520
+ })
521
+ }
522
+
523
+ async listFiles(options?: { channel?: string; user?: string; limit?: number }): Promise<SlackFile[]> {
524
+ return this.withRetry(async () => {
525
+ const response = await this.ensureAuth().files.list({
526
+ channel: options?.channel,
527
+ user: options?.user,
528
+ count: options?.limit,
529
+ })
530
+ this.checkResponse(response)
531
+
532
+ return (response.files || []).map((f) => mapSlackFile(f))
533
+ })
534
+ }
535
+
536
+ async getFileInfo(fileId: string): Promise<SlackFile> {
537
+ return this.withRetry(async () => {
538
+ const response = await this.ensureAuth().files.info({ file: fileId })
539
+ this.checkResponse(response)
540
+
541
+ return mapSlackFile(response.file)
542
+ })
543
+ }
544
+
545
+ async downloadFile(fileId: string): Promise<{ buffer: Buffer; file: SlackFile }> {
546
+ const file = await this.getFileInfo(fileId)
547
+
548
+ if (!file.url_private) {
549
+ throw new SlackBotError('File has no download URL', 'no_download_url')
550
+ }
551
+
552
+ if (!this.token) {
553
+ throw new SlackBotError('Not authenticated. Call .login() first.', 'not_authenticated')
554
+ }
555
+
556
+ const response = await fetch(file.url_private, {
557
+ headers: { Authorization: `Bearer ${this.token}` },
558
+ })
559
+
560
+ if (!response.ok) {
561
+ throw new SlackBotError(`Failed to download file: ${response.statusText}`, 'download_failed')
562
+ }
563
+
564
+ const arrayBuffer = await response.arrayBuffer()
565
+ return {
566
+ buffer: Buffer.from(arrayBuffer),
567
+ file,
568
+ }
569
+ }
570
+
571
+ async deleteFile(fileId: string): Promise<void> {
572
+ return this.withRetry(async () => {
573
+ const response = await this.ensureAuth().files.delete({ file: fileId })
574
+ this.checkResponse(response)
575
+ })
576
+ }
577
+
578
+ async appsConnectionsOpen(appToken: string): Promise<{ url: string }> {
579
+ if (!appToken) {
580
+ throw new SlackBotError('App-level token is required for Socket Mode', 'missing_app_token')
581
+ }
582
+ if (!appToken.startsWith('xapp-')) {
583
+ throw new SlackBotError(
584
+ 'Token must be an app-level token (xapp-) with connections:write scope',
585
+ 'invalid_app_token_type',
586
+ )
587
+ }
588
+
589
+ return this.withRetry(async () => {
590
+ const response = await new WebClient(appToken).apps.connections.open()
591
+ this.checkResponse(response)
592
+ return { url: (response as { url: string }).url }
593
+ })
594
+ }
467
595
  }
@@ -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'
@@ -46,7 +46,7 @@ describe('auth commands', () => {
46
46
  })
47
47
 
48
48
  describe('setAction', () => {
49
- test('validates and stores bot token with default bot_id from auth', async () => {
49
+ it('validates and stores bot token with default bot_id from auth', async () => {
50
50
  const manager = new SlackBotCredentialManager(tempDir)
51
51
 
52
52
  const result = await setAction('xoxb-test-token', { _credManager: manager })
@@ -60,7 +60,7 @@ describe('auth commands', () => {
60
60
  expect(creds?.bot_id).toBe('B789')
61
61
  })
62
62
 
63
- test('uses --bot flag as bot_id', async () => {
63
+ it('uses --bot flag as bot_id', async () => {
64
64
  const manager = new SlackBotCredentialManager(tempDir)
65
65
 
66
66
  const result = await setAction('xoxb-test-token', { bot: 'deploy', _credManager: manager })
@@ -70,7 +70,7 @@ describe('auth commands', () => {
70
70
  expect(creds?.token).toBe('xoxb-test-token')
71
71
  })
72
72
 
73
- test('rejects user tokens', async () => {
73
+ it('rejects user tokens', async () => {
74
74
  const manager = new SlackBotCredentialManager(tempDir)
75
75
 
76
76
  const result = await setAction('xoxp-user-token', { _credManager: manager })
@@ -79,7 +79,7 @@ describe('auth commands', () => {
79
79
  expect(result.error).toContain('bot token')
80
80
  })
81
81
 
82
- test('rejects invalid token format', async () => {
82
+ it('rejects invalid token format', async () => {
83
83
  const manager = new SlackBotCredentialManager(tempDir)
84
84
 
85
85
  const result = await setAction('invalid-token', { _credManager: manager })
@@ -89,7 +89,7 @@ describe('auth commands', () => {
89
89
  })
90
90
 
91
91
  describe('clearAction', () => {
92
- test('removes all stored credentials', async () => {
92
+ it('removes all stored credentials', async () => {
93
93
  const manager = new SlackBotCredentialManager(tempDir)
94
94
  await manager.setCredentials({
95
95
  token: 'xoxb-token',
@@ -107,7 +107,7 @@ describe('auth commands', () => {
107
107
  })
108
108
 
109
109
  describe('statusAction', () => {
110
- test('returns no credentials when none set', async () => {
110
+ it('returns no credentials when none set', async () => {
111
111
  const manager = new SlackBotCredentialManager(tempDir)
112
112
 
113
113
  const result = await statusAction({ _credManager: manager })
@@ -116,7 +116,7 @@ describe('auth commands', () => {
116
116
  expect(result.error).toBeDefined()
117
117
  })
118
118
 
119
- test('returns valid status for current bot', async () => {
119
+ it('returns valid status for current bot', async () => {
120
120
  const manager = new SlackBotCredentialManager(tempDir)
121
121
  await manager.setCredentials({
122
122
  token: 'xoxb-token',
@@ -133,7 +133,7 @@ describe('auth commands', () => {
133
133
  expect(result.bot_id).toBe('mybot')
134
134
  })
135
135
 
136
- test('returns status for specific --bot', async () => {
136
+ it('returns status for specific --bot', async () => {
137
137
  const manager = new SlackBotCredentialManager(tempDir)
138
138
  await manager.setCredentials({
139
139
  token: 'xoxb-token',
@@ -158,7 +158,7 @@ describe('auth commands', () => {
158
158
  })
159
159
 
160
160
  describe('listAction', () => {
161
- test('returns all stored bots', async () => {
161
+ it('returns all stored bots', async () => {
162
162
  const manager = new SlackBotCredentialManager(tempDir)
163
163
  await manager.setCredentials({
164
164
  token: 'xoxb-a',
@@ -183,7 +183,7 @@ describe('auth commands', () => {
183
183
  })
184
184
 
185
185
  describe('useAction', () => {
186
- test('switches current bot', async () => {
186
+ it('switches current bot', async () => {
187
187
  const manager = new SlackBotCredentialManager(tempDir)
188
188
  await manager.setCredentials({
189
189
  token: 'xoxb-a',
@@ -206,7 +206,7 @@ describe('auth commands', () => {
206
206
  expect(result.bot_id).toBe('deploy')
207
207
  })
208
208
 
209
- test('returns error for unknown bot', async () => {
209
+ it('returns error for unknown bot', async () => {
210
210
  const manager = new SlackBotCredentialManager(tempDir)
211
211
 
212
212
  const result = await useAction('nonexistent', { _credManager: manager })
@@ -216,7 +216,7 @@ describe('auth commands', () => {
216
216
  })
217
217
 
218
218
  describe('removeAction', () => {
219
- test('removes a stored bot', async () => {
219
+ it('removes a stored bot', async () => {
220
220
  const manager = new SlackBotCredentialManager(tempDir)
221
221
  await manager.setCredentials({
222
222
  token: 'xoxb-a',
@@ -232,7 +232,7 @@ describe('auth commands', () => {
232
232
  expect(await manager.getCredentials('deploy')).toBeNull()
233
233
  })
234
234
 
235
- test('returns error for unknown bot', async () => {
235
+ it('returns error for unknown bot', async () => {
236
236
  const manager = new SlackBotCredentialManager(tempDir)
237
237
 
238
238
  const result = await removeAction('nonexistent', { _credManager: manager })
@@ -1,5 +1,6 @@
1
1
  import { Command } from 'commander'
2
2
 
3
+ import { cliOutput } from '@/shared/utils/cli-output'
3
4
  import { formatOutput } from '@/shared/utils/output'
4
5
 
5
6
  import { SlackBotClient } from '../client'
@@ -177,11 +178,6 @@ export async function removeAction(botId: string, options: ActionOptions): Promi
177
178
  }
178
179
  }
179
180
 
180
- function cliOutput(result: ActionResult, pretty?: boolean, exitOnError = true): void {
181
- console.log(formatOutput(result, pretty))
182
- if (result.error && exitOnError) process.exit(1)
183
- }
184
-
185
181
  export const authCommand = new Command('auth')
186
182
  .description('Bot authentication commands')
187
183
  .addCommand(
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockResolveChannel = mock((_channel: string) => Promise.resolve('C123456'))
4
4
  const mockListChannels = mock(() =>
@@ -55,7 +55,7 @@ describe('channel commands', () => {
55
55
  })
56
56
 
57
57
  describe('listChannels', () => {
58
- test('returns list of channels', async () => {
58
+ it('returns list of channels', async () => {
59
59
  // given
60
60
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
61
61
 
@@ -68,7 +68,7 @@ describe('channel commands', () => {
68
68
  expect(channels[1].name).toBe('random')
69
69
  })
70
70
 
71
- test('includes channel metadata', async () => {
71
+ it('includes channel metadata', async () => {
72
72
  // given
73
73
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
74
74
 
@@ -84,7 +84,7 @@ describe('channel commands', () => {
84
84
  expect(channel.created).toBeDefined()
85
85
  })
86
86
 
87
- test('passes limit option', async () => {
87
+ it('passes limit option', async () => {
88
88
  // given
89
89
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
90
90
 
@@ -97,7 +97,7 @@ describe('channel commands', () => {
97
97
  })
98
98
 
99
99
  describe('getChannelInfo', () => {
100
- test('returns channel details', async () => {
100
+ it('returns channel details', async () => {
101
101
  // given
102
102
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
103
103
 
@@ -110,7 +110,7 @@ describe('channel commands', () => {
110
110
  expect(channel.is_private).toBe(false)
111
111
  })
112
112
 
113
- test('includes topic and purpose', async () => {
113
+ it('includes topic and purpose', async () => {
114
114
  // given
115
115
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
116
116
 
@@ -124,7 +124,7 @@ describe('channel commands', () => {
124
124
  })
125
125
 
126
126
  describe('resolveChannel', () => {
127
- test('resolves channel name to ID', async () => {
127
+ it('resolves channel name to ID', async () => {
128
128
  // given
129
129
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
130
130
 
@@ -0,0 +1,201 @@
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
+
3
+ const mockResolveChannel = mock((_channel: string) => Promise.resolve('C123456'))
4
+ const mockUploadFile = mock(() =>
5
+ Promise.resolve({
6
+ id: 'F123',
7
+ name: 'test.txt',
8
+ title: 'test.txt',
9
+ mimetype: 'text/plain',
10
+ size: 12,
11
+ url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
12
+ created: 1234567890,
13
+ user: 'U123',
14
+ channels: ['C123456'],
15
+ }),
16
+ )
17
+ const mockListFiles = mock(() =>
18
+ Promise.resolve([
19
+ {
20
+ id: 'F123',
21
+ name: 'test.txt',
22
+ title: 'test.txt',
23
+ mimetype: 'text/plain',
24
+ size: 1024,
25
+ url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
26
+ created: 1234567890,
27
+ user: 'U123',
28
+ channels: ['C123456'],
29
+ },
30
+ {
31
+ id: 'F456',
32
+ name: 'document.pdf',
33
+ title: 'document.pdf',
34
+ mimetype: 'application/pdf',
35
+ size: 2048,
36
+ url_private: 'https://files.slack.com/files-pri/T123-F456/document.pdf',
37
+ created: 1234567891,
38
+ user: 'U456',
39
+ channels: ['C123456'],
40
+ },
41
+ ]),
42
+ )
43
+ const mockGetFileInfo = mock(() =>
44
+ Promise.resolve({
45
+ id: 'F123',
46
+ name: 'test.txt',
47
+ title: 'test.txt',
48
+ mimetype: 'text/plain',
49
+ size: 1024,
50
+ url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
51
+ created: 1234567890,
52
+ user: 'U123',
53
+ channels: ['C123456'],
54
+ }),
55
+ )
56
+ const mockDownloadFile = mock(() =>
57
+ Promise.resolve({
58
+ buffer: Buffer.from('downloaded content'),
59
+ file: {
60
+ id: 'F123',
61
+ name: 'test.txt',
62
+ title: 'test.txt',
63
+ mimetype: 'text/plain',
64
+ size: 18,
65
+ url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
66
+ created: 1234567890,
67
+ user: 'U123',
68
+ channels: ['C123456'],
69
+ },
70
+ }),
71
+ )
72
+ const mockDeleteFile = mock(() => Promise.resolve())
73
+
74
+ mock.module('../client', () => ({
75
+ SlackBotClient: class MockSlackBotClient {
76
+ async login(_credentials?: { token: string }) {
77
+ return this
78
+ }
79
+ resolveChannel = mockResolveChannel
80
+ uploadFile = mockUploadFile
81
+ listFiles = mockListFiles
82
+ getFileInfo = mockGetFileInfo
83
+ downloadFile = mockDownloadFile
84
+ deleteFile = mockDeleteFile
85
+ },
86
+ }))
87
+
88
+ import { SlackBotClient } from '../client'
89
+
90
+ describe('file commands', () => {
91
+ beforeEach(() => {
92
+ mockResolveChannel.mockClear()
93
+ mockUploadFile.mockClear()
94
+ mockListFiles.mockClear()
95
+ mockGetFileInfo.mockClear()
96
+ mockDownloadFile.mockClear()
97
+ mockDeleteFile.mockClear()
98
+ })
99
+
100
+ describe('uploadFile', () => {
101
+ it('uploads a file to a channel', async () => {
102
+ // given
103
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
104
+
105
+ // when
106
+ const file = await client.uploadFile('C123456', Buffer.from('test content'), 'test.txt')
107
+
108
+ // then
109
+ expect(file.id).toBe('F123')
110
+ expect(file.name).toBe('test.txt')
111
+ expect(file.channels).toContain('C123456')
112
+ })
113
+
114
+ it('forwards thread, title, and initial_comment options', async () => {
115
+ // given
116
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
117
+
118
+ // when
119
+ await client.uploadFile('C123456', Buffer.from('x'), 'test.txt', {
120
+ thread_ts: '1234567890.000100',
121
+ title: 'My Title',
122
+ initial_comment: 'Here you go',
123
+ })
124
+
125
+ // then
126
+ expect(mockUploadFile).toHaveBeenCalledWith('C123456', Buffer.from('x'), 'test.txt', {
127
+ thread_ts: '1234567890.000100',
128
+ title: 'My Title',
129
+ initial_comment: 'Here you go',
130
+ })
131
+ })
132
+ })
133
+
134
+ describe('listFiles', () => {
135
+ it('returns all files visible to the bot', async () => {
136
+ // given
137
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
138
+
139
+ // when
140
+ const files = await client.listFiles()
141
+
142
+ // then
143
+ expect(files).toHaveLength(2)
144
+ expect(files[0].name).toBe('test.txt')
145
+ expect(files[1].name).toBe('document.pdf')
146
+ })
147
+
148
+ it('forwards channel/user/limit filters', async () => {
149
+ // given
150
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
151
+
152
+ // when
153
+ await client.listFiles({ channel: 'C123456', user: 'U123', limit: 50 })
154
+
155
+ // then
156
+ expect(mockListFiles).toHaveBeenCalledWith({ channel: 'C123456', user: 'U123', limit: 50 })
157
+ })
158
+ })
159
+
160
+ describe('getFileInfo', () => {
161
+ it('returns file metadata', async () => {
162
+ // given
163
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
164
+
165
+ // when
166
+ const file = await client.getFileInfo('F123')
167
+
168
+ // then
169
+ expect(file.id).toBe('F123')
170
+ expect(file.name).toBe('test.txt')
171
+ expect(file.url_private).toBe('https://files.slack.com/files-pri/T123-F123/test.txt')
172
+ })
173
+ })
174
+
175
+ describe('downloadFile', () => {
176
+ it('returns buffer and file metadata', async () => {
177
+ // given
178
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
179
+
180
+ // when
181
+ const result = await client.downloadFile('F123')
182
+
183
+ // then
184
+ expect(result.file.id).toBe('F123')
185
+ expect(result.buffer.toString()).toBe('downloaded content')
186
+ })
187
+ })
188
+
189
+ describe('deleteFile', () => {
190
+ it("deletes the bot's file", async () => {
191
+ // given
192
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
193
+
194
+ // when
195
+ await client.deleteFile('F123')
196
+
197
+ // then
198
+ expect(mockDeleteFile).toHaveBeenCalledWith('F123')
199
+ })
200
+ })
201
+ })