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
@@ -0,0 +1,212 @@
1
+ import { readFileSync, statSync, writeFileSync } from 'node:fs'
2
+ import { basename, join, resolve } from 'node:path'
3
+
4
+ import { Command } from 'commander'
5
+
6
+ import { handleError } from '@/shared/utils/error-handler'
7
+ import { formatOutput } from '@/shared/utils/output'
8
+
9
+ import { type BotOption, getClient } from './shared'
10
+
11
+ async function uploadAction(
12
+ channelInput: string,
13
+ path: string,
14
+ options: BotOption & { filename?: string; thread?: string; title?: string; comment?: string },
15
+ ): Promise<void> {
16
+ try {
17
+ const client = await getClient(options)
18
+ const channel = await client.resolveChannel(channelInput)
19
+
20
+ const filePath = resolve(path)
21
+ const fileBuffer = readFileSync(filePath)
22
+ const filename = options.filename || basename(filePath) || 'file'
23
+
24
+ const file = await client.uploadFile(channel, fileBuffer, filename, {
25
+ thread_ts: options.thread,
26
+ title: options.title,
27
+ initial_comment: options.comment,
28
+ })
29
+
30
+ console.log(
31
+ formatOutput(
32
+ {
33
+ id: file.id,
34
+ name: file.name,
35
+ title: file.title,
36
+ mimetype: file.mimetype,
37
+ size: file.size,
38
+ url_private: file.url_private,
39
+ created: file.created,
40
+ user: file.user,
41
+ channels: file.channels,
42
+ },
43
+ options.pretty,
44
+ ),
45
+ )
46
+ } catch (error) {
47
+ handleError(error as Error)
48
+ }
49
+ }
50
+
51
+ async function listAction(options: BotOption & { channel?: string; user?: string; limit?: string }): Promise<void> {
52
+ try {
53
+ const client = await getClient(options)
54
+ const channel = options.channel ? await client.resolveChannel(options.channel) : undefined
55
+ const limit = options.limit ? parseInt(options.limit, 10) : undefined
56
+
57
+ const files = await client.listFiles({ channel, user: options.user, limit })
58
+
59
+ console.log(
60
+ formatOutput(
61
+ files.map((file) => ({
62
+ id: file.id,
63
+ name: file.name,
64
+ title: file.title,
65
+ mimetype: file.mimetype,
66
+ size: file.size,
67
+ url_private: file.url_private,
68
+ created: file.created,
69
+ user: file.user,
70
+ channels: file.channels,
71
+ })),
72
+ options.pretty,
73
+ ),
74
+ )
75
+ } catch (error) {
76
+ handleError(error as Error)
77
+ }
78
+ }
79
+
80
+ async function infoAction(fileId: string, options: BotOption): Promise<void> {
81
+ try {
82
+ const client = await getClient(options)
83
+ const file = await client.getFileInfo(fileId)
84
+
85
+ console.log(
86
+ formatOutput(
87
+ {
88
+ id: file.id,
89
+ name: file.name,
90
+ title: file.title,
91
+ mimetype: file.mimetype,
92
+ size: file.size,
93
+ url_private: file.url_private,
94
+ created: file.created,
95
+ user: file.user,
96
+ channels: file.channels,
97
+ },
98
+ options.pretty,
99
+ ),
100
+ )
101
+ } catch (error) {
102
+ handleError(error as Error)
103
+ }
104
+ }
105
+
106
+ async function downloadAction(fileId: string, outputPath: string | undefined, options: BotOption): Promise<void> {
107
+ try {
108
+ const client = await getClient(options)
109
+ const { buffer, file } = await client.downloadFile(fileId)
110
+
111
+ const safeName = basename(file.name.replace(/\\/g, '/'))
112
+ let destPath = outputPath ? resolve(outputPath) : resolve(safeName)
113
+ let isDirectory = false
114
+ try {
115
+ isDirectory = statSync(destPath).isDirectory()
116
+ } catch (error) {
117
+ const err = error as NodeJS.ErrnoException
118
+ if (err.code !== 'ENOENT') {
119
+ throw error
120
+ }
121
+ }
122
+
123
+ if (isDirectory) {
124
+ destPath = join(destPath, safeName)
125
+ }
126
+
127
+ writeFileSync(destPath, buffer)
128
+
129
+ console.log(
130
+ formatOutput(
131
+ {
132
+ id: file.id,
133
+ name: file.name,
134
+ mimetype: file.mimetype,
135
+ size: file.size,
136
+ path: destPath,
137
+ },
138
+ options.pretty,
139
+ ),
140
+ )
141
+ } catch (error) {
142
+ handleError(error as Error)
143
+ }
144
+ }
145
+
146
+ async function deleteAction(fileId: string, options: BotOption & { force?: boolean }): Promise<void> {
147
+ try {
148
+ if (!options.force) {
149
+ console.log(formatOutput({ warning: 'Use --force to confirm deletion', file_id: fileId }, options.pretty))
150
+ process.exit(1)
151
+ }
152
+
153
+ const client = await getClient(options)
154
+ await client.deleteFile(fileId)
155
+
156
+ console.log(formatOutput({ deleted: fileId }, options.pretty))
157
+ } catch (error) {
158
+ handleError(error as Error)
159
+ }
160
+ }
161
+
162
+ export const fileCommand = new Command('file')
163
+ .description('File commands')
164
+ .addCommand(
165
+ new Command('upload')
166
+ .description('Upload file to a channel')
167
+ .argument('<channel>', 'Channel ID or name')
168
+ .argument('<path>', 'File path')
169
+ .option('--filename <name>', 'Override filename')
170
+ .option('--thread <ts>', 'Upload as a reply to a thread')
171
+ .option('--title <title>', 'File title')
172
+ .option('--comment <text>', 'Initial comment posted with the file')
173
+ .option('--bot <id>', 'Use specific bot')
174
+ .option('--pretty', 'Pretty print JSON output')
175
+ .action(uploadAction),
176
+ )
177
+ .addCommand(
178
+ new Command('list')
179
+ .description('List files visible to the bot')
180
+ .option('--channel <id>', 'Filter by channel ID or name')
181
+ .option('--user <id>', 'Filter by user ID')
182
+ .option('--limit <n>', 'Number of files to fetch')
183
+ .option('--bot <id>', 'Use specific bot')
184
+ .option('--pretty', 'Pretty print JSON output')
185
+ .action(listAction),
186
+ )
187
+ .addCommand(
188
+ new Command('info')
189
+ .description('Show file details')
190
+ .argument('<file>', 'File ID')
191
+ .option('--bot <id>', 'Use specific bot')
192
+ .option('--pretty', 'Pretty print JSON output')
193
+ .action(infoAction),
194
+ )
195
+ .addCommand(
196
+ new Command('download')
197
+ .description('Download a file by ID')
198
+ .argument('<file>', 'File ID')
199
+ .argument('[output-path]', 'Output file path or directory')
200
+ .option('--bot <id>', 'Use specific bot')
201
+ .option('--pretty', 'Pretty print JSON output')
202
+ .action(downloadAction),
203
+ )
204
+ .addCommand(
205
+ new Command('delete')
206
+ .description("Delete a file (bot's own files only)")
207
+ .argument('<file>', 'File ID')
208
+ .option('--force', 'Skip confirmation')
209
+ .option('--bot <id>', 'Use specific bot')
210
+ .option('--pretty', 'Pretty print JSON output')
211
+ .action(deleteAction),
212
+ )
@@ -1,5 +1,6 @@
1
1
  export { authCommand } from './auth'
2
2
  export { channelCommand } from './channel'
3
+ export { fileCommand } from './file'
3
4
  export { messageCommand } from './message'
4
5
  export { reactionCommand } from './reaction'
5
6
  export { userCommand } from './user'
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockResolveChannel = mock((_channel: string) => Promise.resolve('C123456'))
4
4
  const mockPostMessage = mock(() =>
@@ -68,7 +68,7 @@ describe('message commands', () => {
68
68
  })
69
69
 
70
70
  describe('postMessage', () => {
71
- test('sends message to channel', async () => {
71
+ it('sends message to channel', async () => {
72
72
  // given
73
73
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
74
74
 
@@ -81,7 +81,7 @@ describe('message commands', () => {
81
81
  expect(result.type).toBe('message')
82
82
  })
83
83
 
84
- test('sends message with thread_ts', async () => {
84
+ it('sends message with thread_ts', async () => {
85
85
  // given
86
86
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
87
87
 
@@ -94,7 +94,7 @@ describe('message commands', () => {
94
94
  })
95
95
 
96
96
  describe('getConversationHistory', () => {
97
- test('returns messages from channel', async () => {
97
+ it('returns messages from channel', async () => {
98
98
  // given
99
99
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
100
100
 
@@ -107,7 +107,7 @@ describe('message commands', () => {
107
107
  expect(messages[1].text).toBe('World')
108
108
  })
109
109
 
110
- test('passes limit option', async () => {
110
+ it('passes limit option', async () => {
111
111
  // given
112
112
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
113
113
 
@@ -120,7 +120,7 @@ describe('message commands', () => {
120
120
  })
121
121
 
122
122
  describe('getMessage', () => {
123
- test('returns single message by ts', async () => {
123
+ it('returns single message by ts', async () => {
124
124
  // given
125
125
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
126
126
 
@@ -133,7 +133,7 @@ describe('message commands', () => {
133
133
  expect(message?.text).toBe('Hello world')
134
134
  })
135
135
 
136
- test('returns null when message not found', async () => {
136
+ it('returns null when message not found', async () => {
137
137
  // given
138
138
  mockGetMessage.mockResolvedValueOnce(null)
139
139
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
@@ -147,7 +147,7 @@ describe('message commands', () => {
147
147
  })
148
148
 
149
149
  describe('updateMessage', () => {
150
- test('updates message text', async () => {
150
+ it('updates message text', async () => {
151
151
  // given
152
152
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
153
153
 
@@ -159,7 +159,7 @@ describe('message commands', () => {
159
159
  expect(result.text).toBe('Updated text')
160
160
  })
161
161
 
162
- test('called with correct arguments', async () => {
162
+ it('passes correct arguments', async () => {
163
163
  // given
164
164
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
165
165
 
@@ -172,7 +172,7 @@ describe('message commands', () => {
172
172
  })
173
173
 
174
174
  describe('deleteMessage', () => {
175
- test('deletes message by ts', async () => {
175
+ it('deletes message by ts', async () => {
176
176
  // given
177
177
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
178
178
 
@@ -185,7 +185,7 @@ describe('message commands', () => {
185
185
  })
186
186
 
187
187
  describe('getThreadReplies', () => {
188
- test('returns thread replies', async () => {
188
+ it('returns thread replies', async () => {
189
189
  // given
190
190
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
191
191
 
@@ -198,7 +198,7 @@ describe('message commands', () => {
198
198
  expect(replies[1].text).toBe('Thread reply 2')
199
199
  })
200
200
 
201
- test('passes limit option', async () => {
201
+ it('passes limit option', async () => {
202
202
  // given
203
203
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
204
204
 
@@ -211,7 +211,7 @@ describe('message commands', () => {
211
211
  })
212
212
 
213
213
  describe('resolveChannel', () => {
214
- test('resolves channel name to ID', async () => {
214
+ it('resolves channel name to ID', async () => {
215
215
  // given
216
216
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
217
217
 
@@ -98,6 +98,18 @@ async function deleteAction(channelInput: string, ts: string, options: BotOption
98
98
  }
99
99
  }
100
100
 
101
+ async function typingAction(channelInput: string, threadTs: string, status: string, options: BotOption): Promise<void> {
102
+ try {
103
+ const client = await getClient(options)
104
+ const channel = await client.resolveChannel(channelInput)
105
+ await client.setAssistantStatus(channel, threadTs, status)
106
+
107
+ console.log(formatOutput({ channel, thread_ts: threadTs, status }, options.pretty))
108
+ } catch (error) {
109
+ handleError(error as Error)
110
+ }
111
+ }
112
+
101
113
  async function repliesAction(
102
114
  channelInput: string,
103
115
  threadTs: string,
@@ -165,6 +177,16 @@ export const messageCommand = new Command('message')
165
177
  .option('--pretty', 'Pretty print JSON output')
166
178
  .action(deleteAction),
167
179
  )
180
+ .addCommand(
181
+ new Command('typing')
182
+ .description('Set typing status in an AI Assistant thread (e.g. "is typing...")')
183
+ .argument('<channel>', 'Channel ID or name')
184
+ .argument('<thread_ts>', 'Thread timestamp')
185
+ .argument('[status]', 'Status text (pass empty string to clear)', 'is typing...')
186
+ .option('--bot <id>', 'Use specific bot')
187
+ .option('--pretty', 'Pretty print JSON output')
188
+ .action(typingAction),
189
+ )
168
190
  .addCommand(
169
191
  new Command('replies')
170
192
  .description('Get thread replies')
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockResolveChannel = mock((_channel: string) => Promise.resolve('C123456'))
4
4
  const mockAddReaction = mock(() => Promise.resolve())
@@ -25,7 +25,7 @@ describe('reaction commands', () => {
25
25
  })
26
26
 
27
27
  describe('addReaction', () => {
28
- test('adds emoji reaction to message', async () => {
28
+ it('adds emoji reaction to message', async () => {
29
29
  // given
30
30
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
31
31
 
@@ -36,7 +36,7 @@ describe('reaction commands', () => {
36
36
  expect(mockAddReaction).toHaveBeenCalledWith('C123456', '1234567890.000100', 'thumbsup')
37
37
  })
38
38
 
39
- test('called with correct arguments', async () => {
39
+ it('passes correct arguments', async () => {
40
40
  // given
41
41
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
42
42
 
@@ -50,7 +50,7 @@ describe('reaction commands', () => {
50
50
  })
51
51
 
52
52
  describe('removeReaction', () => {
53
- test('removes emoji reaction from message', async () => {
53
+ it('removes emoji reaction from message', async () => {
54
54
  // given
55
55
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
56
56
 
@@ -61,7 +61,7 @@ describe('reaction commands', () => {
61
61
  expect(mockRemoveReaction).toHaveBeenCalledWith('C123456', '1234567890.000100', 'thumbsup')
62
62
  })
63
63
 
64
- test('called with correct arguments', async () => {
64
+ it('passes correct arguments', async () => {
65
65
  // given
66
66
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
67
67
 
@@ -75,7 +75,7 @@ describe('reaction commands', () => {
75
75
  })
76
76
 
77
77
  describe('resolveChannel', () => {
78
- test('resolves channel name before reaction', async () => {
78
+ it('resolves channel name before reaction', async () => {
79
79
  // given
80
80
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
81
81
 
@@ -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 mockListUsers = mock(() =>
4
4
  Promise.resolve([
@@ -61,7 +61,7 @@ describe('user commands', () => {
61
61
  })
62
62
 
63
63
  describe('listUsers', () => {
64
- test('returns list of users', async () => {
64
+ it('returns list of users', async () => {
65
65
  // given
66
66
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
67
67
 
@@ -74,7 +74,7 @@ describe('user commands', () => {
74
74
  expect(users[1].name).toBe('bob')
75
75
  })
76
76
 
77
- test('includes user metadata', async () => {
77
+ it('includes user metadata', async () => {
78
78
  // given
79
79
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
80
80
 
@@ -90,7 +90,7 @@ describe('user commands', () => {
90
90
  expect(user.is_admin).toBe(false)
91
91
  })
92
92
 
93
- test('passes limit option', async () => {
93
+ it('passes limit option', async () => {
94
94
  // given
95
95
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
96
96
 
@@ -103,7 +103,7 @@ describe('user commands', () => {
103
103
  })
104
104
 
105
105
  describe('getUserInfo', () => {
106
- test('returns user details by ID', async () => {
106
+ it('returns user details by ID', async () => {
107
107
  // given
108
108
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
109
109
 
@@ -116,7 +116,7 @@ describe('user commands', () => {
116
116
  expect(user.real_name).toBe('Alice Smith')
117
117
  })
118
118
 
119
- test('includes profile information', async () => {
119
+ it('includes profile information', async () => {
120
120
  // given
121
121
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
122
122
 
@@ -129,7 +129,7 @@ describe('user commands', () => {
129
129
  expect(user.profile?.status_text).toBe('Working from home')
130
130
  })
131
131
 
132
- test('called with correct user ID', async () => {
132
+ it('passes the user ID to getUserInfo', async () => {
133
133
  // given
134
134
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
135
135
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
@@ -45,7 +45,7 @@ describe('whoami command', () => {
45
45
  process.env = originalEnv
46
46
  })
47
47
 
48
- test('returns auth info for current bot', async () => {
48
+ it('returns auth info for current bot', async () => {
49
49
  const manager = new SlackBotCredentialManager(tempDir)
50
50
  await manager.setCredentials({
51
51
  token: 'xoxb-test-token',
@@ -65,7 +65,7 @@ describe('whoami command', () => {
65
65
  expect(result.error).toBeUndefined()
66
66
  })
67
67
 
68
- test('returns auth info for specific --bot', async () => {
68
+ it('returns auth info for specific --bot', async () => {
69
69
  const manager = new SlackBotCredentialManager(tempDir)
70
70
  await manager.setCredentials({
71
71
  token: 'xoxb-test-token',
@@ -82,7 +82,7 @@ describe('whoami command', () => {
82
82
  expect(mockTestAuth).toHaveBeenCalledTimes(1)
83
83
  })
84
84
 
85
- test('returns error when client throws', async () => {
85
+ it('returns error when client throws', async () => {
86
86
  mockTestAuth.mockImplementationOnce(() => Promise.reject(new Error('API Error')))
87
87
 
88
88
  const manager = new SlackBotCredentialManager(tempDir)
@@ -1,6 +1,6 @@
1
1
  import { Command } from 'commander'
2
2
 
3
- import { formatOutput } from '@/shared/utils/output'
3
+ import { cliOutput } from '@/shared/utils/cli-output'
4
4
 
5
5
  import type { BotOption } from './shared'
6
6
  import { getClient } from './shared'
@@ -30,11 +30,6 @@ export async function whoamiAction(options: BotOption): Promise<WhoamiResult> {
30
30
  }
31
31
  }
32
32
 
33
- function cliOutput(result: WhoamiResult, pretty?: boolean): void {
34
- console.log(formatOutput(result, pretty))
35
- if (result.error) process.exit(1)
36
- }
37
-
38
33
  export const whoamiCommand = new Command('whoami')
39
34
  .description('Show current authenticated bot')
40
35
  .option('--bot <id>', 'Bot ID to use')