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 { ChannelBotClient } from './client'
4
4
  import { ChannelBotError } from './types'
@@ -46,7 +46,7 @@ describe('ChannelBotClient', () => {
46
46
  )
47
47
  }
48
48
 
49
- test('successful GET request returns unwrapped JSON', async () => {
49
+ it('successful GET request returns unwrapped JSON', async () => {
50
50
  mockResponse({ channel: { id: 'ch-1', name: 'My Channel' } })
51
51
 
52
52
  const client = await new ChannelBotClient().login({ accessKey: 'key-1', accessSecret: 'secret-1' })
@@ -56,7 +56,7 @@ describe('ChannelBotClient', () => {
56
56
  expect(fetchCalls[0].url).toBe('https://api.channel.io/open/v5/channel')
57
57
  })
58
58
 
59
- test('auth headers are set on every request', async () => {
59
+ it('auth headers are set on every request', async () => {
60
60
  mockResponse({ channel: { id: 'ch-1', name: 'My Channel' } })
61
61
  mockResponse({ user: { id: 'u-1', channelId: 'ch-1' } })
62
62
 
@@ -73,7 +73,7 @@ describe('ChannelBotClient', () => {
73
73
  }
74
74
  })
75
75
 
76
- test('429 response triggers retry with Retry-After wait', async () => {
76
+ it('429 response triggers retry with Retry-After wait', async () => {
77
77
  mockResponse({ message: 'Rate limited' }, 429, { 'Retry-After': '0.05' })
78
78
  mockResponse({ channel: { id: 'ch-1', name: 'My Channel' } })
79
79
 
@@ -87,7 +87,7 @@ describe('ChannelBotClient', () => {
87
87
  expect(elapsed).toBeGreaterThanOrEqual(40)
88
88
  })
89
89
 
90
- test('500 response triggers retry with exponential backoff', async () => {
90
+ it('500 response triggers retry with exponential backoff', async () => {
91
91
  mockResponse({ message: 'Server error' }, 500)
92
92
  mockResponse({ message: 'Server error' }, 500)
93
93
  mockResponse({ channel: { id: 'ch-1', name: 'My Channel' } })
@@ -102,7 +102,7 @@ describe('ChannelBotClient', () => {
102
102
  expect(elapsed).toBeGreaterThanOrEqual(280)
103
103
  })
104
104
 
105
- test('4xx non-429 throws immediately without retry', async () => {
105
+ it('4xx non-429 throws immediately without retry', async () => {
106
106
  mockResponse({ message: 'Forbidden' }, 403)
107
107
 
108
108
  const client = await new ChannelBotClient().login({ accessKey: 'key-1', accessSecret: 'secret-1' })
@@ -110,7 +110,7 @@ describe('ChannelBotClient', () => {
110
110
  expect(fetchCalls).toHaveLength(1)
111
111
  })
112
112
 
113
- test('network error retries then throws ChannelBotError with code network_error', async () => {
113
+ it('network error retries then throws ChannelBotError with code network_error', async () => {
114
114
  ;(globalThis as Record<string, unknown>).fetch = async (
115
115
  url: string | URL | Request,
116
116
  options?: RequestInit,
@@ -131,7 +131,7 @@ describe('ChannelBotClient', () => {
131
131
  }
132
132
  })
133
133
 
134
- test('204 response returns undefined', async () => {
134
+ it('204 response returns undefined', async () => {
135
135
  mockResponse(null, 204)
136
136
 
137
137
  const client = await new ChannelBotClient().login({ accessKey: 'key-1', accessSecret: 'secret-1' })
@@ -140,11 +140,11 @@ describe('ChannelBotClient', () => {
140
140
  expect(result).toBeUndefined()
141
141
  })
142
142
 
143
- test('wrapTextInBlocks returns a single text block with value', () => {
143
+ it('wrapTextInBlocks returns a single text block with value', () => {
144
144
  expect(ChannelBotClient.wrapTextInBlocks('Hello world')).toEqual([{ type: 'text', value: 'Hello world' }])
145
145
  })
146
146
 
147
- test('sendUserChatMessage includes botName in query string', async () => {
147
+ it('sendUserChatMessage includes botName in query string', async () => {
148
148
  mockResponse({ message: { id: 'm-1' } })
149
149
 
150
150
  const client = await new ChannelBotClient().login({ accessKey: 'key-1', accessSecret: 'secret-1' })
@@ -153,7 +153,7 @@ describe('ChannelBotClient', () => {
153
153
  expect(fetchCalls[0].url).toBe('https://api.channel.io/open/v5/user-chats/chat-1/messages?botName=SupportBot')
154
154
  })
155
155
 
156
- test('sendGroupMessage includes botName in query string', async () => {
156
+ it('sendGroupMessage includes botName in query string', async () => {
157
157
  mockResponse({ message: { id: 'm-1' } })
158
158
 
159
159
  const client = await new ChannelBotClient().login({ accessKey: 'key-1', accessSecret: 'secret-1' })
@@ -162,7 +162,7 @@ describe('ChannelBotClient', () => {
162
162
  expect(fetchCalls[0].url).toBe('https://api.channel.io/open/v5/groups/grp-1/messages?botName=OpsBot')
163
163
  })
164
164
 
165
- test('resolveGroup("@team-name") calls groups by name endpoint', async () => {
165
+ it('resolveGroup("@team-name") calls groups by name endpoint', async () => {
166
166
  mockResponse({ group: { id: 'grp-1', channelId: 'ch-1', name: 'team-name' } })
167
167
 
168
168
  const client = await new ChannelBotClient().login({ accessKey: 'key-1', accessSecret: 'secret-1' })
@@ -171,7 +171,7 @@ describe('ChannelBotClient', () => {
171
171
  expect(fetchCalls[0].url).toBe('https://api.channel.io/open/v5/groups/@team-name')
172
172
  })
173
173
 
174
- test('resolveGroup("grp123") calls groups by id endpoint', async () => {
174
+ it('resolveGroup("grp123") calls groups by id endpoint', async () => {
175
175
  mockResponse({ group: { id: 'grp123', channelId: 'ch-1', name: 'team-name' } })
176
176
 
177
177
  const client = await new ChannelBotClient().login({ accessKey: 'key-1', accessSecret: 'secret-1' })
@@ -180,7 +180,7 @@ describe('ChannelBotClient', () => {
180
180
  expect(fetchCalls[0].url).toBe('https://api.channel.io/open/v5/groups/grp123')
181
181
  })
182
182
 
183
- test('pagination params are included in query string', async () => {
183
+ it('pagination params are included in query string', async () => {
184
184
  mockResponse({ messages: [] })
185
185
 
186
186
  const client = await new ChannelBotClient().login({ accessKey: 'key-1', accessSecret: 'secret-1' })
@@ -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'
@@ -39,7 +39,7 @@ describe('auth commands', () => {
39
39
  })
40
40
 
41
41
  describe('setAction', () => {
42
- test('validates and stores credentials with workspace info from API', async () => {
42
+ it('validates and stores credentials with workspace info from API', async () => {
43
43
  const manager = new ChannelBotCredentialManager(tempDir)
44
44
 
45
45
  const result = await setAction('key123', 'secret123', { _credManager: manager })
@@ -53,7 +53,7 @@ describe('auth commands', () => {
53
53
  expect(creds?.workspace_id).toBe('ch123')
54
54
  })
55
55
 
56
- test('uses --workspace option as workspace name', async () => {
56
+ it('uses --workspace option as workspace name', async () => {
57
57
  const manager = new ChannelBotCredentialManager(tempDir)
58
58
 
59
59
  const result = await setAction('key123', 'secret123', {
@@ -68,7 +68,7 @@ describe('auth commands', () => {
68
68
  expect(creds?.workspace_name).toBe('My Custom Name')
69
69
  })
70
70
 
71
- test('handles client errors gracefully', async () => {
71
+ it('handles client errors gracefully', async () => {
72
72
  mockGetChannel.mockImplementationOnce(() => Promise.reject(new Error('Invalid credentials')))
73
73
 
74
74
  const manager = new ChannelBotCredentialManager(tempDir)
@@ -81,7 +81,7 @@ describe('auth commands', () => {
81
81
  })
82
82
 
83
83
  describe('statusAction', () => {
84
- test('returns no credentials when none set', async () => {
84
+ it('returns no credentials when none set', async () => {
85
85
  const manager = new ChannelBotCredentialManager(tempDir)
86
86
 
87
87
  const result = await statusAction({ _credManager: manager })
@@ -90,7 +90,7 @@ describe('auth commands', () => {
90
90
  expect(result.error).toBeDefined()
91
91
  })
92
92
 
93
- test('returns valid status for current workspace', async () => {
93
+ it('returns valid status for current workspace', async () => {
94
94
  const manager = new ChannelBotCredentialManager(tempDir)
95
95
  await manager.setCredentials({
96
96
  workspace_id: 'ch123',
@@ -105,7 +105,7 @@ describe('auth commands', () => {
105
105
  expect(result.workspace_id).toBe('ch123')
106
106
  })
107
107
 
108
- test('returns invalid when API call fails', async () => {
108
+ it('returns invalid when API call fails', async () => {
109
109
  mockGetChannel.mockImplementationOnce(() => Promise.reject(new Error('Unauthorized')))
110
110
 
111
111
  const manager = new ChannelBotCredentialManager(tempDir)
@@ -123,7 +123,7 @@ describe('auth commands', () => {
123
123
  })
124
124
 
125
125
  describe('clearAction', () => {
126
- test('removes all stored credentials', async () => {
126
+ it('removes all stored credentials', async () => {
127
127
  const manager = new ChannelBotCredentialManager(tempDir)
128
128
  await manager.setCredentials({
129
129
  workspace_id: 'ch123',
@@ -140,7 +140,7 @@ describe('auth commands', () => {
140
140
  })
141
141
 
142
142
  describe('listAction', () => {
143
- test('returns all stored workspaces', async () => {
143
+ it('returns all stored workspaces', async () => {
144
144
  const manager = new ChannelBotCredentialManager(tempDir)
145
145
  await manager.setCredentials({
146
146
  workspace_id: 'ch1',
@@ -162,7 +162,7 @@ describe('auth commands', () => {
162
162
  expect(result.workspaces?.find((w) => w.workspace_id === 'ch1')?.is_current).toBe(false)
163
163
  })
164
164
 
165
- test('returns empty list when no workspaces stored', async () => {
165
+ it('returns empty list when no workspaces stored', async () => {
166
166
  const manager = new ChannelBotCredentialManager(tempDir)
167
167
 
168
168
  const result = await listAction({ _credManager: manager })
@@ -172,7 +172,7 @@ describe('auth commands', () => {
172
172
  })
173
173
 
174
174
  describe('useAction', () => {
175
- test('switches current workspace', async () => {
175
+ it('switches current workspace', async () => {
176
176
  const manager = new ChannelBotCredentialManager(tempDir)
177
177
  await manager.setCredentials({
178
178
  workspace_id: 'ch1',
@@ -193,7 +193,7 @@ describe('auth commands', () => {
193
193
  expect(result.workspace_id).toBe('ch1')
194
194
  })
195
195
 
196
- test('returns error for unknown workspace', async () => {
196
+ it('returns error for unknown workspace', async () => {
197
197
  const manager = new ChannelBotCredentialManager(tempDir)
198
198
 
199
199
  const result = await useAction('nonexistent', { _credManager: manager })
@@ -203,7 +203,7 @@ describe('auth commands', () => {
203
203
  })
204
204
 
205
205
  describe('removeAction', () => {
206
- test('removes a stored workspace', async () => {
206
+ it('removes a stored workspace', async () => {
207
207
  const manager = new ChannelBotCredentialManager(tempDir)
208
208
  await manager.setCredentials({
209
209
  workspace_id: 'ch1',
@@ -218,7 +218,7 @@ describe('auth commands', () => {
218
218
  expect(await manager.getCredentials('ch1')).toBeNull()
219
219
  })
220
220
 
221
- test('returns error for unknown workspace', async () => {
221
+ it('returns error for unknown workspace', async () => {
222
222
  const manager = new ChannelBotCredentialManager(tempDir)
223
223
 
224
224
  const result = await removeAction('nonexistent', { _credManager: manager })
@@ -228,7 +228,7 @@ describe('auth commands', () => {
228
228
  })
229
229
 
230
230
  describe('botAction', () => {
231
- test('sets default bot name', async () => {
231
+ it('sets default bot name', async () => {
232
232
  const manager = new ChannelBotCredentialManager(tempDir)
233
233
 
234
234
  const result = await botAction('my-bot', { _credManager: manager })
@@ -238,7 +238,7 @@ describe('auth commands', () => {
238
238
  expect(await manager.getDefaultBot()).toBe('my-bot')
239
239
  })
240
240
 
241
- test('updates existing default bot', async () => {
241
+ it('updates existing default bot', async () => {
242
242
  const manager = new ChannelBotCredentialManager(tempDir)
243
243
  await manager.setDefaultBot('old-bot')
244
244
 
@@ -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 { ChannelBotClient } from '../client'
@@ -158,11 +159,6 @@ export async function botAction(name: string, options: ActionOptions): Promise<A
158
159
  }
159
160
  }
160
161
 
161
- function cliOutput(result: ActionResult, pretty?: boolean, exitOnError = true): void {
162
- console.log(formatOutput(result, pretty))
163
- if (result.error && exitOnError) process.exit(1)
164
- }
165
-
166
162
  export const authCommand = new Command('auth')
167
163
  .description('Authentication commands')
168
164
  .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'
@@ -67,7 +67,7 @@ describe('bot commands', () => {
67
67
  })
68
68
 
69
69
  describe('listAction', () => {
70
- test('returns all bots', async () => {
70
+ it('returns all bots', async () => {
71
71
  const manager = new ChannelBotCredentialManager(tempDir)
72
72
  const result = await listAction({ _credManager: manager })
73
73
 
@@ -78,7 +78,7 @@ describe('bot commands', () => {
78
78
  })
79
79
 
80
80
  describe('createAction', () => {
81
- test('creates bot with name', async () => {
81
+ it('creates bot with name', async () => {
82
82
  const manager = new ChannelBotCredentialManager(tempDir)
83
83
  const result = await createAction('New Bot', { _credManager: manager })
84
84
 
@@ -88,7 +88,7 @@ describe('bot commands', () => {
88
88
  expect(capturedCreateArgs[0]).toBe('New Bot')
89
89
  })
90
90
 
91
- test('creates bot with optional color and avatar', async () => {
91
+ it('creates bot with optional color and avatar', async () => {
92
92
  const manager = new ChannelBotCredentialManager(tempDir)
93
93
  await createAction('New Bot', {
94
94
  color: '#00FF00',
@@ -101,7 +101,7 @@ describe('bot commands', () => {
101
101
  })
102
102
 
103
103
  describe('deleteAction', () => {
104
- test('deletes bot with --force flag', async () => {
104
+ it('deletes bot with --force flag', async () => {
105
105
  const manager = new ChannelBotCredentialManager(tempDir)
106
106
  const result = await deleteAction('bot1', { force: true, _credManager: manager })
107
107
 
@@ -111,7 +111,7 @@ describe('bot commands', () => {
111
111
  expect(capturedDeleteArg).toBe('bot1')
112
112
  })
113
113
 
114
- test('returns error without --force flag', async () => {
114
+ it('returns error without --force flag', async () => {
115
115
  const manager = new ChannelBotCredentialManager(tempDir)
116
116
  const result = await deleteAction('bot1', { _credManager: manager })
117
117
 
@@ -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 { WorkspaceOption } from './shared'
6
6
  import { getClient } from './shared'
@@ -89,11 +89,6 @@ export async function deleteAction(botId: string, options: BotOptions): Promise<
89
89
  }
90
90
  }
91
91
 
92
- function cliOutput(result: BotResult, pretty?: boolean): void {
93
- console.log(formatOutput(result, pretty))
94
- if (result.error) process.exit(1)
95
- }
96
-
97
92
  export const botCommand = new Command('bot')
98
93
  .description('Bot management commands')
99
94
  .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'
@@ -92,7 +92,7 @@ describe('chat commands', () => {
92
92
  })
93
93
 
94
94
  describe('listAction', () => {
95
- test('lists opened chats by default', async () => {
95
+ it('lists opened chats by default', async () => {
96
96
  const manager = new ChannelBotCredentialManager(tempDir)
97
97
  const result = await listAction({ _credManager: manager })
98
98
 
@@ -102,14 +102,14 @@ describe('chat commands', () => {
102
102
  expect(capturedListArgs[0]).toMatchObject({ state: 'opened' })
103
103
  })
104
104
 
105
- test('passes state filter to API', async () => {
105
+ it('passes state filter to API', async () => {
106
106
  const manager = new ChannelBotCredentialManager(tempDir)
107
107
  await listAction({ state: 'closed', _credManager: manager })
108
108
 
109
109
  expect(capturedListArgs[0]).toMatchObject({ state: 'closed' })
110
110
  })
111
111
 
112
- test('passes pagination params', async () => {
112
+ it('passes pagination params', async () => {
113
113
  const manager = new ChannelBotCredentialManager(tempDir)
114
114
  await listAction({ limit: '10', sort: 'asc', since: 'cursor123', _credManager: manager })
115
115
 
@@ -118,7 +118,7 @@ describe('chat commands', () => {
118
118
  })
119
119
 
120
120
  describe('getAction', () => {
121
- test('returns specific chat', async () => {
121
+ it('returns specific chat', async () => {
122
122
  const manager = new ChannelBotCredentialManager(tempDir)
123
123
  const result = await getAction('chat1', { _credManager: manager })
124
124
 
@@ -129,7 +129,7 @@ describe('chat commands', () => {
129
129
  })
130
130
 
131
131
  describe('closeAction', () => {
132
- test('closes chat with bot name', async () => {
132
+ it('closes chat with bot name', async () => {
133
133
  const manager = new ChannelBotCredentialManager(tempDir)
134
134
  const result = await closeAction('chat1', { bot: 'my-bot', _credManager: manager })
135
135
 
@@ -138,7 +138,7 @@ describe('chat commands', () => {
138
138
  expect(capturedCloseArgs[1]).toBe('my-bot')
139
139
  })
140
140
 
141
- test('returns error when no bot name provided', async () => {
141
+ it('returns error when no bot name provided', async () => {
142
142
  const manager = new ChannelBotCredentialManager(tempDir)
143
143
  const result = await closeAction('chat1', { _credManager: manager })
144
144
 
@@ -148,7 +148,7 @@ describe('chat commands', () => {
148
148
  })
149
149
 
150
150
  describe('deleteAction', () => {
151
- test('deletes chat with --force flag', async () => {
151
+ it('deletes chat with --force flag', async () => {
152
152
  const manager = new ChannelBotCredentialManager(tempDir)
153
153
  const result = await deleteAction('chat1', { force: true, _credManager: manager })
154
154
 
@@ -157,7 +157,7 @@ describe('chat commands', () => {
157
157
  expect(result.deleted).toBe('chat1')
158
158
  })
159
159
 
160
- test('returns error without --force flag', async () => {
160
+ it('returns error without --force flag', async () => {
161
161
  const manager = new ChannelBotCredentialManager(tempDir)
162
162
  const result = await deleteAction('chat1', { _credManager: manager })
163
163
 
@@ -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 { WorkspaceOption } from './shared'
6
6
  import { getClient, getDefaultBotName } from './shared'
@@ -120,11 +120,6 @@ export async function deleteAction(chatId: string, options: ChatOptions): Promis
120
120
  }
121
121
  }
122
122
 
123
- function cliOutput(result: ChatResult, pretty?: boolean): void {
124
- console.log(formatOutput(result, pretty))
125
- if (result.error) process.exit(1)
126
- }
127
-
128
123
  export const chatCommand = new Command('chat')
129
124
  .description('UserChat management commands')
130
125
  .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'
@@ -86,7 +86,7 @@ describe('group commands', () => {
86
86
  })
87
87
 
88
88
  describe('listAction', () => {
89
- test('lists all groups', async () => {
89
+ it('lists all groups', async () => {
90
90
  const manager = new ChannelBotCredentialManager(tempDir)
91
91
  const result = await listAction({ _credManager: manager })
92
92
 
@@ -97,7 +97,7 @@ describe('group commands', () => {
97
97
  })
98
98
 
99
99
  describe('getAction', () => {
100
- test('resolves group by ID', async () => {
100
+ it('resolves group by ID', async () => {
101
101
  const manager = new ChannelBotCredentialManager(tempDir)
102
102
  const result = await getAction('grp1', { _credManager: manager })
103
103
 
@@ -106,7 +106,7 @@ describe('group commands', () => {
106
106
  expect(capturedResolveArg).toBe('grp1')
107
107
  })
108
108
 
109
- test('resolves group by @name', async () => {
109
+ it('resolves group by @name', async () => {
110
110
  const manager = new ChannelBotCredentialManager(tempDir)
111
111
  const result = await getAction('@team-alpha', { _credManager: manager })
112
112
 
@@ -116,7 +116,7 @@ describe('group commands', () => {
116
116
  })
117
117
 
118
118
  describe('messagesAction', () => {
119
- test('gets messages from group', async () => {
119
+ it('gets messages from group', async () => {
120
120
  const manager = new ChannelBotCredentialManager(tempDir)
121
121
  const result = await messagesAction('grp1', { _credManager: manager })
122
122
 
@@ -125,7 +125,7 @@ describe('group commands', () => {
125
125
  expect(result.messages?.[0].id).toBe('msg1')
126
126
  })
127
127
 
128
- test('resolves group by @name before fetching messages', async () => {
128
+ it('resolves group by @name before fetching messages', async () => {
129
129
  const manager = new ChannelBotCredentialManager(tempDir)
130
130
  await messagesAction('@team-alpha', { _credManager: manager })
131
131
 
@@ -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 { WorkspaceOption } from './shared'
6
6
  import { getClient } from './shared'
@@ -93,11 +93,6 @@ export async function messagesAction(group: string, options: GroupOptions): Prom
93
93
  }
94
94
  }
95
95
 
96
- function cliOutput(result: GroupResult, pretty?: boolean): void {
97
- console.log(formatOutput(result, pretty))
98
- if (result.error) process.exit(1)
99
- }
100
-
101
96
  export const groupCommand = new Command('group')
102
97
  .description('Group management commands')
103
98
  .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'
@@ -48,7 +48,7 @@ describe('manager commands', () => {
48
48
  })
49
49
 
50
50
  describe('listAction', () => {
51
- test('returns all managers with id, name, description', async () => {
51
+ it('returns all managers with id, name, description', async () => {
52
52
  const manager = new ChannelBotCredentialManager(tempDir)
53
53
  const result = await listAction({ _credManager: manager })
54
54
 
@@ -60,7 +60,7 @@ describe('manager commands', () => {
60
60
  })
61
61
 
62
62
  describe('getAction', () => {
63
- test('returns specific manager', async () => {
63
+ it('returns specific manager', async () => {
64
64
  const manager = new ChannelBotCredentialManager(tempDir)
65
65
  const result = await getAction('mgr1', { _credManager: manager })
66
66
 
@@ -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 { WorkspaceOption } from './shared'
6
6
  import { getClient } from './shared'
@@ -68,11 +68,6 @@ export async function getAction(managerId: string, options: ManagerOptions): Pro
68
68
  }
69
69
  }
70
70
 
71
- function cliOutput(result: ManagerResult, pretty?: boolean): void {
72
- console.log(formatOutput(result, pretty))
73
- if (result.error) process.exit(1)
74
- }
75
-
76
71
  export const managerCommand = new Command('manager')
77
72
  .description('Manager commands')
78
73
  .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'
@@ -113,7 +113,7 @@ describe('message commands', () => {
113
113
  })
114
114
 
115
115
  describe('sendAction', () => {
116
- test('sends to userchat and wraps text in blocks', async () => {
116
+ it('sends to userchat and wraps text in blocks', async () => {
117
117
  const manager = new ChannelBotCredentialManager(tempDir)
118
118
  const result = await sendAction('chat1', 'Hello world', { type: 'userchat', _credManager: manager })
119
119
 
@@ -122,7 +122,7 @@ describe('message commands', () => {
122
122
  expect(capturedSendUserChatArgs[1]).toEqual([{ type: 'text', value: 'Hello world' }])
123
123
  })
124
124
 
125
- test('sends to group when type=group', async () => {
125
+ it('sends to group when type=group', async () => {
126
126
  const manager = new ChannelBotCredentialManager(tempDir)
127
127
  const result = await sendAction('grp1', 'Hello group', { type: 'group', _credManager: manager })
128
128
 
@@ -131,14 +131,14 @@ describe('message commands', () => {
131
131
  expect(mockSendGroupMessage).toHaveBeenCalledTimes(1)
132
132
  })
133
133
 
134
- test('includes botName in request when --bot provided', async () => {
134
+ it('includes botName in request when --bot provided', async () => {
135
135
  const manager = new ChannelBotCredentialManager(tempDir)
136
136
  await sendAction('chat1', 'Hello', { type: 'userchat', bot: 'my-bot', _credManager: manager })
137
137
 
138
138
  expect(capturedSendUserChatArgs[2]).toBe('my-bot')
139
139
  })
140
140
 
141
- test('auto-detects group target from @ prefix', async () => {
141
+ it('auto-detects group target from @ prefix', async () => {
142
142
  const manager = new ChannelBotCredentialManager(tempDir)
143
143
  await sendAction('@team', 'Hello', { _credManager: manager })
144
144
 
@@ -147,7 +147,7 @@ describe('message commands', () => {
147
147
  })
148
148
 
149
149
  describe('listAction', () => {
150
- test('lists userchat messages', async () => {
150
+ it('lists userchat messages', async () => {
151
151
  const manager = new ChannelBotCredentialManager(tempDir)
152
152
  const result = await listAction('chat1', { type: 'userchat', _credManager: manager })
153
153
 
@@ -156,7 +156,7 @@ describe('message commands', () => {
156
156
  expect(result.messages?.[0].id).toBe('msg1')
157
157
  })
158
158
 
159
- test('lists group messages when type=group', async () => {
159
+ it('lists group messages when type=group', async () => {
160
160
  const manager = new ChannelBotCredentialManager(tempDir)
161
161
  const result = await listAction('grp1', { type: 'group', _credManager: manager })
162
162
 
@@ -165,7 +165,7 @@ describe('message commands', () => {
165
165
  expect(result.messages?.[0].id).toBe('msg2')
166
166
  })
167
167
 
168
- test('passes pagination params', async () => {
168
+ it('passes pagination params', async () => {
169
169
  const manager = new ChannelBotCredentialManager(tempDir)
170
170
  await listAction('chat1', {
171
171
  type: 'userchat',
@@ -181,7 +181,7 @@ describe('message commands', () => {
181
181
  })
182
182
 
183
183
  describe('getAction', () => {
184
- test('returns specific message by ID', async () => {
184
+ it('returns specific message by ID', async () => {
185
185
  const manager = new ChannelBotCredentialManager(tempDir)
186
186
  const result = await getAction('chat1', 'msg1', { type: 'userchat', _credManager: manager })
187
187
 
@@ -189,7 +189,7 @@ describe('message commands', () => {
189
189
  expect(result.id).toBe('msg1')
190
190
  })
191
191
 
192
- test('returns error when message not found', async () => {
192
+ it('returns error when message not found', async () => {
193
193
  const manager = new ChannelBotCredentialManager(tempDir)
194
194
  const result = await getAction('chat1', 'nonexistent', { type: 'userchat', _credManager: manager })
195
195
 
@@ -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 { wrapTextInBlocks } from '../message-utils'
6
6
  import type { WorkspaceOption } from './shared'
@@ -140,11 +140,6 @@ function detectTargetType(target: string): 'userchat' | 'group' {
140
140
  return 'userchat'
141
141
  }
142
142
 
143
- function cliOutput(result: MessageResult, pretty?: boolean): void {
144
- console.log(formatOutput(result, pretty))
145
- if (result.error) process.exit(1)
146
- }
147
-
148
143
  export const messageCommand = new Command('message')
149
144
  .description('Message commands')
150
145
  .addCommand(