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, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { WhatsAppBotClient } from '@/platforms/whatsappbot/client'
4
4
  import { WhatsAppBotError } from '@/platforms/whatsappbot/types'
@@ -50,7 +50,7 @@ describe('WhatsAppBotClient', () => {
50
50
  }
51
51
 
52
52
  describe('login', () => {
53
- test('throws on empty phoneNumberId', async () => {
53
+ it('throws on empty phoneNumberId', async () => {
54
54
  await expect(new WhatsAppBotClient().login({ phoneNumberId: '', accessToken: 'access-token' })).rejects.toThrow(
55
55
  WhatsAppBotError,
56
56
  )
@@ -59,7 +59,7 @@ describe('WhatsAppBotClient', () => {
59
59
  )
60
60
  })
61
61
 
62
- test('throws on empty accessToken', async () => {
62
+ it('throws on empty accessToken', async () => {
63
63
  await expect(new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: '' })).rejects.toThrow(
64
64
  WhatsAppBotError,
65
65
  )
@@ -68,14 +68,14 @@ describe('WhatsAppBotClient', () => {
68
68
  )
69
69
  })
70
70
 
71
- test('accepts valid phoneNumberId and accessToken', async () => {
71
+ it('accepts valid phoneNumberId and accessToken', async () => {
72
72
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'access-token' })
73
73
  expect(client).toBeInstanceOf(WhatsAppBotClient)
74
74
  })
75
75
  })
76
76
 
77
77
  describe('verifyToken', () => {
78
- test('sends GET request with correct URL and auth header', async () => {
78
+ it('sends GET request with correct URL and auth header', async () => {
79
79
  mockResponse({ verified_name: 'Test Business' })
80
80
 
81
81
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'my-token' })
@@ -89,7 +89,7 @@ describe('WhatsAppBotClient', () => {
89
89
  })
90
90
  })
91
91
 
92
- test('throws WhatsAppBotError on API error', async () => {
92
+ it('throws WhatsAppBotError on API error', async () => {
93
93
  mockResponse({ error: { message: 'Invalid token', code: 190 } }, 401)
94
94
 
95
95
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'bad-token' })
@@ -98,7 +98,7 @@ describe('WhatsAppBotClient', () => {
98
98
  })
99
99
 
100
100
  describe('sendTextMessage', () => {
101
- test('sends POST request with correct body shape', async () => {
101
+ it('sends POST request with correct body shape', async () => {
102
102
  mockResponse({
103
103
  messaging_product: 'whatsapp',
104
104
  contacts: [{ input: '+15551234567', wa_id: '15551234567' }],
@@ -121,7 +121,7 @@ describe('WhatsAppBotClient', () => {
121
121
  })
122
122
  })
123
123
 
124
- test('sends correct Authorization header', async () => {
124
+ it('sends correct Authorization header', async () => {
125
125
  mockResponse({
126
126
  messaging_product: 'whatsapp',
127
127
  contacts: [],
@@ -136,7 +136,7 @@ describe('WhatsAppBotClient', () => {
136
136
  })
137
137
  })
138
138
 
139
- test('returns WhatsAppBotMessageResponse', async () => {
139
+ it('returns WhatsAppBotMessageResponse', async () => {
140
140
  mockResponse({
141
141
  messaging_product: 'whatsapp',
142
142
  contacts: [{ input: '+15551234567', wa_id: '15551234567' }],
@@ -153,7 +153,7 @@ describe('WhatsAppBotClient', () => {
153
153
  })
154
154
 
155
155
  describe('sendTemplateMessage', () => {
156
- test('sends POST with template payload', async () => {
156
+ it('sends POST with template payload', async () => {
157
157
  mockResponse({
158
158
  messaging_product: 'whatsapp',
159
159
  contacts: [{ input: '+15551234567', wa_id: '15551234567' }],
@@ -172,7 +172,7 @@ describe('WhatsAppBotClient', () => {
172
172
  })
173
173
  })
174
174
 
175
- test('includes components when provided', async () => {
175
+ it('includes components when provided', async () => {
176
176
  mockResponse({
177
177
  messaging_product: 'whatsapp',
178
178
  contacts: [],
@@ -189,7 +189,7 @@ describe('WhatsAppBotClient', () => {
189
189
  })
190
190
 
191
191
  describe('sendReaction', () => {
192
- test('sends POST with reaction payload', async () => {
192
+ it('sends POST with reaction payload', async () => {
193
193
  mockResponse({
194
194
  messaging_product: 'whatsapp',
195
195
  contacts: [],
@@ -210,7 +210,7 @@ describe('WhatsAppBotClient', () => {
210
210
  })
211
211
 
212
212
  describe('sendImageMessage', () => {
213
- test('sends POST with image payload', async () => {
213
+ it('sends POST with image payload', async () => {
214
214
  mockResponse({
215
215
  messaging_product: 'whatsapp',
216
216
  contacts: [],
@@ -231,7 +231,7 @@ describe('WhatsAppBotClient', () => {
231
231
  })
232
232
 
233
233
  describe('sendDocumentMessage', () => {
234
- test('sends POST with document payload', async () => {
234
+ it('sends POST with document payload', async () => {
235
235
  mockResponse({
236
236
  messaging_product: 'whatsapp',
237
237
  contacts: [],
@@ -252,7 +252,7 @@ describe('WhatsAppBotClient', () => {
252
252
  })
253
253
 
254
254
  describe('listTemplates', () => {
255
- test('sends GET and unwraps data key from response', async () => {
255
+ it('sends GET and unwraps data key from response', async () => {
256
256
  mockResponse({
257
257
  data: [
258
258
  { name: 'hello_world', status: 'APPROVED', category: 'UTILITY', language: 'en_US', components: [] },
@@ -270,7 +270,7 @@ describe('WhatsAppBotClient', () => {
270
270
  expect(fetchCalls[0].options?.method).toBe('GET')
271
271
  })
272
272
 
273
- test('passes limit parameter in URL', async () => {
273
+ it('passes limit parameter in URL', async () => {
274
274
  mockResponse({ data: [] })
275
275
 
276
276
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'my-token' })
@@ -281,7 +281,7 @@ describe('WhatsAppBotClient', () => {
281
281
  })
282
282
 
283
283
  describe('getTemplate', () => {
284
- test('sends GET with name filter and returns first match', async () => {
284
+ it('sends GET with name filter and returns first match', async () => {
285
285
  mockResponse({
286
286
  data: [{ name: 'hello_world', status: 'APPROVED', category: 'UTILITY', language: 'en_US', components: [] }],
287
287
  })
@@ -293,7 +293,7 @@ describe('WhatsAppBotClient', () => {
293
293
  expect(fetchCalls[0].url).toContain('name=hello_world')
294
294
  })
295
295
 
296
- test('throws WhatsAppBotError with not_found code when template not found', async () => {
296
+ it('throws WhatsAppBotError with not_found code when template not found', async () => {
297
297
  mockResponse({ data: [] })
298
298
 
299
299
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'my-token' })
@@ -309,7 +309,7 @@ describe('WhatsAppBotClient', () => {
309
309
  })
310
310
 
311
311
  describe('rate limiting', () => {
312
- test('waits when x-business-use-case-usage indicates throttle', async () => {
312
+ it('waits when x-business-use-case-usage indicates throttle', async () => {
313
313
  const usageHeader = JSON.stringify({
314
314
  '123456789': [
315
315
  {
@@ -336,7 +336,7 @@ describe('WhatsAppBotClient', () => {
336
336
  expect(fetchCalls.length).toBe(2)
337
337
  })
338
338
 
339
- test('retries on 429 with Retry-After header', async () => {
339
+ it('retries on 429 with Retry-After header', async () => {
340
340
  mockResponse({ error: { message: 'Rate limited', code: 613 } }, 429, { 'Retry-After': '0.1' })
341
341
  mockResponse({ verified_name: 'Test Business' })
342
342
 
@@ -347,7 +347,7 @@ describe('WhatsAppBotClient', () => {
347
347
  expect(fetchCalls.length).toBe(2)
348
348
  })
349
349
 
350
- test('throws after max retries exceeded', async () => {
350
+ it('throws after max retries exceeded', async () => {
351
351
  for (let i = 0; i <= 3; i++) {
352
352
  mockResponse({ error: { message: 'Rate limited', code: 613 } }, 429, { 'Retry-After': '0.01' })
353
353
  }
@@ -359,7 +359,7 @@ describe('WhatsAppBotClient', () => {
359
359
  })
360
360
 
361
361
  describe('retry logic', () => {
362
- test('retries on 500 server error for GET requests', async () => {
362
+ it('retries on 500 server error for GET requests', async () => {
363
363
  mockResponse({ error: { message: 'Internal Server Error' } }, 500)
364
364
  mockResponse({ verified_name: 'Test Business' })
365
365
 
@@ -370,7 +370,7 @@ describe('WhatsAppBotClient', () => {
370
370
  expect(fetchCalls.length).toBe(2)
371
371
  })
372
372
 
373
- test('does not retry on 500 for POST requests', async () => {
373
+ it('does not retry on 500 for POST requests', async () => {
374
374
  mockResponse({ error: { message: 'Internal Server Error' } }, 500)
375
375
 
376
376
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'my-token' })
@@ -378,7 +378,7 @@ describe('WhatsAppBotClient', () => {
378
378
  expect(fetchCalls.length).toBe(1)
379
379
  })
380
380
 
381
- test('does not retry on 4xx client errors (except 429)', async () => {
381
+ it('does not retry on 4xx client errors (except 429)', async () => {
382
382
  mockResponse({ error: { message: 'Not Found', code: 100 } }, 404)
383
383
 
384
384
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'my-token' })
@@ -386,7 +386,7 @@ describe('WhatsAppBotClient', () => {
386
386
  expect(fetchCalls.length).toBe(1)
387
387
  })
388
388
 
389
- test('does not retry on 403 forbidden', async () => {
389
+ it('does not retry on 403 forbidden', async () => {
390
390
  mockResponse({ error: { message: 'Forbidden', code: 200 } }, 403)
391
391
 
392
392
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'my-token' })
@@ -396,7 +396,7 @@ describe('WhatsAppBotClient', () => {
396
396
  })
397
397
 
398
398
  describe('request URL construction', () => {
399
- test('all requests go to https://graph.facebook.com/v23.0/...', async () => {
399
+ it('all requests go to https://graph.facebook.com/v23.0/...', async () => {
400
400
  mockResponse({ verified_name: 'Test' })
401
401
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'my-phone', accessToken: 'my-token' })
402
402
  await client.verifyToken()
@@ -404,7 +404,7 @@ describe('WhatsAppBotClient', () => {
404
404
  expect(fetchCalls[0].url.startsWith('https://graph.facebook.com/v23.0/')).toBe(true)
405
405
  })
406
406
 
407
- test('Authorization header is Bearer <token>', async () => {
407
+ it('Authorization header is Bearer <token>', async () => {
408
408
  mockResponse({ verified_name: 'Test' })
409
409
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'my-secret-token' })
410
410
  await client.verifyToken()
@@ -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'
@@ -38,7 +38,7 @@ describe('auth commands', () => {
38
38
  })
39
39
 
40
40
  describe('setAction', () => {
41
- test('validates token and stores credentials', async () => {
41
+ it('validates token and stores credentials', async () => {
42
42
  const manager = new WhatsAppBotCredentialManager(tempDir)
43
43
 
44
44
  const result = await setAction('12345678901', 'EAAtest-token', { _credManager: manager })
@@ -52,7 +52,7 @@ describe('auth commands', () => {
52
52
  expect(creds?.access_token).toBe('EAAtest-token')
53
53
  })
54
54
 
55
- test('returns error when client throws', async () => {
55
+ it('returns error when client throws', async () => {
56
56
  mockVerifyToken.mockImplementationOnce(() => Promise.reject(new Error('Invalid token')))
57
57
  const manager = new WhatsAppBotCredentialManager(tempDir)
58
58
 
@@ -64,7 +64,7 @@ describe('auth commands', () => {
64
64
  })
65
65
 
66
66
  describe('statusAction', () => {
67
- test('returns invalid status when no credentials set', async () => {
67
+ it('returns invalid status when no credentials set', async () => {
68
68
  const manager = new WhatsAppBotCredentialManager(tempDir)
69
69
 
70
70
  const result = await statusAction({ _credManager: manager })
@@ -73,7 +73,7 @@ describe('auth commands', () => {
73
73
  expect(result.error).toBeDefined()
74
74
  })
75
75
 
76
- test('returns valid status when credentials are set', async () => {
76
+ it('returns valid status when credentials are set', async () => {
77
77
  const manager = new WhatsAppBotCredentialManager(tempDir)
78
78
  await manager.setCredentials({
79
79
  phone_number_id: '12345678901',
@@ -88,7 +88,7 @@ describe('auth commands', () => {
88
88
  expect(result.account_name).toBe('Test Business')
89
89
  })
90
90
 
91
- test('returns invalid status when verifyToken fails', async () => {
91
+ it('returns invalid status when verifyToken fails', async () => {
92
92
  mockVerifyToken.mockImplementationOnce(() => Promise.reject(new Error('Token expired')))
93
93
  const manager = new WhatsAppBotCredentialManager(tempDir)
94
94
  await manager.setCredentials({
@@ -103,7 +103,7 @@ describe('auth commands', () => {
103
103
  expect(result.phone_number_id).toBe('12345678901')
104
104
  })
105
105
 
106
- test('returns error for unknown account', async () => {
106
+ it('returns error for unknown account', async () => {
107
107
  const manager = new WhatsAppBotCredentialManager(tempDir)
108
108
 
109
109
  const result = await statusAction({ account: 'nonexistent', _credManager: manager })
@@ -114,7 +114,7 @@ describe('auth commands', () => {
114
114
  })
115
115
 
116
116
  describe('clearAction', () => {
117
- test('removes all stored credentials', async () => {
117
+ it('removes all stored credentials', async () => {
118
118
  const manager = new WhatsAppBotCredentialManager(tempDir)
119
119
  await manager.setCredentials({
120
120
  phone_number_id: '12345678901',
@@ -130,7 +130,7 @@ describe('auth commands', () => {
130
130
  })
131
131
 
132
132
  describe('listAction', () => {
133
- test('returns empty accounts when none set', async () => {
133
+ it('returns empty accounts when none set', async () => {
134
134
  const manager = new WhatsAppBotCredentialManager(tempDir)
135
135
 
136
136
  const result = await listAction({ _credManager: manager })
@@ -138,7 +138,7 @@ describe('auth commands', () => {
138
138
  expect(result.accounts).toHaveLength(0)
139
139
  })
140
140
 
141
- test('returns all stored accounts', async () => {
141
+ it('returns all stored accounts', async () => {
142
142
  const manager = new WhatsAppBotCredentialManager(tempDir)
143
143
  await manager.setCredentials({
144
144
  phone_number_id: '11111111111',
@@ -160,7 +160,7 @@ describe('auth commands', () => {
160
160
  })
161
161
 
162
162
  describe('useAction', () => {
163
- test('switches current account', async () => {
163
+ it('switches current account', async () => {
164
164
  const manager = new WhatsAppBotCredentialManager(tempDir)
165
165
  await manager.setCredentials({
166
166
  phone_number_id: '11111111111',
@@ -180,7 +180,7 @@ describe('auth commands', () => {
180
180
  expect(result.account_name).toBe('Account A')
181
181
  })
182
182
 
183
- test('returns error for unknown account', async () => {
183
+ it('returns error for unknown account', async () => {
184
184
  const manager = new WhatsAppBotCredentialManager(tempDir)
185
185
 
186
186
  const result = await useAction('nonexistent', { _credManager: manager })
@@ -191,7 +191,7 @@ describe('auth commands', () => {
191
191
  })
192
192
 
193
193
  describe('removeAction', () => {
194
- test('removes a stored account', async () => {
194
+ it('removes a stored account', async () => {
195
195
  const manager = new WhatsAppBotCredentialManager(tempDir)
196
196
  await manager.setCredentials({
197
197
  phone_number_id: '12345678901',
@@ -205,7 +205,7 @@ describe('auth commands', () => {
205
205
  expect(await manager.getCredentials('12345678901')).toBeNull()
206
206
  })
207
207
 
208
- test('returns error for unknown account', async () => {
208
+ it('returns error for unknown account', async () => {
209
209
  const manager = new WhatsAppBotCredentialManager(tempDir)
210
210
 
211
211
  const result = await removeAction('nonexistent', { _credManager: manager })
@@ -1,5 +1,6 @@
1
1
  import { Command } from 'commander'
2
2
 
3
+ import { cliOutput } from '@/shared/utils/cli-output'
3
4
  import { formatOutput } from '@/shared/utils/output'
4
5
 
5
6
  import { WhatsAppBotClient } from '../client'
@@ -145,11 +146,6 @@ export async function removeAction(accountId: string, options: ActionOptions): P
145
146
  }
146
147
  }
147
148
 
148
- function cliOutput(result: ActionResult, pretty?: boolean, exitOnError = true): void {
149
- console.log(formatOutput(result, pretty))
150
- if (result.error && exitOnError) process.exit(1)
151
- }
152
-
153
149
  export const authCommand = new Command('auth')
154
150
  .description('Authentication commands')
155
151
  .addCommand(
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockSendTextMessage = mock(() =>
4
4
  Promise.resolve({
@@ -64,7 +64,7 @@ describe('message commands', () => {
64
64
  })
65
65
 
66
66
  describe('sendAction', () => {
67
- test('sends a text message and returns result', async () => {
67
+ it('sends a text message and returns result', async () => {
68
68
  const result = await sendAction('+1234567890', 'Hello!', {})
69
69
 
70
70
  expect(result.messaging_product).toBe('whatsapp')
@@ -73,7 +73,7 @@ describe('message commands', () => {
73
73
  expect(mockSendTextMessage).toHaveBeenCalledWith('+1234567890', 'Hello!')
74
74
  })
75
75
 
76
- test('returns error when client throws', async () => {
76
+ it('returns error when client throws', async () => {
77
77
  mockSendTextMessage.mockImplementationOnce(() => Promise.reject(new Error('Network error')))
78
78
 
79
79
  const result = await sendAction('+1234567890', 'Hello!', {})
@@ -83,7 +83,7 @@ describe('message commands', () => {
83
83
  })
84
84
 
85
85
  describe('sendTemplateAction', () => {
86
- test('sends a template message with default language', async () => {
86
+ it('sends a template message with default language', async () => {
87
87
  const result = await sendTemplateAction('+1234567890', 'hello_world', {})
88
88
 
89
89
  expect(result.messaging_product).toBe('whatsapp')
@@ -91,14 +91,14 @@ describe('message commands', () => {
91
91
  expect(mockSendTemplateMessage).toHaveBeenCalledWith('+1234567890', 'hello_world', 'en_US', undefined)
92
92
  })
93
93
 
94
- test('sends a template message with custom language', async () => {
94
+ it('sends a template message with custom language', async () => {
95
95
  const result = await sendTemplateAction('+1234567890', 'hello_world', { language: 'pt_BR' })
96
96
 
97
97
  expect(mockSendTemplateMessage).toHaveBeenCalledWith('+1234567890', 'hello_world', 'pt_BR', undefined)
98
98
  expect(result.error).toBeUndefined()
99
99
  })
100
100
 
101
- test('parses and passes components JSON', async () => {
101
+ it('parses and passes components JSON', async () => {
102
102
  const components = [{ type: 'body', parameters: [{ type: 'text', text: 'World' }] }]
103
103
  const result = await sendTemplateAction('+1234567890', 'hello_world', {
104
104
  components: JSON.stringify(components),
@@ -108,7 +108,7 @@ describe('message commands', () => {
108
108
  expect(result.error).toBeUndefined()
109
109
  })
110
110
 
111
- test('returns error for invalid components JSON', async () => {
111
+ it('returns error for invalid components JSON', async () => {
112
112
  const result = await sendTemplateAction('+1234567890', 'hello_world', {
113
113
  components: 'not-valid-json',
114
114
  })
@@ -116,7 +116,7 @@ describe('message commands', () => {
116
116
  expect(result.error).toBe('Invalid --components JSON')
117
117
  })
118
118
 
119
- test('returns error when client throws', async () => {
119
+ it('returns error when client throws', async () => {
120
120
  mockSendTemplateMessage.mockImplementationOnce(() => Promise.reject(new Error('Template not found')))
121
121
 
122
122
  const result = await sendTemplateAction('+1234567890', 'missing_template', {})
@@ -126,7 +126,7 @@ describe('message commands', () => {
126
126
  })
127
127
 
128
128
  describe('sendReactionAction', () => {
129
- test('sends a reaction and returns result', async () => {
129
+ it('sends a reaction and returns result', async () => {
130
130
  const result = await sendReactionAction('+1234567890', 'wamid.msg123', '👍', {})
131
131
 
132
132
  expect(result.messaging_product).toBe('whatsapp')
@@ -134,7 +134,7 @@ describe('message commands', () => {
134
134
  expect(mockSendReaction).toHaveBeenCalledWith('+1234567890', 'wamid.msg123', '👍')
135
135
  })
136
136
 
137
- test('returns error when client throws', async () => {
137
+ it('returns error when client throws', async () => {
138
138
  mockSendReaction.mockImplementationOnce(() => Promise.reject(new Error('Message not found')))
139
139
 
140
140
  const result = await sendReactionAction('+1234567890', 'wamid.bad', '👍', {})
@@ -144,7 +144,7 @@ describe('message commands', () => {
144
144
  })
145
145
 
146
146
  describe('sendImageAction', () => {
147
- test('sends an image message and returns result', async () => {
147
+ it('sends an image message and returns result', async () => {
148
148
  const result = await sendImageAction('+1234567890', 'https://example.com/image.jpg', {})
149
149
 
150
150
  expect(result.messaging_product).toBe('whatsapp')
@@ -152,14 +152,14 @@ describe('message commands', () => {
152
152
  expect(mockSendImageMessage).toHaveBeenCalledWith('+1234567890', 'https://example.com/image.jpg', undefined)
153
153
  })
154
154
 
155
- test('passes caption when provided', async () => {
155
+ it('passes caption when provided', async () => {
156
156
  const result = await sendImageAction('+1234567890', 'https://example.com/image.jpg', { caption: 'My photo' })
157
157
 
158
158
  expect(mockSendImageMessage).toHaveBeenCalledWith('+1234567890', 'https://example.com/image.jpg', 'My photo')
159
159
  expect(result.error).toBeUndefined()
160
160
  })
161
161
 
162
- test('returns error when client throws', async () => {
162
+ it('returns error when client throws', async () => {
163
163
  mockSendImageMessage.mockImplementationOnce(() => Promise.reject(new Error('Invalid URL')))
164
164
 
165
165
  const result = await sendImageAction('+1234567890', 'bad-url', {})
@@ -169,7 +169,7 @@ describe('message commands', () => {
169
169
  })
170
170
 
171
171
  describe('sendDocumentAction', () => {
172
- test('sends a document message and returns result', async () => {
172
+ it('sends a document message and returns result', async () => {
173
173
  const result = await sendDocumentAction('+1234567890', 'https://example.com/doc.pdf', {})
174
174
 
175
175
  expect(result.messaging_product).toBe('whatsapp')
@@ -182,7 +182,7 @@ describe('message commands', () => {
182
182
  )
183
183
  })
184
184
 
185
- test('passes filename and caption when provided', async () => {
185
+ it('passes filename and caption when provided', async () => {
186
186
  const result = await sendDocumentAction('+1234567890', 'https://example.com/doc.pdf', {
187
187
  filename: 'report.pdf',
188
188
  caption: 'Monthly report',
@@ -197,7 +197,7 @@ describe('message commands', () => {
197
197
  expect(result.error).toBeUndefined()
198
198
  })
199
199
 
200
- test('returns error when client throws', async () => {
200
+ it('returns error when client throws', async () => {
201
201
  mockSendDocumentMessage.mockImplementationOnce(() => Promise.reject(new Error('Upload failed')))
202
202
 
203
203
  const result = await sendDocumentAction('+1234567890', 'https://example.com/doc.pdf', {})
@@ -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 { AccountOption } from './shared'
6
6
  import { getClient } from './shared'
@@ -91,11 +91,6 @@ export async function sendDocumentAction(
91
91
  }
92
92
  }
93
93
 
94
- function cliOutput(result: MessageResult, pretty?: boolean): void {
95
- console.log(formatOutput(result, pretty))
96
- if (result.error) process.exit(1)
97
- }
98
-
99
94
  export const messageCommand = new Command('message')
100
95
  .description('Message commands')
101
96
  .addCommand(
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  import type { WhatsAppBotTemplate } from '../types'
4
4
 
@@ -46,7 +46,7 @@ describe('template commands', () => {
46
46
  })
47
47
 
48
48
  describe('listAction', () => {
49
- test('returns all templates', async () => {
49
+ it('returns all templates', async () => {
50
50
  const result = await listAction({})
51
51
 
52
52
  expect(result.templates).toHaveLength(2)
@@ -55,28 +55,28 @@ describe('template commands', () => {
55
55
  expect(mockListTemplates).toHaveBeenCalledWith(undefined)
56
56
  })
57
57
 
58
- test('passes limit when provided', async () => {
58
+ it('passes limit when provided', async () => {
59
59
  const result = await listAction({ limit: '1' })
60
60
 
61
61
  expect(mockListTemplates).toHaveBeenCalledWith({ limit: 1 })
62
62
  expect(result.error).toBeUndefined()
63
63
  })
64
64
 
65
- test('returns error for invalid limit', async () => {
65
+ it('returns error for invalid limit', async () => {
66
66
  const result = await listAction({ limit: 'abc' })
67
67
 
68
68
  expect(result.error).toBeDefined()
69
69
  expect(result.error).toContain('Invalid --limit')
70
70
  })
71
71
 
72
- test('returns error for zero limit', async () => {
72
+ it('returns error for zero limit', async () => {
73
73
  const result = await listAction({ limit: '0' })
74
74
 
75
75
  expect(result.error).toBeDefined()
76
76
  expect(result.error).toContain('Invalid --limit')
77
77
  })
78
78
 
79
- test('returns error when client throws', async () => {
79
+ it('returns error when client throws', async () => {
80
80
  mockListTemplates.mockImplementationOnce(() => Promise.reject(new Error('API error')))
81
81
 
82
82
  const result = await listAction({})
@@ -86,7 +86,7 @@ describe('template commands', () => {
86
86
  })
87
87
 
88
88
  describe('getAction', () => {
89
- test('returns a specific template by name', async () => {
89
+ it('returns a specific template by name', async () => {
90
90
  const result = await getAction('hello_world', {})
91
91
 
92
92
  expect(result.template).toBeDefined()
@@ -95,13 +95,13 @@ describe('template commands', () => {
95
95
  expect(mockGetTemplate).toHaveBeenCalledWith('hello_world')
96
96
  })
97
97
 
98
- test('returns error when template not found', async () => {
98
+ it('returns error when template not found', async () => {
99
99
  const result = await getAction('nonexistent_template', {})
100
100
 
101
101
  expect(result.error).toContain('nonexistent_template')
102
102
  })
103
103
 
104
- test('returns error when client throws', async () => {
104
+ it('returns error when client throws', async () => {
105
105
  mockGetTemplate.mockImplementationOnce(() => Promise.reject(new Error('Network error')))
106
106
 
107
107
  const result = await getAction('hello_world', {})
@@ -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 { WhatsAppBotTemplate } from '../types'
6
6
  import type { AccountOption } from './shared'
@@ -40,11 +40,6 @@ export async function getAction(templateName: string, options: TemplateOptions):
40
40
  }
41
41
  }
42
42
 
43
- function cliOutput(result: TemplateResult, pretty?: boolean): void {
44
- console.log(formatOutput(result, pretty))
45
- if (result.error) process.exit(1)
46
- }
47
-
48
43
  export const templateCommand = new Command('template')
49
44
  .description('Template commands')
50
45
  .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'
@@ -35,7 +35,7 @@ describe('whoami command', () => {
35
35
  }
36
36
  })
37
37
 
38
- test('returns phone number id, account name, and verified name', async () => {
38
+ it('returns phone number id, account name, and verified name', async () => {
39
39
  const manager = new WhatsAppBotCredentialManager(tempDir)
40
40
  await manager.setCredentials({
41
41
  phone_number_id: '12345678901',
@@ -51,7 +51,7 @@ describe('whoami command', () => {
51
51
  expect(result.error).toBeUndefined()
52
52
  })
53
53
 
54
- test('returns info for specific --account', async () => {
54
+ it('returns info for specific --account', async () => {
55
55
  const manager = new WhatsAppBotCredentialManager(tempDir)
56
56
  await manager.setCredentials({
57
57
  phone_number_id: '11111111111',
@@ -71,7 +71,7 @@ describe('whoami command', () => {
71
71
  expect(result.verified_name).toBe('Test Business')
72
72
  })
73
73
 
74
- test('returns error when verifyToken fails', async () => {
74
+ it('returns error when verifyToken fails', async () => {
75
75
  mockVerifyToken.mockImplementationOnce(() => Promise.reject(new Error('Invalid token')))
76
76
 
77
77
  const manager = new WhatsAppBotCredentialManager(tempDir)
@@ -87,7 +87,7 @@ describe('whoami command', () => {
87
87
  expect(result.error).toContain('Invalid token')
88
88
  })
89
89
 
90
- test('returns error when no credentials', async () => {
90
+ it('returns error when no credentials', async () => {
91
91
  const manager = new WhatsAppBotCredentialManager(tempDir)
92
92
 
93
93
  const result = await whoamiAction({ _credManager: manager })