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,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 { DiscordBotClient } from '../client'
@@ -163,11 +164,6 @@ export async function removeAction(botId: string, options: ActionOptions): Promi
163
164
  }
164
165
  }
165
166
 
166
- function cliOutput(result: ActionResult, pretty?: boolean, exitOnError = true): void {
167
- console.log(formatOutput(result, pretty))
168
- if (result.error && exitOnError) process.exit(1)
169
- }
170
-
171
167
  export const authCommand = new Command('auth')
172
168
  .description('Bot authentication commands')
173
169
  .addCommand(
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -66,7 +66,7 @@ describe('channel commands', () => {
66
66
  })
67
67
 
68
68
  describe('listAction', () => {
69
- test('lists text channels from current server', async () => {
69
+ it('lists text channels from current server', async () => {
70
70
  const manager = new DiscordBotCredentialManager(tempDir)
71
71
  await manager.setCredentials({
72
72
  token: 'token123',
@@ -90,7 +90,7 @@ describe('channel commands', () => {
90
90
  })
91
91
  })
92
92
 
93
- test('filters out non-text channels', async () => {
93
+ it('filters out non-text channels', async () => {
94
94
  const manager = new DiscordBotCredentialManager(tempDir)
95
95
  await manager.setCredentials({
96
96
  token: 'token123',
@@ -105,7 +105,7 @@ describe('channel commands', () => {
105
105
  expect(hasVoiceChannel).toBe(false)
106
106
  })
107
107
 
108
- test('returns error when no server set', async () => {
108
+ it('returns error when no server set', async () => {
109
109
  const manager = new DiscordBotCredentialManager(tempDir)
110
110
  await manager.setCredentials({
111
111
  token: 'token123',
@@ -119,7 +119,7 @@ describe('channel commands', () => {
119
119
  expect(result.error).toContain('No server set')
120
120
  })
121
121
 
122
- test('handles client errors', async () => {
122
+ it('handles client errors', async () => {
123
123
  mockListChannels.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
124
124
 
125
125
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -138,7 +138,7 @@ describe('channel commands', () => {
138
138
  })
139
139
 
140
140
  describe('infoAction', () => {
141
- test('returns channel info by ID', async () => {
141
+ it('returns channel info by ID', async () => {
142
142
  const manager = new DiscordBotCredentialManager(tempDir)
143
143
  await manager.setCredentials({
144
144
  token: 'token123',
@@ -156,7 +156,7 @@ describe('channel commands', () => {
156
156
  expect(result.guild_id).toBe('guild1')
157
157
  })
158
158
 
159
- test('resolves channel by name', async () => {
159
+ it('resolves channel by name', async () => {
160
160
  const manager = new DiscordBotCredentialManager(tempDir)
161
161
  await manager.setCredentials({
162
162
  token: 'token123',
@@ -171,7 +171,7 @@ describe('channel commands', () => {
171
171
  expect(result.name).toBe('general')
172
172
  })
173
173
 
174
- test('resolves channel by name with hash prefix', async () => {
174
+ it('resolves channel by name with hash prefix', async () => {
175
175
  const manager = new DiscordBotCredentialManager(tempDir)
176
176
  await manager.setCredentials({
177
177
  token: 'token123',
@@ -186,7 +186,7 @@ describe('channel commands', () => {
186
186
  expect(result.name).toBe('announcements')
187
187
  })
188
188
 
189
- test('returns error for nonexistent channel', async () => {
189
+ it('returns error for nonexistent channel', async () => {
190
190
  const manager = new DiscordBotCredentialManager(tempDir)
191
191
  await manager.setCredentials({
192
192
  token: 'token123',
@@ -201,7 +201,7 @@ describe('channel commands', () => {
201
201
  expect(result.error).toContain('Channel not found')
202
202
  })
203
203
 
204
- test('returns error when no server set', async () => {
204
+ it('returns error when no server set', async () => {
205
205
  const manager = new DiscordBotCredentialManager(tempDir)
206
206
  await manager.setCredentials({
207
207
  token: 'token123',
@@ -215,7 +215,7 @@ describe('channel commands', () => {
215
215
  expect(result.error).toContain('No server set')
216
216
  })
217
217
 
218
- test('handles client errors', async () => {
218
+ it('handles client errors', async () => {
219
219
  mockGetChannel.mockImplementationOnce(() => Promise.reject(new Error('Channel not found')))
220
220
 
221
221
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -71,7 +71,7 @@ describe('file commands', () => {
71
71
  })
72
72
 
73
73
  describe('uploadAction', () => {
74
- it('should upload file successfully', async () => {
74
+ it('uploads file successfully', async () => {
75
75
  const result = await uploadAction('general', './test.txt', {
76
76
  ...options,
77
77
  _credManager: mockCredManager,
@@ -80,12 +80,12 @@ describe('file commands', () => {
80
80
  expect(result).toBeDefined()
81
81
  })
82
82
 
83
- it('should return error when channel resolution fails', async () => {
83
+ it('returns error when channel resolution fails', async () => {
84
84
  const result = await uploadAction('nonexistent', './test.txt', options)
85
85
  expect(result.error).toBeDefined()
86
86
  })
87
87
 
88
- it('should return error when file does not exist', async () => {
88
+ it('returns error when file does not exist', async () => {
89
89
  const result = await uploadAction('general', '/nonexistent/file.txt', {
90
90
  ...options,
91
91
  _credManager: mockCredManager,
@@ -95,7 +95,7 @@ describe('file commands', () => {
95
95
  })
96
96
 
97
97
  describe('listAction', () => {
98
- it('should list files successfully', async () => {
98
+ it('lists files successfully', async () => {
99
99
  const result = await listAction('general', {
100
100
  ...options,
101
101
  _credManager: mockCredManager,
@@ -104,14 +104,14 @@ describe('file commands', () => {
104
104
  expect(result).toBeDefined()
105
105
  })
106
106
 
107
- it('should return error when channel resolution fails', async () => {
107
+ it('returns error when channel resolution fails', async () => {
108
108
  const result = await listAction('nonexistent', options)
109
109
  expect(result.error).toBeDefined()
110
110
  })
111
111
  })
112
112
 
113
113
  describe('action result structure', () => {
114
- it('uploadAction should return success result with file info', async () => {
114
+ it('returns success result with file info for uploadAction', async () => {
115
115
  const result = await uploadAction('general', './test.txt', {
116
116
  ...options,
117
117
  _credManager: mockCredManager,
@@ -129,7 +129,7 @@ describe('file commands', () => {
129
129
  }
130
130
  })
131
131
 
132
- it('listAction should return success result with files array', async () => {
132
+ it('returns success result with files array for listAction', async () => {
133
133
  const result = await listAction('general', {
134
134
  ...options,
135
135
  _credManager: mockCredManager,
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -120,7 +120,7 @@ describe('message commands', () => {
120
120
  })
121
121
 
122
122
  describe('sendAction', () => {
123
- test('sends message to channel by name', async () => {
123
+ it('sends message to channel by name', async () => {
124
124
  const result = await sendAction('general', 'hello world', { _credManager: manager })
125
125
 
126
126
  expect(result.id).toBe('msg1')
@@ -130,7 +130,7 @@ describe('message commands', () => {
130
130
  expect(mockSendMessage).toHaveBeenCalledWith('ch1', 'hello world', { thread_id: undefined })
131
131
  })
132
132
 
133
- test('sends message to channel by ID', async () => {
133
+ it('sends message to channel by ID', async () => {
134
134
  const result = await sendAction('123456', 'hi', { _credManager: manager })
135
135
 
136
136
  expect(result.id).toBe('msg1')
@@ -138,7 +138,7 @@ describe('message commands', () => {
138
138
  expect(mockSendMessage).toHaveBeenCalledWith('123456', 'hi', { thread_id: undefined })
139
139
  })
140
140
 
141
- test('sends message to thread', async () => {
141
+ it('sends message to thread', async () => {
142
142
  const result = await sendAction('general', 'thread reply', {
143
143
  _credManager: manager,
144
144
  thread: 'thread123',
@@ -148,13 +148,13 @@ describe('message commands', () => {
148
148
  expect(mockSendMessage).toHaveBeenCalledWith('ch1', 'thread reply', { thread_id: 'thread123' })
149
149
  })
150
150
 
151
- test('returns error on channel not found', async () => {
151
+ it('returns error on channel not found', async () => {
152
152
  const result = await sendAction('unknown', 'hi', { _credManager: manager })
153
153
 
154
154
  expect(result.error).toContain('Channel not found')
155
155
  })
156
156
 
157
- test('returns error on client failure', async () => {
157
+ it('returns error on client failure', async () => {
158
158
  mockSendMessage.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
159
159
 
160
160
  const result = await sendAction('general', 'hi', { _credManager: manager })
@@ -164,7 +164,7 @@ describe('message commands', () => {
164
164
  })
165
165
 
166
166
  describe('listAction', () => {
167
- test('lists messages in channel', async () => {
167
+ it('lists messages in channel', async () => {
168
168
  const result = await listAction('general', { _credManager: manager })
169
169
 
170
170
  expect(result.messages).toHaveLength(2)
@@ -174,25 +174,25 @@ describe('message commands', () => {
174
174
  expect(mockGetMessages).toHaveBeenCalledWith('ch1', 50)
175
175
  })
176
176
 
177
- test('uses custom limit', async () => {
177
+ it('uses custom limit', async () => {
178
178
  await listAction('general', { _credManager: manager, limit: '10' })
179
179
 
180
180
  expect(mockGetMessages).toHaveBeenCalledWith('ch1', 10)
181
181
  })
182
182
 
183
- test('defaults to 50 messages', async () => {
183
+ it('defaults to 50 messages', async () => {
184
184
  await listAction('general', { _credManager: manager })
185
185
 
186
186
  expect(mockGetMessages).toHaveBeenCalledWith('ch1', 50)
187
187
  })
188
188
 
189
- test('resolves channel name', async () => {
189
+ it('resolves channel name', async () => {
190
190
  await listAction('general', { _credManager: manager })
191
191
 
192
192
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
193
193
  })
194
194
 
195
- test('returns error on failure', async () => {
195
+ it('returns error on failure', async () => {
196
196
  mockGetMessages.mockImplementationOnce(() => Promise.reject(new Error('Forbidden')))
197
197
 
198
198
  const result = await listAction('general', { _credManager: manager })
@@ -202,7 +202,7 @@ describe('message commands', () => {
202
202
  })
203
203
 
204
204
  describe('getAction', () => {
205
- test('gets a single message', async () => {
205
+ it('gets a single message', async () => {
206
206
  const result = await getAction('general', 'msg1', { _credManager: manager })
207
207
 
208
208
  expect(result.id).toBe('msg1')
@@ -211,13 +211,13 @@ describe('message commands', () => {
211
211
  expect(mockGetMessage).toHaveBeenCalledWith('ch1', 'msg1')
212
212
  })
213
213
 
214
- test('resolves channel name', async () => {
214
+ it('resolves channel name', async () => {
215
215
  await getAction('general', 'msg1', { _credManager: manager })
216
216
 
217
217
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
218
218
  })
219
219
 
220
- test('returns error on failure', async () => {
220
+ it('returns error on failure', async () => {
221
221
  mockGetMessage.mockImplementationOnce(() => Promise.reject(new Error('Not Found')))
222
222
 
223
223
  const result = await getAction('general', 'msg999', { _credManager: manager })
@@ -227,7 +227,7 @@ describe('message commands', () => {
227
227
  })
228
228
 
229
229
  describe('updateAction', () => {
230
- test('updates a message', async () => {
230
+ it('updates a message', async () => {
231
231
  const result = await updateAction('general', 'msg1', 'updated text', { _credManager: manager })
232
232
 
233
233
  expect(result.id).toBe('msg1')
@@ -236,13 +236,13 @@ describe('message commands', () => {
236
236
  expect(mockEditMessage).toHaveBeenCalledWith('ch1', 'msg1', 'updated text')
237
237
  })
238
238
 
239
- test('resolves channel name', async () => {
239
+ it('resolves channel name', async () => {
240
240
  await updateAction('general', 'msg1', 'new', { _credManager: manager })
241
241
 
242
242
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
243
243
  })
244
244
 
245
- test('returns error on failure', async () => {
245
+ it('returns error on failure', async () => {
246
246
  mockEditMessage.mockImplementationOnce(() => Promise.reject(new Error('Cannot edit')))
247
247
 
248
248
  const result = await updateAction('general', 'msg1', 'new', { _credManager: manager })
@@ -252,34 +252,34 @@ describe('message commands', () => {
252
252
  })
253
253
 
254
254
  describe('deleteAction', () => {
255
- test('deletes message with --force', async () => {
255
+ it('deletes message with --force', async () => {
256
256
  const result = await deleteAction('general', 'msg1', { _credManager: manager, force: true })
257
257
 
258
258
  expect(result.deleted).toBe('msg1')
259
259
  expect(mockDeleteMessage).toHaveBeenCalledWith('ch1', 'msg1')
260
260
  })
261
261
 
262
- test('returns error without --force', async () => {
262
+ it('returns error without --force', async () => {
263
263
  const result = await deleteAction('general', 'msg1', { _credManager: manager })
264
264
 
265
265
  expect(result.error).toBe('Use --force to confirm deletion')
266
266
  expect(mockDeleteMessage).not.toHaveBeenCalled()
267
267
  })
268
268
 
269
- test('returns error with force=false', async () => {
269
+ it('returns error with force=false', async () => {
270
270
  const result = await deleteAction('general', 'msg1', { _credManager: manager, force: false })
271
271
 
272
272
  expect(result.error).toBe('Use --force to confirm deletion')
273
273
  expect(mockDeleteMessage).not.toHaveBeenCalled()
274
274
  })
275
275
 
276
- test('resolves channel name', async () => {
276
+ it('resolves channel name', async () => {
277
277
  await deleteAction('general', 'msg1', { _credManager: manager, force: true })
278
278
 
279
279
  expect(mockResolveChannel).toHaveBeenCalledWith('guild1', 'general')
280
280
  })
281
281
 
282
- test('returns error on failure', async () => {
282
+ it('returns error on failure', async () => {
283
283
  mockDeleteMessage.mockImplementationOnce(() => Promise.reject(new Error('Forbidden')))
284
284
 
285
285
  const result = await deleteAction('general', 'msg1', { _credManager: manager, force: true })
@@ -289,20 +289,20 @@ describe('message commands', () => {
289
289
  })
290
290
 
291
291
  describe('repliesAction', () => {
292
- test('fetches thread messages', async () => {
292
+ it('fetches thread messages', async () => {
293
293
  const result = await repliesAction('general', 'thread1', { _credManager: manager })
294
294
 
295
295
  expect(result.messages).toHaveLength(2)
296
296
  expect(mockGetMessages).toHaveBeenCalledWith('thread1', 50)
297
297
  })
298
298
 
299
- test('uses custom limit', async () => {
299
+ it('uses custom limit', async () => {
300
300
  await repliesAction('general', 'thread1', { _credManager: manager, limit: '25' })
301
301
 
302
302
  expect(mockGetMessages).toHaveBeenCalledWith('thread1', 25)
303
303
  })
304
304
 
305
- test('returns error on failure', async () => {
305
+ it('returns error on failure', async () => {
306
306
  mockGetMessages.mockImplementationOnce(() => Promise.reject(new Error('Thread not found')))
307
307
 
308
308
  const result = await repliesAction('general', 'thread999', { _credManager: manager })
@@ -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, getCurrentServer } from './shared'
@@ -165,11 +165,6 @@ export async function repliesAction(
165
165
  }
166
166
  }
167
167
 
168
- function cliOutput(result: MessageResult, pretty?: boolean): void {
169
- console.log(formatOutput(result, pretty))
170
- if (result.error) process.exit(1)
171
- }
172
-
173
168
  export const messageCommand = new Command('message')
174
169
  .description('Message commands')
175
170
  .addCommand(
@@ -19,7 +19,7 @@ describe('reaction commands', () => {
19
19
  })
20
20
 
21
21
  describe('addAction', () => {
22
- it('should add reaction successfully', async () => {
22
+ it('adds reaction successfully', async () => {
23
23
  const result = await addAction('general', 'msg-456', '👍', {
24
24
  ...options,
25
25
  _credManager: mockCredManager,
@@ -28,14 +28,14 @@ describe('reaction commands', () => {
28
28
  expect(result).toBeDefined()
29
29
  })
30
30
 
31
- it('should return error when channel resolution fails', async () => {
31
+ it('returns error when channel resolution fails', async () => {
32
32
  const result = await addAction('nonexistent', 'msg-456', '👍', options)
33
33
  expect(result.error).toBeDefined()
34
34
  })
35
35
  })
36
36
 
37
37
  describe('removeAction', () => {
38
- it('should remove reaction successfully', async () => {
38
+ it('removes reaction successfully', async () => {
39
39
  const result = await removeAction('general', 'msg-456', '👍', {
40
40
  ...options,
41
41
  _credManager: mockCredManager,
@@ -44,14 +44,14 @@ describe('reaction commands', () => {
44
44
  expect(result).toBeDefined()
45
45
  })
46
46
 
47
- it('should return error when channel resolution fails', async () => {
47
+ it('returns error when channel resolution fails', async () => {
48
48
  const result = await removeAction('nonexistent', 'msg-456', '👍', options)
49
49
  expect(result.error).toBeDefined()
50
50
  })
51
51
  })
52
52
 
53
53
  describe('action result structure', () => {
54
- it('addAction should return success result with channel, messageId, emoji', async () => {
54
+ it('returns success result with channel, messageId, and emoji for addAction', async () => {
55
55
  const result = await addAction('general', 'msg-456', '👍', {
56
56
  ...options,
57
57
  _credManager: mockCredManager,
@@ -64,7 +64,7 @@ describe('reaction commands', () => {
64
64
  }
65
65
  })
66
66
 
67
- it('removeAction should return success result with channel, messageId, emoji', async () => {
67
+ it('returns success result with channel, messageId, and emoji for removeAction', async () => {
68
68
  const result = await removeAction('general', 'msg-456', '👍', {
69
69
  ...options,
70
70
  _credManager: mockCredManager,
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -56,7 +56,7 @@ describe('server commands', () => {
56
56
  })
57
57
 
58
58
  describe('listAction', () => {
59
- test('lists all servers from client', async () => {
59
+ it('lists all servers from client', async () => {
60
60
  const manager = new DiscordBotCredentialManager(tempDir)
61
61
  await manager.setCredentials({
62
62
  token: 'token123',
@@ -79,7 +79,7 @@ describe('server commands', () => {
79
79
  })
80
80
  })
81
81
 
82
- test('marks current server in list', async () => {
82
+ it('marks current server in list', async () => {
83
83
  const manager = new DiscordBotCredentialManager(tempDir)
84
84
  await manager.setCredentials({
85
85
  token: 'token123',
@@ -94,7 +94,7 @@ describe('server commands', () => {
94
94
  expect(result.servers?.[1].current).toBe(false)
95
95
  })
96
96
 
97
- test('handles client errors', async () => {
97
+ it('handles client errors', async () => {
98
98
  mockListGuilds.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
99
99
 
100
100
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -112,7 +112,7 @@ describe('server commands', () => {
112
112
  })
113
113
 
114
114
  describe('currentAction', () => {
115
- test('returns current server info', async () => {
115
+ it('returns current server info', async () => {
116
116
  const manager = new DiscordBotCredentialManager(tempDir)
117
117
  await manager.setCredentials({
118
118
  token: 'token123',
@@ -127,7 +127,7 @@ describe('server commands', () => {
127
127
  expect(result.name).toBe('Test Guild')
128
128
  })
129
129
 
130
- test('returns error when no server set', async () => {
130
+ it('returns error when no server set', async () => {
131
131
  const manager = new DiscordBotCredentialManager(tempDir)
132
132
  await manager.setCredentials({
133
133
  token: 'token123',
@@ -141,7 +141,7 @@ describe('server commands', () => {
141
141
  expect(result.error).toContain('No server set')
142
142
  })
143
143
 
144
- test('handles client errors', async () => {
144
+ it('handles client errors', async () => {
145
145
  mockGetGuild.mockImplementationOnce(() => Promise.reject(new Error('Guild not found')))
146
146
 
147
147
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -160,7 +160,7 @@ describe('server commands', () => {
160
160
  })
161
161
 
162
162
  describe('switchAction', () => {
163
- test('switches to a new server', async () => {
163
+ it('switches to a new server', async () => {
164
164
  const manager = new DiscordBotCredentialManager(tempDir)
165
165
  await manager.setCredentials({
166
166
  token: 'token123',
@@ -177,7 +177,7 @@ describe('server commands', () => {
177
177
  expect(currentServer).toBe('guild2')
178
178
  })
179
179
 
180
- test('updates server name in credential manager', async () => {
180
+ it('updates server name in credential manager', async () => {
181
181
  const manager = new DiscordBotCredentialManager(tempDir)
182
182
  await manager.setCredentials({
183
183
  token: 'token123',
@@ -194,7 +194,7 @@ describe('server commands', () => {
194
194
  })
195
195
  })
196
196
 
197
- test('handles client errors', async () => {
197
+ it('handles client errors', async () => {
198
198
  mockGetGuild.mockImplementationOnce(() => Promise.reject(new Error('Unauthorized')))
199
199
 
200
200
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -212,7 +212,7 @@ describe('server commands', () => {
212
212
  })
213
213
 
214
214
  describe('infoAction', () => {
215
- test('returns server info', async () => {
215
+ it('returns server info', async () => {
216
216
  const manager = new DiscordBotCredentialManager(tempDir)
217
217
  await manager.setCredentials({
218
218
  token: 'token123',
@@ -228,7 +228,7 @@ describe('server commands', () => {
228
228
  expect(result.owner).toBe(true)
229
229
  })
230
230
 
231
- test('handles client errors', async () => {
231
+ it('handles client errors', async () => {
232
232
  mockGetGuild.mockImplementationOnce(() => Promise.reject(new Error('Guild not found')))
233
233
 
234
234
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -1,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 { DiscordBotCredentialManager } from '../credential-manager'
6
6
  import type { BotOption } from './shared'
@@ -82,10 +82,6 @@ export async function infoAction(serverId: string, options: BotOption): Promise<
82
82
  }
83
83
  }
84
84
 
85
- const cliOutput = (result: ActionResult, pretty?: boolean) => {
86
- console.log(formatOutput(result, pretty))
87
- }
88
-
89
85
  export const serverCommand = new Command('server')
90
86
  .description('Server commands')
91
87
  .addCommand(