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 { expect, test } from 'bun:test'
1
+ import { expect, it } from 'bun:test'
2
2
 
3
3
  import {
4
4
  ConfigSchema,
@@ -10,7 +10,7 @@ import {
10
10
  WorkspaceCredentialsSchema,
11
11
  } from '@/platforms/slack/types'
12
12
 
13
- test('SlackChannelSchema validates correct data', () => {
13
+ it('SlackChannelSchema validates correct data', () => {
14
14
  const validChannel = {
15
15
  id: 'C123456',
16
16
  name: 'general',
@@ -22,7 +22,7 @@ test('SlackChannelSchema validates correct data', () => {
22
22
  expect(() => SlackChannelSchema.parse(validChannel)).not.toThrow()
23
23
  })
24
24
 
25
- test('SlackChannelSchema validates with optional fields', () => {
25
+ it('SlackChannelSchema validates with optional fields', () => {
26
26
  const validChannel = {
27
27
  id: 'C123456',
28
28
  name: 'general',
@@ -44,7 +44,7 @@ test('SlackChannelSchema validates with optional fields', () => {
44
44
  expect(() => SlackChannelSchema.parse(validChannel)).not.toThrow()
45
45
  })
46
46
 
47
- test('SlackChannelSchema rejects missing required fields', () => {
47
+ it('SlackChannelSchema rejects missing required fields', () => {
48
48
  const invalidChannel = {
49
49
  id: 'C123456',
50
50
  name: 'general',
@@ -52,7 +52,7 @@ test('SlackChannelSchema rejects missing required fields', () => {
52
52
  expect(() => SlackChannelSchema.parse(invalidChannel)).toThrow()
53
53
  })
54
54
 
55
- test('SlackMessageSchema validates correct data', () => {
55
+ it('SlackMessageSchema validates correct data', () => {
56
56
  const validMessage = {
57
57
  ts: '1234567890.123456',
58
58
  text: 'Hello world',
@@ -61,7 +61,7 @@ test('SlackMessageSchema validates correct data', () => {
61
61
  expect(() => SlackMessageSchema.parse(validMessage)).not.toThrow()
62
62
  })
63
63
 
64
- test('SlackMessageSchema validates with optional fields', () => {
64
+ it('SlackMessageSchema validates with optional fields', () => {
65
65
  const validMessage = {
66
66
  ts: '1234567890.123456',
67
67
  text: 'Hello world',
@@ -79,7 +79,7 @@ test('SlackMessageSchema validates with optional fields', () => {
79
79
  expect(() => SlackMessageSchema.parse(validMessage)).not.toThrow()
80
80
  })
81
81
 
82
- test('SlackMessageSchema validates with files', () => {
82
+ it('SlackMessageSchema validates with files', () => {
83
83
  const validMessage = {
84
84
  ts: '1234567890.123456',
85
85
  text: 'Hello world',
@@ -102,14 +102,14 @@ test('SlackMessageSchema validates with files', () => {
102
102
  expect(() => SlackMessageSchema.parse(validMessage)).not.toThrow()
103
103
  })
104
104
 
105
- test('SlackMessageSchema rejects missing required fields', () => {
105
+ it('SlackMessageSchema rejects missing required fields', () => {
106
106
  const invalidMessage = {
107
107
  ts: '1234567890.123456',
108
108
  }
109
109
  expect(() => SlackMessageSchema.parse(invalidMessage)).toThrow()
110
110
  })
111
111
 
112
- test('SlackUserSchema validates correct data', () => {
112
+ it('SlackUserSchema validates correct data', () => {
113
113
  const validUser = {
114
114
  id: 'U123456',
115
115
  name: 'john',
@@ -122,7 +122,7 @@ test('SlackUserSchema validates correct data', () => {
122
122
  expect(() => SlackUserSchema.parse(validUser)).not.toThrow()
123
123
  })
124
124
 
125
- test('SlackUserSchema validates with optional profile', () => {
125
+ it('SlackUserSchema validates with optional profile', () => {
126
126
  const validUser = {
127
127
  id: 'U123456',
128
128
  name: 'john',
@@ -141,7 +141,7 @@ test('SlackUserSchema validates with optional profile', () => {
141
141
  expect(() => SlackUserSchema.parse(validUser)).not.toThrow()
142
142
  })
143
143
 
144
- test('SlackUserSchema rejects missing required fields', () => {
144
+ it('SlackUserSchema rejects missing required fields', () => {
145
145
  const invalidUser = {
146
146
  id: 'U123456',
147
147
  name: 'john',
@@ -149,7 +149,7 @@ test('SlackUserSchema rejects missing required fields', () => {
149
149
  expect(() => SlackUserSchema.parse(invalidUser)).toThrow()
150
150
  })
151
151
 
152
- test('SlackReactionSchema validates correct data', () => {
152
+ it('SlackReactionSchema validates correct data', () => {
153
153
  const validReaction = {
154
154
  name: 'thumbsup',
155
155
  count: 3,
@@ -158,7 +158,7 @@ test('SlackReactionSchema validates correct data', () => {
158
158
  expect(() => SlackReactionSchema.parse(validReaction)).not.toThrow()
159
159
  })
160
160
 
161
- test('SlackReactionSchema rejects invalid data', () => {
161
+ it('SlackReactionSchema rejects invalid data', () => {
162
162
  const invalidReaction = {
163
163
  name: 'thumbsup',
164
164
  count: 'three',
@@ -167,7 +167,7 @@ test('SlackReactionSchema rejects invalid data', () => {
167
167
  expect(() => SlackReactionSchema.parse(invalidReaction)).toThrow()
168
168
  })
169
169
 
170
- test('SlackFileSchema validates correct data', () => {
170
+ it('SlackFileSchema validates correct data', () => {
171
171
  const validFile = {
172
172
  id: 'F123456',
173
173
  name: 'document.pdf',
@@ -181,7 +181,7 @@ test('SlackFileSchema validates correct data', () => {
181
181
  expect(() => SlackFileSchema.parse(validFile)).not.toThrow()
182
182
  })
183
183
 
184
- test('SlackFileSchema validates with optional channels', () => {
184
+ it('SlackFileSchema validates with optional channels', () => {
185
185
  const validFile = {
186
186
  id: 'F123456',
187
187
  name: 'document.pdf',
@@ -196,7 +196,7 @@ test('SlackFileSchema validates with optional channels', () => {
196
196
  expect(() => SlackFileSchema.parse(validFile)).not.toThrow()
197
197
  })
198
198
 
199
- test('SlackFileSchema rejects missing required fields', () => {
199
+ it('SlackFileSchema rejects missing required fields', () => {
200
200
  const invalidFile = {
201
201
  id: 'F123456',
202
202
  name: 'document.pdf',
@@ -204,7 +204,7 @@ test('SlackFileSchema rejects missing required fields', () => {
204
204
  expect(() => SlackFileSchema.parse(invalidFile)).toThrow()
205
205
  })
206
206
 
207
- test('WorkspaceCredentialsSchema validates correct data', () => {
207
+ it('WorkspaceCredentialsSchema validates correct data', () => {
208
208
  const validCredentials = {
209
209
  workspace_id: 'T123456',
210
210
  workspace_name: 'my-workspace',
@@ -214,7 +214,7 @@ test('WorkspaceCredentialsSchema validates correct data', () => {
214
214
  expect(() => WorkspaceCredentialsSchema.parse(validCredentials)).not.toThrow()
215
215
  })
216
216
 
217
- test('WorkspaceCredentialsSchema rejects missing fields', () => {
217
+ it('WorkspaceCredentialsSchema rejects missing fields', () => {
218
218
  const invalidCredentials = {
219
219
  workspace_id: 'T123456',
220
220
  workspace_name: 'my-workspace',
@@ -222,7 +222,7 @@ test('WorkspaceCredentialsSchema rejects missing fields', () => {
222
222
  expect(() => WorkspaceCredentialsSchema.parse(invalidCredentials)).toThrow()
223
223
  })
224
224
 
225
- test('ConfigSchema validates correct data', () => {
225
+ it('ConfigSchema validates correct data', () => {
226
226
  const validConfig = {
227
227
  current_workspace: 'T123456',
228
228
  workspaces: {
@@ -237,7 +237,7 @@ test('ConfigSchema validates correct data', () => {
237
237
  expect(() => ConfigSchema.parse(validConfig)).not.toThrow()
238
238
  })
239
239
 
240
- test('ConfigSchema validates with null current_workspace', () => {
240
+ it('ConfigSchema validates with null current_workspace', () => {
241
241
  const validConfig = {
242
242
  current_workspace: null,
243
243
  workspaces: {
@@ -252,7 +252,7 @@ test('ConfigSchema validates with null current_workspace', () => {
252
252
  expect(() => ConfigSchema.parse(validConfig)).not.toThrow()
253
253
  })
254
254
 
255
- test('ConfigSchema rejects invalid workspace credentials', () => {
255
+ it('ConfigSchema rejects invalid workspace credentials', () => {
256
256
  const invalidConfig = {
257
257
  current_workspace: 'T123456',
258
258
  workspaces: {
@@ -6,6 +6,7 @@ import pkg from '../../../package.json' with { type: 'json' }
6
6
  import {
7
7
  authCommand,
8
8
  channelCommand,
9
+ fileCommand,
9
10
  messageCommand,
10
11
  reactionCommand,
11
12
  userCommand,
@@ -18,7 +19,17 @@ program
18
19
  .name('agent-slackbot')
19
20
  .description('CLI tool for Slack bot integration using bot tokens (xoxb-)')
20
21
  .version(pkg.version)
22
+ .option('--pretty', 'Pretty-print JSON output')
21
23
  .option('--bot <id>', 'Use specific bot (default: current)')
24
+ .hook('preAction', (thisCmd, actionCmd) => {
25
+ for (const [key, value] of Object.entries(thisCmd.opts())) {
26
+ if (value === undefined) continue
27
+ const source = actionCmd.getOptionValueSource(key)
28
+ if (source === undefined || source === 'default') {
29
+ actionCmd.setOptionValue(key, value)
30
+ }
31
+ }
32
+ })
22
33
 
23
34
  program.addCommand(authCommand)
24
35
  program.addCommand(whoamiCommand)
@@ -26,7 +37,8 @@ program.addCommand(messageCommand)
26
37
  program.addCommand(channelCommand)
27
38
  program.addCommand(userCommand)
28
39
  program.addCommand(reactionCommand)
40
+ program.addCommand(fileCommand)
29
41
 
30
- program.parse(process.argv)
42
+ program.parseAsync(process.argv)
31
43
 
32
44
  export default program
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  import { SlackBotClient } from './client'
4
4
  import { SlackBotError } from './types'
@@ -65,6 +65,70 @@ const mockReactions = {
65
65
  add: mock(() => Promise.resolve({ ok: true })),
66
66
  remove: mock(() => Promise.resolve({ ok: true })),
67
67
  }
68
+ const mockAssistant = {
69
+ threads: {
70
+ setStatus: mock(() => Promise.resolve({ ok: true })),
71
+ },
72
+ }
73
+ const mockFiles = {
74
+ uploadV2: mock(() =>
75
+ Promise.resolve({
76
+ ok: true,
77
+ files: [
78
+ {
79
+ ok: true,
80
+ files: [
81
+ {
82
+ id: 'F123',
83
+ name: 'test.txt',
84
+ title: 'test.txt',
85
+ mimetype: 'text/plain',
86
+ size: 12,
87
+ url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
88
+ created: 1234567890,
89
+ user: 'U123',
90
+ channels: ['C123'],
91
+ },
92
+ ],
93
+ },
94
+ ],
95
+ }),
96
+ ),
97
+ list: mock(() =>
98
+ Promise.resolve({
99
+ ok: true,
100
+ files: [
101
+ {
102
+ id: 'F123',
103
+ name: 'test.txt',
104
+ title: 'test.txt',
105
+ mimetype: 'text/plain',
106
+ size: 1024,
107
+ url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
108
+ created: 1234567890,
109
+ user: 'U123',
110
+ },
111
+ ],
112
+ }),
113
+ ),
114
+ info: mock(() =>
115
+ Promise.resolve({
116
+ ok: true,
117
+ file: {
118
+ id: 'F123',
119
+ name: 'test.txt',
120
+ title: 'test.txt',
121
+ mimetype: 'text/plain',
122
+ size: 1024,
123
+ url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
124
+ created: 1234567890,
125
+ user: 'U123',
126
+ channels: ['C123'],
127
+ },
128
+ }),
129
+ ),
130
+ delete: mock(() => Promise.resolve({ ok: true })),
131
+ }
68
132
  const mockUsers = {
69
133
  list: mock(() =>
70
134
  Promise.resolve({
@@ -105,6 +169,8 @@ mock.module('@slack/web-api', () => ({
105
169
  chat = mockChat
106
170
  reactions = mockReactions
107
171
  users = mockUsers
172
+ files = mockFiles
173
+ assistant = mockAssistant
108
174
  },
109
175
  }))
110
176
 
@@ -120,33 +186,38 @@ describe('SlackBotClient', () => {
120
186
  mockReactions.remove.mockClear()
121
187
  mockUsers.list.mockClear()
122
188
  mockUsers.info.mockClear()
189
+ mockFiles.uploadV2.mockClear()
190
+ mockFiles.list.mockClear()
191
+ mockFiles.info.mockClear()
192
+ mockFiles.delete.mockClear()
193
+ mockAssistant.threads.setStatus.mockClear()
123
194
  })
124
195
 
125
196
  describe('login', () => {
126
- test('accepts bot tokens (xoxb-)', async () => {
197
+ it('accepts bot tokens (xoxb-)', async () => {
127
198
  // when/then: should not throw
128
199
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
129
200
  expect(client).toBeDefined()
130
201
  })
131
202
 
132
- test('rejects user tokens (xoxp-)', async () => {
203
+ it('rejects user tokens (xoxp-)', async () => {
133
204
  // when/then
134
205
  await expect(new SlackBotClient().login({ token: 'xoxp-user-token' })).rejects.toThrow(SlackBotError)
135
206
  })
136
207
 
137
- test('rejects empty token', async () => {
208
+ it('rejects empty token', async () => {
138
209
  // when/then
139
210
  await expect(new SlackBotClient().login({ token: '' })).rejects.toThrow(SlackBotError)
140
211
  })
141
212
 
142
- test('rejects non-bot tokens', async () => {
213
+ it('rejects non-bot tokens', async () => {
143
214
  // when/then
144
215
  await expect(new SlackBotClient().login({ token: 'invalid-token' })).rejects.toThrow(SlackBotError)
145
216
  })
146
217
  })
147
218
 
148
219
  describe('testAuth', () => {
149
- test('returns auth info for valid token', async () => {
220
+ it('returns auth info for valid token', async () => {
150
221
  // given
151
222
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
152
223
 
@@ -161,7 +232,7 @@ describe('SlackBotClient', () => {
161
232
  })
162
233
 
163
234
  describe('postMessage', () => {
164
- test('sends message and returns timestamp', async () => {
235
+ it('sends message and returns timestamp', async () => {
165
236
  // given
166
237
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
167
238
 
@@ -175,7 +246,7 @@ describe('SlackBotClient', () => {
175
246
  })
176
247
 
177
248
  describe('getConversationHistory', () => {
178
- test('returns messages', async () => {
249
+ it('returns messages', async () => {
179
250
  // given
180
251
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
181
252
 
@@ -189,7 +260,7 @@ describe('SlackBotClient', () => {
189
260
  })
190
261
 
191
262
  describe('getMessage', () => {
192
- test('returns single message', async () => {
263
+ it('returns single message', async () => {
193
264
  // given
194
265
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
195
266
 
@@ -203,7 +274,7 @@ describe('SlackBotClient', () => {
203
274
  })
204
275
 
205
276
  describe('addReaction', () => {
206
- test('adds reaction to message', async () => {
277
+ it('adds reaction to message', async () => {
207
278
  // given
208
279
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
209
280
 
@@ -214,7 +285,7 @@ describe('SlackBotClient', () => {
214
285
  })
215
286
 
216
287
  describe('removeReaction', () => {
217
- test('removes reaction from message', async () => {
288
+ it('removes reaction from message', async () => {
218
289
  // given
219
290
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
220
291
 
@@ -224,8 +295,40 @@ describe('SlackBotClient', () => {
224
295
  })
225
296
  })
226
297
 
298
+ describe('setAssistantStatus', () => {
299
+ it('sets assistant typing status with channel_id and thread_ts', async () => {
300
+ // given
301
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
302
+
303
+ // when
304
+ await client.setAssistantStatus('C123', '1234567890.123456', 'is typing...')
305
+
306
+ // then
307
+ expect(mockAssistant.threads.setStatus).toHaveBeenCalledWith({
308
+ channel_id: 'C123',
309
+ thread_ts: '1234567890.123456',
310
+ status: 'is typing...',
311
+ })
312
+ })
313
+
314
+ it('clears status when given empty string', async () => {
315
+ // given
316
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
317
+
318
+ // when
319
+ await client.setAssistantStatus('C123', '1234567890.123456', '')
320
+
321
+ // then
322
+ expect(mockAssistant.threads.setStatus).toHaveBeenCalledWith({
323
+ channel_id: 'C123',
324
+ thread_ts: '1234567890.123456',
325
+ status: '',
326
+ })
327
+ })
328
+ })
329
+
227
330
  describe('listChannels', () => {
228
- test('returns list of channels', async () => {
331
+ it('returns list of channels', async () => {
229
332
  // given
230
333
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
231
334
 
@@ -240,7 +343,7 @@ describe('SlackBotClient', () => {
240
343
  })
241
344
 
242
345
  describe('getChannelInfo', () => {
243
- test('returns channel details', async () => {
346
+ it('returns channel details', async () => {
244
347
  // given
245
348
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
246
349
 
@@ -254,7 +357,7 @@ describe('SlackBotClient', () => {
254
357
  })
255
358
 
256
359
  describe('resolveChannel', () => {
257
- test('returns channel ID unchanged when it starts with C', async () => {
360
+ it('returns channel ID unchanged when it starts with C', async () => {
258
361
  // given
259
362
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
260
363
 
@@ -266,7 +369,7 @@ describe('SlackBotClient', () => {
266
369
  expect(mockConversations.list).not.toHaveBeenCalled()
267
370
  })
268
371
 
269
- test('returns channel ID unchanged when it starts with D', async () => {
372
+ it('returns channel ID unchanged when it starts with D', async () => {
270
373
  // given
271
374
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
272
375
 
@@ -278,7 +381,7 @@ describe('SlackBotClient', () => {
278
381
  expect(mockConversations.list).not.toHaveBeenCalled()
279
382
  })
280
383
 
281
- test('returns channel ID unchanged when it starts with G', async () => {
384
+ it('returns channel ID unchanged when it starts with G', async () => {
282
385
  // given
283
386
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
284
387
 
@@ -290,7 +393,7 @@ describe('SlackBotClient', () => {
290
393
  expect(mockConversations.list).not.toHaveBeenCalled()
291
394
  })
292
395
 
293
- test('resolves channel name to ID', async () => {
396
+ it('resolves channel name to ID', async () => {
294
397
  // given
295
398
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
296
399
 
@@ -302,7 +405,7 @@ describe('SlackBotClient', () => {
302
405
  expect(mockConversations.list).toHaveBeenCalled()
303
406
  })
304
407
 
305
- test('strips leading # from channel name', async () => {
408
+ it('strips leading # from channel name', async () => {
306
409
  // given
307
410
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
308
411
 
@@ -314,7 +417,7 @@ describe('SlackBotClient', () => {
314
417
  expect(mockConversations.list).toHaveBeenCalled()
315
418
  })
316
419
 
317
- test('returns channel ID unchanged when input is #C prefixed ID', async () => {
420
+ it('returns channel ID unchanged when input is #C prefixed ID', async () => {
318
421
  // given
319
422
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
320
423
 
@@ -325,7 +428,7 @@ describe('SlackBotClient', () => {
325
428
  expect(channel).toBe('C123ABC')
326
429
  })
327
430
 
328
- test('throws channel_not_found error when name is not found', async () => {
431
+ it('throws channel_not_found error when name is not found', async () => {
329
432
  // given
330
433
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
331
434
 
@@ -341,7 +444,7 @@ describe('SlackBotClient', () => {
341
444
  })
342
445
 
343
446
  describe('listUsers', () => {
344
- test('returns list of users', async () => {
447
+ it('returns list of users', async () => {
345
448
  // given
346
449
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
347
450
 
@@ -355,7 +458,7 @@ describe('SlackBotClient', () => {
355
458
  })
356
459
 
357
460
  describe('getUserInfo', () => {
358
- test('returns user details', async () => {
461
+ it('returns user details', async () => {
359
462
  // given
360
463
  const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
361
464
 
@@ -367,4 +470,175 @@ describe('SlackBotClient', () => {
367
470
  expect(user.name).toBe('testuser')
368
471
  })
369
472
  })
473
+
474
+ describe('uploadFile', () => {
475
+ it('uploads file via files.uploadV2 and returns mapped file', async () => {
476
+ // given
477
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
478
+
479
+ // when
480
+ const file = await client.uploadFile('C123', Buffer.from('test content'), 'test.txt')
481
+
482
+ // then
483
+ expect(file.id).toBe('F123')
484
+ expect(file.name).toBe('test.txt')
485
+ expect(file.size).toBe(12)
486
+ expect(mockFiles.uploadV2).toHaveBeenCalledWith(
487
+ expect.objectContaining({ channel_id: 'C123', filename: 'test.txt' }),
488
+ )
489
+ })
490
+
491
+ it('forwards thread_ts, title, initial_comment to the SDK', async () => {
492
+ // given
493
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
494
+
495
+ // when
496
+ await client.uploadFile('C123', Buffer.from('x'), 'test.txt', {
497
+ thread_ts: '1234567890.123456',
498
+ title: 'My Title',
499
+ initial_comment: 'Here you go',
500
+ })
501
+
502
+ // then
503
+ expect(mockFiles.uploadV2).toHaveBeenCalledWith(
504
+ expect.objectContaining({
505
+ channel_id: 'C123',
506
+ filename: 'test.txt',
507
+ thread_ts: '1234567890.123456',
508
+ title: 'My Title',
509
+ initial_comment: 'Here you go',
510
+ }),
511
+ )
512
+ })
513
+
514
+ it('throws SlackBotError when API responds not ok', async () => {
515
+ // given
516
+ mockFiles.uploadV2.mockResolvedValueOnce({ ok: false, error: 'file_upload_failed' } as any)
517
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
518
+
519
+ // when/then
520
+ await expect(client.uploadFile('C123', Buffer.from('x'), 'test.txt')).rejects.toThrow(SlackBotError)
521
+ })
522
+
523
+ it('throws SlackBotError when completion has no inner files', async () => {
524
+ // given
525
+ mockFiles.uploadV2.mockResolvedValueOnce({ ok: true, files: [{ ok: true, files: [] }] } as any)
526
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
527
+
528
+ // when/then
529
+ await expect(client.uploadFile('C123', Buffer.from('x'), 'test.txt')).rejects.toThrow(SlackBotError)
530
+ })
531
+ })
532
+
533
+ describe('listFiles', () => {
534
+ it('returns mapped files', async () => {
535
+ // given
536
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
537
+
538
+ // when
539
+ const files = await client.listFiles()
540
+
541
+ // then
542
+ expect(files).toHaveLength(1)
543
+ expect(files[0].id).toBe('F123')
544
+ expect(files[0].mimetype).toBe('text/plain')
545
+ })
546
+
547
+ it('forwards channel/user/limit to the SDK', async () => {
548
+ // given
549
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
550
+
551
+ // when
552
+ await client.listFiles({ channel: 'C123', user: 'U123', limit: 50 })
553
+
554
+ // then
555
+ expect(mockFiles.list).toHaveBeenCalledWith({ channel: 'C123', user: 'U123', count: 50 })
556
+ })
557
+ })
558
+
559
+ describe('getFileInfo', () => {
560
+ it('returns file metadata', async () => {
561
+ // given
562
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
563
+
564
+ // when
565
+ const file = await client.getFileInfo('F123')
566
+
567
+ // then
568
+ expect(file.id).toBe('F123')
569
+ expect(file.url_private).toBe('https://files.slack.com/files-pri/T123-F123/test.txt')
570
+ })
571
+
572
+ it('throws on API failure', async () => {
573
+ // given
574
+ mockFiles.info.mockResolvedValueOnce({ ok: false, error: 'file_not_found' } as any)
575
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
576
+
577
+ // when/then
578
+ await expect(client.getFileInfo('F999')).rejects.toThrow(SlackBotError)
579
+ })
580
+ })
581
+
582
+ describe('downloadFile', () => {
583
+ it('downloads file content using the bot token', async () => {
584
+ // given
585
+ const originalFetch = globalThis.fetch
586
+ let capturedAuthHeader: string | null = null
587
+ globalThis.fetch = async (_url: any, init: any = {}) => {
588
+ capturedAuthHeader = init?.headers?.Authorization ?? null
589
+ return new Response(Buffer.from('downloaded content'), { status: 200 })
590
+ }
591
+
592
+ try {
593
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
594
+
595
+ // when
596
+ const result = await client.downloadFile('F123')
597
+
598
+ // then
599
+ expect(capturedAuthHeader).toBe('Bearer xoxb-test-token')
600
+ expect(result.file.id).toBe('F123')
601
+ expect(result.buffer.toString()).toBe('downloaded content')
602
+ } finally {
603
+ globalThis.fetch = originalFetch
604
+ }
605
+ })
606
+
607
+ it('throws SlackBotError when download HTTP response is not ok', async () => {
608
+ // given
609
+ const originalFetch = globalThis.fetch
610
+ globalThis.fetch = async () => new Response('forbidden', { status: 403, statusText: 'Forbidden' })
611
+
612
+ try {
613
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
614
+
615
+ // when/then
616
+ await expect(client.downloadFile('F123')).rejects.toThrow(SlackBotError)
617
+ } finally {
618
+ globalThis.fetch = originalFetch
619
+ }
620
+ })
621
+ })
622
+
623
+ describe('deleteFile', () => {
624
+ it('calls files.delete with the given file ID', async () => {
625
+ // given
626
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
627
+
628
+ // when
629
+ await client.deleteFile('F123')
630
+
631
+ // then
632
+ expect(mockFiles.delete).toHaveBeenCalledWith({ file: 'F123' })
633
+ })
634
+
635
+ it('throws on API failure', async () => {
636
+ // given
637
+ mockFiles.delete.mockResolvedValueOnce({ ok: false, error: 'cant_delete_file' } as any)
638
+ const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
639
+
640
+ // when/then
641
+ await expect(client.deleteFile('F123')).rejects.toThrow(SlackBotError)
642
+ })
643
+ })
370
644
  })