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,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -87,7 +87,7 @@ describe('snapshot command', () => {
87
87
  })
88
88
 
89
89
  describe('default (brief)', () => {
90
- test('returns channels with id and name only', async () => {
90
+ it('returns channels with id and name only', async () => {
91
91
  const manager = await setupManager(tempDir)
92
92
 
93
93
  const result = await snapshotAction({ _credManager: manager })
@@ -99,7 +99,7 @@ describe('snapshot command', () => {
99
99
  expect(result.hint).toBeDefined()
100
100
  })
101
101
 
102
- test('filters out non-text channels', async () => {
102
+ it('filters out non-text channels', async () => {
103
103
  const manager = await setupManager(tempDir)
104
104
 
105
105
  const result = await snapshotAction({ _credManager: manager })
@@ -108,7 +108,7 @@ describe('snapshot command', () => {
108
108
  expect(channelNames).not.toContain('voice')
109
109
  })
110
110
 
111
- test('does not fetch messages', async () => {
111
+ it('does not fetch messages', async () => {
112
112
  const manager = await setupManager(tempDir)
113
113
 
114
114
  await snapshotAction({ _credManager: manager })
@@ -118,7 +118,7 @@ describe('snapshot command', () => {
118
118
  })
119
119
 
120
120
  describe('--full (channels + messages)', () => {
121
- test('returns channels with recent messages', async () => {
121
+ it('returns channels with recent messages', async () => {
122
122
  const manager = await setupManager(tempDir)
123
123
 
124
124
  const result = await snapshotAction({ _credManager: manager, full: true })
@@ -136,7 +136,7 @@ describe('snapshot command', () => {
136
136
  })
137
137
  })
138
138
 
139
- test('fetches messages in parallel for all text channels', async () => {
139
+ it('fetches messages in parallel for all text channels', async () => {
140
140
  const manager = await setupManager(tempDir)
141
141
 
142
142
  await snapshotAction({ _credManager: manager, full: true })
@@ -146,7 +146,7 @@ describe('snapshot command', () => {
146
146
  expect(mockGetMessages).toHaveBeenCalledWith('ch2', 5)
147
147
  })
148
148
 
149
- test('respects --limit option', async () => {
149
+ it('respects --limit option', async () => {
150
150
  const manager = await setupManager(tempDir)
151
151
 
152
152
  await snapshotAction({ _credManager: manager, full: true, limit: 10 })
@@ -155,7 +155,7 @@ describe('snapshot command', () => {
155
155
  expect(mockGetMessages).toHaveBeenCalledWith('ch2', 10)
156
156
  })
157
157
 
158
- test('defaults limit to 5', async () => {
158
+ it('defaults limit to 5', async () => {
159
159
  const manager = await setupManager(tempDir)
160
160
 
161
161
  await snapshotAction({ _credManager: manager, full: true })
@@ -165,7 +165,7 @@ describe('snapshot command', () => {
165
165
  })
166
166
 
167
167
  describe('--full --channels-only', () => {
168
- test('returns only channel list without messages', async () => {
168
+ it('returns only channel list without messages', async () => {
169
169
  const manager = await setupManager(tempDir)
170
170
 
171
171
  const result = await snapshotAction({ _credManager: manager, full: true, channelsOnly: true })
@@ -179,7 +179,7 @@ describe('snapshot command', () => {
179
179
  })
180
180
 
181
181
  describe('--full --users-only', () => {
182
- test('returns only user list', async () => {
182
+ it('returns only user list', async () => {
183
183
  const manager = await setupManager(tempDir)
184
184
 
185
185
  const result = await snapshotAction({ _credManager: manager, full: true, usersOnly: true })
@@ -195,7 +195,7 @@ describe('snapshot command', () => {
195
195
  })
196
196
 
197
197
  describe('--server option', () => {
198
- test('uses explicit server ID', async () => {
198
+ it('uses explicit server ID', async () => {
199
199
  const manager = await setupManager(tempDir)
200
200
 
201
201
  const result = await snapshotAction({ _credManager: manager, server: 'other-guild' })
@@ -206,7 +206,7 @@ describe('snapshot command', () => {
206
206
  })
207
207
 
208
208
  describe('error handling', () => {
209
- test('returns error when no server set', async () => {
209
+ it('returns error when no server set', async () => {
210
210
  const manager = new DiscordBotCredentialManager(tempDir)
211
211
  await manager.setCredentials({
212
212
  token: 'token123',
@@ -219,7 +219,7 @@ describe('snapshot command', () => {
219
219
  expect(result.error).toBeDefined()
220
220
  })
221
221
 
222
- test('returns error on API failure', async () => {
222
+ it('returns error on API failure', async () => {
223
223
  mockListChannels.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
224
224
  const manager = await setupManager(tempDir)
225
225
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -75,7 +75,7 @@ describe('thread commands', () => {
75
75
  })
76
76
 
77
77
  describe('createAction', () => {
78
- test('creates thread successfully', async () => {
78
+ it('creates thread successfully', async () => {
79
79
  const result = await createAction('general', 'test-thread', { _credManager: manager })
80
80
 
81
81
  expect(result.success).toBe(true)
@@ -87,7 +87,7 @@ describe('thread commands', () => {
87
87
  }
88
88
  })
89
89
 
90
- test('includes auto_archive_duration when provided', async () => {
90
+ it('includes auto_archive_duration when provided', async () => {
91
91
  const result = await createAction('general', 'test-thread', {
92
92
  _credManager: manager,
93
93
  autoArchiveDuration: '60',
@@ -98,19 +98,19 @@ describe('thread commands', () => {
98
98
  expect(mockCreateThread).toHaveBeenCalledWith('channel-456', 'test-thread', { auto_archive_duration: 60 })
99
99
  })
100
100
 
101
- test('resolves channel name', async () => {
101
+ it('resolves channel name', async () => {
102
102
  await createAction('general', 'test-thread', { _credManager: manager })
103
103
 
104
104
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
105
105
  })
106
106
 
107
- test('returns error when channel resolution fails', async () => {
107
+ it('returns error when channel resolution fails', async () => {
108
108
  const result = await createAction('nonexistent', 'test-thread', { _credManager: manager })
109
109
 
110
110
  expect(result.error).toContain('Channel not found')
111
111
  })
112
112
 
113
- test('returns error when thread creation fails', async () => {
113
+ it('returns error when thread creation fails', async () => {
114
114
  mockCreateThread.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
115
115
 
116
116
  const result = await createAction('general', 'test-thread', { _credManager: manager })
@@ -120,7 +120,7 @@ describe('thread commands', () => {
120
120
  })
121
121
 
122
122
  describe('archiveAction', () => {
123
- test('archives thread successfully', async () => {
123
+ it('archives thread successfully', async () => {
124
124
  const result = await archiveAction('thread-789', { _credManager: manager })
125
125
 
126
126
  expect(result.success).toBe(true)
@@ -128,7 +128,7 @@ describe('thread commands', () => {
128
128
  expect(mockArchiveThread).toHaveBeenCalledWith('thread-789')
129
129
  })
130
130
 
131
- test('returns error when archive fails', async () => {
131
+ it('returns error when archive fails', async () => {
132
132
  mockArchiveThread.mockImplementationOnce(() => Promise.reject(new Error('Forbidden')))
133
133
 
134
134
  const result = await archiveAction('thread-789', { _credManager: manager })
@@ -138,7 +138,7 @@ describe('thread commands', () => {
138
138
  })
139
139
 
140
140
  describe('action result structure', () => {
141
- test('createAction returns success result with thread info', async () => {
141
+ it('createAction returns success result with thread info', async () => {
142
142
  const result = await createAction('general', 'test-thread', { _credManager: manager })
143
143
 
144
144
  if (!result.error) {
@@ -152,7 +152,7 @@ describe('thread commands', () => {
152
152
  }
153
153
  })
154
154
 
155
- test('archiveAction returns success result with threadId', async () => {
155
+ it('archiveAction returns success result with threadId', async () => {
156
156
  const result = await archiveAction('thread-789', { _credManager: manager })
157
157
 
158
158
  if (!result.error) {
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -61,7 +61,7 @@ describe('user commands', () => {
61
61
  })
62
62
 
63
63
  describe('listAction', () => {
64
- test('lists users from current server', async () => {
64
+ it('lists users from current server', async () => {
65
65
  const manager = new DiscordBotCredentialManager(tempDir)
66
66
  await manager.setCredentials({
67
67
  token: 'token123',
@@ -89,7 +89,7 @@ describe('user commands', () => {
89
89
  })
90
90
  })
91
91
 
92
- test('includes bot users in list', async () => {
92
+ it('includes bot users in list', async () => {
93
93
  const manager = new DiscordBotCredentialManager(tempDir)
94
94
  await manager.setCredentials({
95
95
  token: 'token123',
@@ -105,7 +105,7 @@ describe('user commands', () => {
105
105
  expect(botUser?.username).toBe('mybot')
106
106
  })
107
107
 
108
- test('returns error when no server set', async () => {
108
+ it('returns error when no server set', async () => {
109
109
  const manager = new DiscordBotCredentialManager(tempDir)
110
110
  await manager.setCredentials({
111
111
  token: 'token123',
@@ -119,7 +119,7 @@ describe('user commands', () => {
119
119
  expect(result.error).toContain('No server set')
120
120
  })
121
121
 
122
- test('handles client errors', async () => {
122
+ it('handles client errors', async () => {
123
123
  mockListUsers.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
124
124
 
125
125
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -138,7 +138,7 @@ describe('user commands', () => {
138
138
  })
139
139
 
140
140
  describe('infoAction', () => {
141
- test('returns user info by ID', async () => {
141
+ it('returns user info by ID', async () => {
142
142
  const manager = new DiscordBotCredentialManager(tempDir)
143
143
  await manager.setCredentials({
144
144
  token: 'token123',
@@ -155,7 +155,7 @@ describe('user commands', () => {
155
155
  expect(result.bot).toBe(false)
156
156
  })
157
157
 
158
- test('returns bot user info', async () => {
158
+ it('returns bot user info', async () => {
159
159
  const manager = new DiscordBotCredentialManager(tempDir)
160
160
  await manager.setCredentials({
161
161
  token: 'token123',
@@ -170,7 +170,7 @@ describe('user commands', () => {
170
170
  expect(result.bot).toBe(true)
171
171
  })
172
172
 
173
- test('returns error for nonexistent user', async () => {
173
+ it('returns error for nonexistent user', async () => {
174
174
  const manager = new DiscordBotCredentialManager(tempDir)
175
175
  await manager.setCredentials({
176
176
  token: 'token123',
@@ -184,7 +184,7 @@ describe('user commands', () => {
184
184
  expect(result.error).toContain('User not found')
185
185
  })
186
186
 
187
- test('handles client errors', async () => {
187
+ it('handles client errors', async () => {
188
188
  mockGetUser.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
189
189
 
190
190
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -45,7 +45,7 @@ describe('whoami command', () => {
45
45
  process.env = originalEnv
46
46
  })
47
47
 
48
- test('returns auth info for current bot', async () => {
48
+ it('returns auth info for current bot', async () => {
49
49
  const manager = new DiscordBotCredentialManager(tempDir)
50
50
  await manager.setCredentials({
51
51
  token: 'bot-token-123',
@@ -63,7 +63,7 @@ describe('whoami command', () => {
63
63
  expect(result.error).toBeUndefined()
64
64
  })
65
65
 
66
- test('returns auth info for specific --bot', async () => {
66
+ it('returns auth info for specific --bot', async () => {
67
67
  const manager = new DiscordBotCredentialManager(tempDir)
68
68
  await manager.setCredentials({
69
69
  token: 'bot-token-123',
@@ -78,7 +78,7 @@ describe('whoami command', () => {
78
78
  expect(mockTestAuth).toHaveBeenCalledTimes(1)
79
79
  })
80
80
 
81
- test('returns error when client throws', async () => {
81
+ it('returns error when client throws', async () => {
82
82
  mockTestAuth.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
83
83
 
84
84
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -1,6 +1,6 @@
1
1
  import { Command } from 'commander'
2
2
 
3
- import { formatOutput } from '@/shared/utils/output'
3
+ import { cliOutput } from '@/shared/utils/cli-output'
4
4
 
5
5
  import type { BotOption } from './shared'
6
6
  import { getClient } from './shared'
@@ -30,11 +30,6 @@ export async function whoamiAction(options: BotOption): Promise<WhoamiResult> {
30
30
  }
31
31
  }
32
32
 
33
- function cliOutput(result: WhoamiResult, pretty?: boolean): void {
34
- console.log(formatOutput(result, pretty))
35
- if (result.error) process.exit(1)
36
- }
37
-
38
33
  export const whoamiCommand = new Command('whoami')
39
34
  .description('Show current authenticated bot')
40
35
  .option('--bot <id>', 'Bot ID to use')
@@ -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'
@@ -38,7 +38,7 @@ describe('DiscordBotCredentialManager', () => {
38
38
  })
39
39
 
40
40
  describe('load', () => {
41
- test('returns empty config when no file exists', async () => {
41
+ it('returns empty config when no file exists', async () => {
42
42
  const config = await manager.load()
43
43
 
44
44
  expect(config.current).toBeNull()
@@ -49,7 +49,7 @@ describe('DiscordBotCredentialManager', () => {
49
49
  })
50
50
 
51
51
  describe('save and load', () => {
52
- test('persists config to file', async () => {
52
+ it('persists config to file', async () => {
53
53
  const config = {
54
54
  current: { bot_id: 'bot-123' },
55
55
  bots: {
@@ -67,11 +67,11 @@ describe('DiscordBotCredentialManager', () => {
67
67
  })
68
68
 
69
69
  describe('getCredentials', () => {
70
- test('returns null when no credentials exist', async () => {
70
+ it('returns null when no credentials exist', async () => {
71
71
  expect(await manager.getCredentials()).toBeNull()
72
72
  })
73
73
 
74
- test('returns current bot credentials', async () => {
74
+ it('returns current bot credentials', async () => {
75
75
  await manager.setCredentials(CREDS_A)
76
76
 
77
77
  const creds = await manager.getCredentials()
@@ -79,7 +79,7 @@ describe('DiscordBotCredentialManager', () => {
79
79
  expect(creds).toEqual(CREDS_A)
80
80
  })
81
81
 
82
- test('returns specific bot by id', async () => {
82
+ it('returns specific bot by id', async () => {
83
83
  await manager.setCredentials(CREDS_A)
84
84
  await manager.setCredentials(CREDS_B)
85
85
 
@@ -88,7 +88,7 @@ describe('DiscordBotCredentialManager', () => {
88
88
  expect(creds).toEqual(CREDS_A)
89
89
  })
90
90
 
91
- test('returns null for non-existent bot id', async () => {
91
+ it('returns null for non-existent bot id', async () => {
92
92
  await manager.setCredentials(CREDS_A)
93
93
 
94
94
  const creds = await manager.getCredentials('nonexistent')
@@ -96,7 +96,7 @@ describe('DiscordBotCredentialManager', () => {
96
96
  expect(creds).toBeNull()
97
97
  })
98
98
 
99
- test('env vars take precedence when no botId specified', async () => {
99
+ it('env vars take precedence when no botId specified', async () => {
100
100
  await manager.setCredentials(CREDS_A)
101
101
 
102
102
  process.env.E2E_DISCORDBOT_TOKEN = 'env-token'
@@ -112,7 +112,7 @@ describe('DiscordBotCredentialManager', () => {
112
112
  expect(creds?.server_name).toBe('Env Server')
113
113
  })
114
114
 
115
- test('env vars ignored when botId explicitly provided', async () => {
115
+ it('env vars ignored when botId explicitly provided', async () => {
116
116
  await manager.setCredentials(CREDS_A)
117
117
 
118
118
  process.env.E2E_DISCORDBOT_TOKEN = 'env-token'
@@ -124,7 +124,7 @@ describe('DiscordBotCredentialManager', () => {
124
124
  expect(creds?.bot_id).toBe('bot-123')
125
125
  })
126
126
 
127
- test('env vars use default server name when not provided', async () => {
127
+ it('env vars use default server name when not provided', async () => {
128
128
  process.env.E2E_DISCORDBOT_TOKEN = 'env-token'
129
129
  process.env.E2E_DISCORDBOT_SERVER_ID = 'server-789'
130
130
  delete process.env.E2E_DISCORDBOT_SERVER_NAME
@@ -136,7 +136,7 @@ describe('DiscordBotCredentialManager', () => {
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('DiscordBotCredentialManager', () => {
144
144
  expect(config.bots['bot-123'].token).toBe('bot-token-a')
145
145
  })
146
146
 
147
- test('stores multiple bots', async () => {
147
+ it('stores multiple bots', async () => {
148
148
  await manager.setCredentials(CREDS_A)
149
149
  await manager.setCredentials(CREDS_B)
150
150
 
@@ -153,7 +153,7 @@ describe('DiscordBotCredentialManager', () => {
153
153
  expect(config.current).toEqual({ bot_id: 'bot-456' })
154
154
  })
155
155
 
156
- test('overwrites existing bot with same id', async () => {
156
+ it('overwrites existing bot with same id', async () => {
157
157
  await manager.setCredentials(CREDS_A)
158
158
  const updated = { ...CREDS_A, bot_name: 'Updated Bot A' }
159
159
  await manager.setCredentials(updated)
@@ -165,7 +165,7 @@ describe('DiscordBotCredentialManager', () => {
165
165
  })
166
166
 
167
167
  describe('listAll', () => {
168
- test('returns all bots with current flag', async () => {
168
+ it('returns all bots with current flag', async () => {
169
169
  await manager.setCredentials(CREDS_A)
170
170
  await manager.setCredentials(CREDS_B)
171
171
 
@@ -176,7 +176,7 @@ describe('DiscordBotCredentialManager', () => {
176
176
  expect(all.find((b) => b.bot_id === 'bot-456')?.is_current).toBe(true)
177
177
  })
178
178
 
179
- test('returns empty array when no bots exist', async () => {
179
+ it('returns empty array when no bots exist', async () => {
180
180
  const all = await manager.listAll()
181
181
 
182
182
  expect(all).toEqual([])
@@ -184,7 +184,7 @@ describe('DiscordBotCredentialManager', () => {
184
184
  })
185
185
 
186
186
  describe('setCurrent', () => {
187
- test('switches current bot', async () => {
187
+ it('switches current bot', async () => {
188
188
  await manager.setCredentials(CREDS_A)
189
189
  await manager.setCredentials(CREDS_B)
190
190
 
@@ -195,13 +195,13 @@ describe('DiscordBotCredentialManager', () => {
195
195
  expect(creds?.bot_id).toBe('bot-123')
196
196
  })
197
197
 
198
- test('returns false for unknown bot', async () => {
198
+ it('returns false for unknown bot', async () => {
199
199
  expect(await manager.setCurrent('nonexistent')).toBe(false)
200
200
  })
201
201
  })
202
202
 
203
203
  describe('removeBot', () => {
204
- test('removes a bot by id', async () => {
204
+ it('removes a bot by id', async () => {
205
205
  await manager.setCredentials(CREDS_A)
206
206
  await manager.setCredentials(CREDS_B)
207
207
 
@@ -212,7 +212,7 @@ describe('DiscordBotCredentialManager', () => {
212
212
  expect(Object.keys(config.bots)).toEqual(['bot-456'])
213
213
  })
214
214
 
215
- test('clears current when current bot removed', async () => {
215
+ it('clears current when current bot removed', async () => {
216
216
  await manager.setCredentials(CREDS_A)
217
217
 
218
218
  await manager.removeBot('bot-123')
@@ -221,11 +221,11 @@ describe('DiscordBotCredentialManager', () => {
221
221
  expect(config.current).toBeNull()
222
222
  })
223
223
 
224
- test('returns false for unknown bot', async () => {
224
+ it('returns false for unknown bot', async () => {
225
225
  expect(await manager.removeBot('nonexistent')).toBe(false)
226
226
  })
227
227
 
228
- test('does not clear current if removing non-current bot', async () => {
228
+ it('does not clear current if removing non-current bot', async () => {
229
229
  await manager.setCredentials(CREDS_A)
230
230
  await manager.setCredentials(CREDS_B)
231
231
 
@@ -237,7 +237,7 @@ describe('DiscordBotCredentialManager', () => {
237
237
  })
238
238
 
239
239
  describe('clearCredentials', () => {
240
- test('removes all credentials', async () => {
240
+ it('removes all credentials', async () => {
241
241
  await manager.setCredentials(CREDS_A)
242
242
  await manager.setCredentials(CREDS_B)
243
243
 
@@ -252,13 +252,13 @@ describe('DiscordBotCredentialManager', () => {
252
252
  })
253
253
 
254
254
  describe('getCurrentServer', () => {
255
- test('returns null when no server set', async () => {
255
+ it('returns null when no server set', async () => {
256
256
  const serverId = await manager.getCurrentServer()
257
257
 
258
258
  expect(serverId).toBeNull()
259
259
  })
260
260
 
261
- test('returns current server id', async () => {
261
+ it('returns current server id', async () => {
262
262
  await manager.setCurrentServer('guild-123', 'My Server')
263
263
 
264
264
  const serverId = await manager.getCurrentServer()
@@ -268,7 +268,7 @@ describe('DiscordBotCredentialManager', () => {
268
268
  })
269
269
 
270
270
  describe('setCurrentServer', () => {
271
- test('sets current server and adds to servers map', async () => {
271
+ it('sets current server and adds to servers map', async () => {
272
272
  await manager.setCurrentServer('guild-123', 'My Server')
273
273
 
274
274
  const config = await manager.load()
@@ -279,7 +279,7 @@ describe('DiscordBotCredentialManager', () => {
279
279
  })
280
280
  })
281
281
 
282
- test('updates existing server entry', async () => {
282
+ it('updates existing server entry', async () => {
283
283
  await manager.setCurrentServer('guild-123', 'My Server')
284
284
  await manager.setCurrentServer('guild-123', 'Updated Server')
285
285
 
@@ -287,7 +287,7 @@ describe('DiscordBotCredentialManager', () => {
287
287
  expect(config.servers['guild-123'].server_name).toBe('Updated Server')
288
288
  })
289
289
 
290
- test('switches current server', async () => {
290
+ it('switches current server', async () => {
291
291
  await manager.setCurrentServer('guild-123', 'Server A')
292
292
  await manager.setCurrentServer('guild-456', 'Server B')
293
293
 
@@ -298,7 +298,7 @@ describe('DiscordBotCredentialManager', () => {
298
298
  })
299
299
 
300
300
  describe('file permissions', () => {
301
- test('saves file with secure permissions (600)', async () => {
301
+ it('saves file with secure permissions (600)', async () => {
302
302
  await manager.setCredentials(CREDS_A)
303
303
 
304
304
  const credPath = join(tempDir, 'discordbot-credentials.json')
@@ -0,0 +1,82 @@
1
+ import { expect, it } from 'bun:test'
2
+
3
+ import {
4
+ DiscordBotClient,
5
+ DiscordBotConfigSchema,
6
+ DiscordBotCredentialManager,
7
+ DiscordBotCredentialsSchema,
8
+ DiscordBotEntrySchema,
9
+ DiscordBotError,
10
+ DiscordBotListener,
11
+ DiscordChannelSchema,
12
+ DiscordFileSchema,
13
+ DiscordGatewayOpcode,
14
+ DiscordGuildSchema,
15
+ DiscordIntent,
16
+ DiscordMessageSchema,
17
+ DiscordReactionSchema,
18
+ DiscordUserSchema,
19
+ } from '@/platforms/discordbot/index'
20
+
21
+ it('DiscordBotClient is exported from barrel', () => {
22
+ expect(typeof DiscordBotClient).toBe('function')
23
+ })
24
+
25
+ it('DiscordBotError is exported from barrel', () => {
26
+ expect(typeof DiscordBotError).toBe('function')
27
+ })
28
+
29
+ it('DiscordBotCredentialManager is exported from barrel', () => {
30
+ expect(typeof DiscordBotCredentialManager).toBe('function')
31
+ })
32
+
33
+ it('DiscordBotListener is exported from barrel', () => {
34
+ expect(typeof DiscordBotListener).toBe('function')
35
+ })
36
+
37
+ it('DiscordGatewayOpcode is exported from barrel', () => {
38
+ expect(DiscordGatewayOpcode.Identify).toBe(2)
39
+ expect(DiscordGatewayOpcode.Hello).toBe(10)
40
+ })
41
+
42
+ it('DiscordIntent is exported from barrel', () => {
43
+ expect(DiscordIntent.Guilds).toBe(1)
44
+ expect(DiscordIntent.GuildMessages).toBe(1 << 9)
45
+ expect(DiscordIntent.MessageContent).toBe(1 << 15)
46
+ })
47
+
48
+ it('DiscordBotEntrySchema is exported from barrel', () => {
49
+ expect(typeof DiscordBotEntrySchema.parse).toBe('function')
50
+ })
51
+
52
+ it('DiscordBotConfigSchema is exported from barrel', () => {
53
+ expect(typeof DiscordBotConfigSchema.parse).toBe('function')
54
+ })
55
+
56
+ it('DiscordBotCredentialsSchema is exported from barrel', () => {
57
+ expect(typeof DiscordBotCredentialsSchema.parse).toBe('function')
58
+ })
59
+
60
+ it('DiscordGuildSchema is exported from barrel', () => {
61
+ expect(typeof DiscordGuildSchema.parse).toBe('function')
62
+ })
63
+
64
+ it('DiscordChannelSchema is exported from barrel', () => {
65
+ expect(typeof DiscordChannelSchema.parse).toBe('function')
66
+ })
67
+
68
+ it('DiscordMessageSchema is exported from barrel', () => {
69
+ expect(typeof DiscordMessageSchema.parse).toBe('function')
70
+ })
71
+
72
+ it('DiscordUserSchema is exported from barrel', () => {
73
+ expect(typeof DiscordUserSchema.parse).toBe('function')
74
+ })
75
+
76
+ it('DiscordReactionSchema is exported from barrel', () => {
77
+ expect(typeof DiscordReactionSchema.parse).toBe('function')
78
+ })
79
+
80
+ it('DiscordFileSchema is exported from barrel', () => {
81
+ expect(typeof DiscordFileSchema.parse).toBe('function')
82
+ })