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
  DiscordChannelSchema,
@@ -12,7 +12,7 @@ import {
12
12
  DiscordUserSchema,
13
13
  } from './types'
14
14
 
15
- test('DiscordGuildSchema validates correct guild', () => {
15
+ it('DiscordGuildSchema validates correct guild', () => {
16
16
  const result = DiscordGuildSchema.safeParse({
17
17
  id: '123456789012345678',
18
18
  name: 'Test Guild',
@@ -20,21 +20,21 @@ test('DiscordGuildSchema validates correct guild', () => {
20
20
  expect(result.success).toBe(true)
21
21
  })
22
22
 
23
- test('DiscordGuildSchema rejects missing id', () => {
23
+ it('DiscordGuildSchema rejects missing id', () => {
24
24
  const result = DiscordGuildSchema.safeParse({
25
25
  name: 'Test Guild',
26
26
  })
27
27
  expect(result.success).toBe(false)
28
28
  })
29
29
 
30
- test('DiscordGuildSchema rejects missing name', () => {
30
+ it('DiscordGuildSchema rejects missing name', () => {
31
31
  const result = DiscordGuildSchema.safeParse({
32
32
  id: '123456789012345678',
33
33
  })
34
34
  expect(result.success).toBe(false)
35
35
  })
36
36
 
37
- test('DiscordChannelSchema validates correct channel', () => {
37
+ it('DiscordChannelSchema validates correct channel', () => {
38
38
  const result = DiscordChannelSchema.safeParse({
39
39
  id: '987654321098765432',
40
40
  guild_id: '123456789012345678',
@@ -44,7 +44,7 @@ test('DiscordChannelSchema validates correct channel', () => {
44
44
  expect(result.success).toBe(true)
45
45
  })
46
46
 
47
- test('DiscordChannelSchema validates channel with optional fields', () => {
47
+ it('DiscordChannelSchema validates channel with optional fields', () => {
48
48
  const result = DiscordChannelSchema.safeParse({
49
49
  id: '987654321098765432',
50
50
  guild_id: '123456789012345678',
@@ -56,7 +56,7 @@ test('DiscordChannelSchema validates channel with optional fields', () => {
56
56
  expect(result.success).toBe(true)
57
57
  })
58
58
 
59
- test('DiscordChannelSchema rejects missing required fields', () => {
59
+ it('DiscordChannelSchema rejects missing required fields', () => {
60
60
  const result = DiscordChannelSchema.safeParse({
61
61
  id: '987654321098765432',
62
62
  name: 'general',
@@ -64,7 +64,7 @@ test('DiscordChannelSchema rejects missing required fields', () => {
64
64
  expect(result.success).toBe(false)
65
65
  })
66
66
 
67
- test('DiscordMessageSchema validates correct message', () => {
67
+ it('DiscordMessageSchema validates correct message', () => {
68
68
  const result = DiscordMessageSchema.safeParse({
69
69
  id: '111222333444555666',
70
70
  channel_id: '987654321098765432',
@@ -78,7 +78,7 @@ test('DiscordMessageSchema validates correct message', () => {
78
78
  expect(result.success).toBe(true)
79
79
  })
80
80
 
81
- test('DiscordMessageSchema validates message with optional fields', () => {
81
+ it('DiscordMessageSchema validates message with optional fields', () => {
82
82
  const result = DiscordMessageSchema.safeParse({
83
83
  id: '111222333444555666',
84
84
  channel_id: '987654321098765432',
@@ -94,7 +94,7 @@ test('DiscordMessageSchema validates message with optional fields', () => {
94
94
  expect(result.success).toBe(true)
95
95
  })
96
96
 
97
- test('DiscordMessageSchema rejects missing required fields', () => {
97
+ it('DiscordMessageSchema rejects missing required fields', () => {
98
98
  const result = DiscordMessageSchema.safeParse({
99
99
  id: '111222333444555666',
100
100
  channel_id: '987654321098765432',
@@ -103,7 +103,7 @@ test('DiscordMessageSchema rejects missing required fields', () => {
103
103
  expect(result.success).toBe(false)
104
104
  })
105
105
 
106
- test('DiscordUserSchema validates correct user', () => {
106
+ it('DiscordUserSchema validates correct user', () => {
107
107
  const result = DiscordUserSchema.safeParse({
108
108
  id: '222333444555666777',
109
109
  username: 'testuser',
@@ -111,7 +111,7 @@ test('DiscordUserSchema validates correct user', () => {
111
111
  expect(result.success).toBe(true)
112
112
  })
113
113
 
114
- test('DiscordUserSchema validates user with optional fields', () => {
114
+ it('DiscordUserSchema validates user with optional fields', () => {
115
115
  const result = DiscordUserSchema.safeParse({
116
116
  id: '222333444555666777',
117
117
  username: 'testuser',
@@ -122,14 +122,14 @@ test('DiscordUserSchema validates user with optional fields', () => {
122
122
  expect(result.success).toBe(true)
123
123
  })
124
124
 
125
- test('DiscordUserSchema rejects missing required fields', () => {
125
+ it('DiscordUserSchema rejects missing required fields', () => {
126
126
  const result = DiscordUserSchema.safeParse({
127
127
  id: '222333444555666777',
128
128
  })
129
129
  expect(result.success).toBe(false)
130
130
  })
131
131
 
132
- test('DiscordReactionSchema validates correct reaction', () => {
132
+ it('DiscordReactionSchema validates correct reaction', () => {
133
133
  const result = DiscordReactionSchema.safeParse({
134
134
  emoji: {
135
135
  name: 'thumbsup',
@@ -139,7 +139,7 @@ test('DiscordReactionSchema validates correct reaction', () => {
139
139
  expect(result.success).toBe(true)
140
140
  })
141
141
 
142
- test('DiscordReactionSchema validates reaction with custom emoji', () => {
142
+ it('DiscordReactionSchema validates reaction with custom emoji', () => {
143
143
  const result = DiscordReactionSchema.safeParse({
144
144
  emoji: {
145
145
  id: '123456789012345678',
@@ -150,7 +150,7 @@ test('DiscordReactionSchema validates reaction with custom emoji', () => {
150
150
  expect(result.success).toBe(true)
151
151
  })
152
152
 
153
- test('DiscordReactionSchema rejects missing required fields', () => {
153
+ it('DiscordReactionSchema rejects missing required fields', () => {
154
154
  const result = DiscordReactionSchema.safeParse({
155
155
  emoji: {
156
156
  name: 'thumbsup',
@@ -159,7 +159,7 @@ test('DiscordReactionSchema rejects missing required fields', () => {
159
159
  expect(result.success).toBe(false)
160
160
  })
161
161
 
162
- test('DiscordFileSchema validates correct file', () => {
162
+ it('DiscordFileSchema validates correct file', () => {
163
163
  const result = DiscordFileSchema.safeParse({
164
164
  id: '444555666777888999',
165
165
  filename: 'document.pdf',
@@ -169,7 +169,7 @@ test('DiscordFileSchema validates correct file', () => {
169
169
  expect(result.success).toBe(true)
170
170
  })
171
171
 
172
- test('DiscordFileSchema validates file with optional fields', () => {
172
+ it('DiscordFileSchema validates file with optional fields', () => {
173
173
  const result = DiscordFileSchema.safeParse({
174
174
  id: '444555666777888999',
175
175
  filename: 'document.pdf',
@@ -182,7 +182,7 @@ test('DiscordFileSchema validates file with optional fields', () => {
182
182
  expect(result.success).toBe(true)
183
183
  })
184
184
 
185
- test('DiscordFileSchema rejects missing required fields', () => {
185
+ it('DiscordFileSchema rejects missing required fields', () => {
186
186
  const result = DiscordFileSchema.safeParse({
187
187
  id: '444555666777888999',
188
188
  filename: 'document.pdf',
@@ -190,19 +190,19 @@ test('DiscordFileSchema rejects missing required fields', () => {
190
190
  expect(result.success).toBe(false)
191
191
  })
192
192
 
193
- test('DiscordCredentialsSchema validates correct credentials', () => {
193
+ it('DiscordCredentialsSchema validates correct credentials', () => {
194
194
  const result = DiscordCredentialsSchema.safeParse({
195
195
  token: 'token_value',
196
196
  })
197
197
  expect(result.success).toBe(true)
198
198
  })
199
199
 
200
- test('DiscordCredentialsSchema rejects missing token', () => {
200
+ it('DiscordCredentialsSchema rejects missing token', () => {
201
201
  const result = DiscordCredentialsSchema.safeParse({})
202
202
  expect(result.success).toBe(false)
203
203
  })
204
204
 
205
- test('DiscordConfigSchema validates correct config', () => {
205
+ it('DiscordConfigSchema validates correct config', () => {
206
206
  const result = DiscordConfigSchema.safeParse({
207
207
  current_server: null,
208
208
  token: 'token_value',
@@ -211,7 +211,7 @@ test('DiscordConfigSchema validates correct config', () => {
211
211
  expect(result.success).toBe(true)
212
212
  })
213
213
 
214
- test('DiscordConfigSchema validates config with servers', () => {
214
+ it('DiscordConfigSchema validates config with servers', () => {
215
215
  const result = DiscordConfigSchema.safeParse({
216
216
  current_server: '123456789012345678',
217
217
  token: 'token_value',
@@ -225,7 +225,7 @@ test('DiscordConfigSchema validates config with servers', () => {
225
225
  expect(result.success).toBe(true)
226
226
  })
227
227
 
228
- test('DiscordConfigSchema rejects missing required fields', () => {
228
+ it('DiscordConfigSchema rejects missing required fields', () => {
229
229
  const result = DiscordConfigSchema.safeParse({
230
230
  current_server: null,
231
231
  token: 'token_value',
@@ -233,14 +233,14 @@ test('DiscordConfigSchema rejects missing required fields', () => {
233
233
  expect(result.success).toBe(false)
234
234
  })
235
235
 
236
- test('DiscordError has correct name and code', () => {
236
+ it('DiscordError has correct name and code', () => {
237
237
  const error = new DiscordError('Test error', 'TEST_CODE')
238
238
  expect(error.name).toBe('DiscordError')
239
239
  expect(error.message).toBe('Test error')
240
240
  expect(error.code).toBe('TEST_CODE')
241
241
  })
242
242
 
243
- test('DiscordError is instance of Error', () => {
243
+ it('DiscordError is instance of Error', () => {
244
244
  const error = new DiscordError('Test error', 'TEST_CODE')
245
245
  expect(error instanceof Error).toBe(true)
246
246
  })
@@ -22,8 +22,18 @@ program
22
22
  .name('agent-discordbot')
23
23
  .description('CLI tool for Discord bot integration using bot tokens')
24
24
  .version(pkg.version)
25
+ .option('--pretty', 'Pretty-print JSON output')
25
26
  .option('--bot <id>', 'Bot ID to use')
26
27
  .option('--server <id>', 'Server ID to use')
28
+ .hook('preAction', (thisCmd, actionCmd) => {
29
+ for (const [key, value] of Object.entries(thisCmd.opts())) {
30
+ if (value === undefined) continue
31
+ const source = actionCmd.getOptionValueSource(key)
32
+ if (source === undefined || source === 'default') {
33
+ actionCmd.setOptionValue(key, value)
34
+ }
35
+ }
36
+ })
27
37
 
28
38
  program.addCommand(authCommand)
29
39
  program.addCommand(whoamiCommand)
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { DiscordBotClient } from './client'
4
4
  import { DiscordBotError } from './types'
@@ -48,19 +48,19 @@ describe('DiscordBotClient', () => {
48
48
  }
49
49
 
50
50
  describe('constructor', () => {
51
- test('requires token', async () => {
51
+ it('requires token', async () => {
52
52
  await expect(new DiscordBotClient().login({ token: '' })).rejects.toThrow(DiscordBotError)
53
53
  await expect(new DiscordBotClient().login({ token: '' })).rejects.toThrow('Token is required')
54
54
  })
55
55
 
56
- test('accepts valid token', async () => {
56
+ it('accepts valid token', async () => {
57
57
  const client = await new DiscordBotClient().login({ token: 'bot-test-token' })
58
58
  expect(client).toBeInstanceOf(DiscordBotClient)
59
59
  })
60
60
  })
61
61
 
62
62
  describe('testAuth', () => {
63
- test('returns current user and uses Bot auth header', async () => {
63
+ it('returns current user and uses Bot auth header', async () => {
64
64
  mockResponse({
65
65
  id: '123456789',
66
66
  username: 'testbot',
@@ -81,7 +81,7 @@ describe('DiscordBotClient', () => {
81
81
  expect(headers['User-Agent']).toContain('DiscordBot')
82
82
  })
83
83
 
84
- test('throws DiscordBotError on API error', async () => {
84
+ it('throws DiscordBotError on API error', async () => {
85
85
  mockResponse({ message: 'Unauthorized', code: 401 }, 401)
86
86
 
87
87
  const client = await new DiscordBotClient().login({ token: 'bad-token' })
@@ -90,7 +90,7 @@ describe('DiscordBotClient', () => {
90
90
  })
91
91
 
92
92
  describe('listGuilds', () => {
93
- test('returns list of guilds', async () => {
93
+ it('returns list of guilds', async () => {
94
94
  mockResponse([
95
95
  { id: '111', name: 'Guild One' },
96
96
  { id: '222', name: 'Guild Two' },
@@ -106,7 +106,7 @@ describe('DiscordBotClient', () => {
106
106
  })
107
107
 
108
108
  describe('getGuild', () => {
109
- test('returns guild info', async () => {
109
+ it('returns guild info', async () => {
110
110
  mockResponse({ id: '111', name: 'Test Guild' })
111
111
 
112
112
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -119,7 +119,7 @@ describe('DiscordBotClient', () => {
119
119
  })
120
120
 
121
121
  describe('listChannels', () => {
122
- test('returns channels for guild', async () => {
122
+ it('returns channels for guild', async () => {
123
123
  mockResponse([
124
124
  { id: 'ch1', guild_id: '111', name: 'general', type: 0 },
125
125
  { id: 'ch2', guild_id: '111', name: 'random', type: 0 },
@@ -135,7 +135,7 @@ describe('DiscordBotClient', () => {
135
135
  })
136
136
 
137
137
  describe('sendMessage', () => {
138
- test('sends message to channel', async () => {
138
+ it('sends message to channel', async () => {
139
139
  mockResponse({
140
140
  id: 'msg1',
141
141
  channel_id: 'ch1',
@@ -153,7 +153,7 @@ describe('DiscordBotClient', () => {
153
153
  expect(fetchCalls[0].options?.body).toBe(JSON.stringify({ content: 'Hello world' }))
154
154
  })
155
155
 
156
- test('includes thread_id when provided', async () => {
156
+ it('includes thread_id when provided', async () => {
157
157
  mockResponse({
158
158
  id: 'msg1',
159
159
  channel_id: 'ch1',
@@ -170,7 +170,7 @@ describe('DiscordBotClient', () => {
170
170
  })
171
171
 
172
172
  describe('editMessage', () => {
173
- test('edits message with PATCH', async () => {
173
+ it('edits message with PATCH', async () => {
174
174
  mockResponse({
175
175
  id: 'msg1',
176
176
  channel_id: 'ch1',
@@ -191,7 +191,7 @@ describe('DiscordBotClient', () => {
191
191
  })
192
192
 
193
193
  describe('deleteMessage', () => {
194
- test('deletes message and returns void', async () => {
194
+ it('deletes message and returns void', async () => {
195
195
  mockResponse(null, 204)
196
196
 
197
197
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -204,7 +204,7 @@ describe('DiscordBotClient', () => {
204
204
  })
205
205
 
206
206
  describe('addReaction', () => {
207
- test('adds reaction with encoded emoji', async () => {
207
+ it('adds reaction with encoded emoji', async () => {
208
208
  mockResponse(null, 204)
209
209
 
210
210
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -218,7 +218,7 @@ describe('DiscordBotClient', () => {
218
218
  })
219
219
 
220
220
  describe('removeReaction', () => {
221
- test('removes reaction with DELETE', async () => {
221
+ it('removes reaction with DELETE', async () => {
222
222
  mockResponse(null, 204)
223
223
 
224
224
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -232,7 +232,7 @@ describe('DiscordBotClient', () => {
232
232
  })
233
233
 
234
234
  describe('listUsers', () => {
235
- test('maps guild members to users', async () => {
235
+ it('maps guild members to users', async () => {
236
236
  mockResponse([{ user: { id: 'u1', username: 'user1' } }, { user: { id: 'u2', username: 'user2' } }])
237
237
 
238
238
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -245,7 +245,7 @@ describe('DiscordBotClient', () => {
245
245
  })
246
246
 
247
247
  describe('getUser', () => {
248
- test('returns user info', async () => {
248
+ it('returns user info', async () => {
249
249
  mockResponse({ id: 'u1', username: 'testuser' })
250
250
 
251
251
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -258,7 +258,7 @@ describe('DiscordBotClient', () => {
258
258
  })
259
259
 
260
260
  describe('uploadFile', () => {
261
- test('uploads file to channel', async () => {
261
+ it('uploads file to channel', async () => {
262
262
  const { tmpdir } = await import('node:os')
263
263
  const { join } = await import('node:path')
264
264
  const tempFile = join(tmpdir(), 'test-discordbot-upload.txt')
@@ -293,7 +293,7 @@ describe('DiscordBotClient', () => {
293
293
  })
294
294
 
295
295
  describe('listFiles', () => {
296
- test('returns files from recent messages', async () => {
296
+ it('returns files from recent messages', async () => {
297
297
  mockResponse([
298
298
  {
299
299
  id: 'msg1',
@@ -322,7 +322,7 @@ describe('DiscordBotClient', () => {
322
322
  })
323
323
 
324
324
  describe('createThread', () => {
325
- test('creates thread in channel', async () => {
325
+ it('creates thread in channel', async () => {
326
326
  mockResponse({
327
327
  id: 'thread1',
328
328
  guild_id: '111',
@@ -342,7 +342,7 @@ describe('DiscordBotClient', () => {
342
342
  })
343
343
 
344
344
  describe('archiveThread', () => {
345
- test('archives thread with PATCH', async () => {
345
+ it('archives thread with PATCH', async () => {
346
346
  mockResponse({
347
347
  id: 'thread1',
348
348
  guild_id: '111',
@@ -361,7 +361,7 @@ describe('DiscordBotClient', () => {
361
361
  })
362
362
 
363
363
  describe('resolveChannel', () => {
364
- test('returns channel ID directly if all digits', async () => {
364
+ it('returns channel ID directly if all digits', async () => {
365
365
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
366
366
  const id = await client.resolveChannel('111', '123456789')
367
367
 
@@ -369,7 +369,7 @@ describe('DiscordBotClient', () => {
369
369
  expect(fetchCalls.length).toBe(0)
370
370
  })
371
371
 
372
- test('looks up channel by name', async () => {
372
+ it('looks up channel by name', async () => {
373
373
  mockResponse([
374
374
  { id: 'ch1', guild_id: '111', name: 'general', type: 0 },
375
375
  { id: 'ch2', guild_id: '111', name: 'random', type: 0 },
@@ -381,7 +381,7 @@ describe('DiscordBotClient', () => {
381
381
  expect(id).toBe('ch2')
382
382
  })
383
383
 
384
- test('strips # prefix when looking up by name', async () => {
384
+ it('strips # prefix when looking up by name', async () => {
385
385
  mockResponse([{ id: 'ch1', guild_id: '111', name: 'general', type: 0 }])
386
386
 
387
387
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -390,7 +390,7 @@ describe('DiscordBotClient', () => {
390
390
  expect(id).toBe('ch1')
391
391
  })
392
392
 
393
- test('throws when channel name not found', async () => {
393
+ it('throws when channel name not found', async () => {
394
394
  mockResponse([{ id: 'ch1', guild_id: '111', name: 'general', type: 0 }])
395
395
 
396
396
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -406,7 +406,7 @@ describe('DiscordBotClient', () => {
406
406
  })
407
407
 
408
408
  describe('rate limiting', () => {
409
- test('waits when bucket is exhausted', async () => {
409
+ it('waits when bucket is exhausted', async () => {
410
410
  mockResponse({ id: '1', username: 'bot' }, 200, {
411
411
  'X-RateLimit-Remaining': '0',
412
412
  'X-RateLimit-Reset': String(Date.now() / 1000 + 0.1),
@@ -429,7 +429,7 @@ describe('DiscordBotClient', () => {
429
429
  expect(fetchCalls.length).toBe(2)
430
430
  })
431
431
 
432
- test('retries on 429 with Retry-After header', async () => {
432
+ it('retries on 429 with Retry-After header', async () => {
433
433
  mockResponse({ message: 'Rate limited', retry_after: 0.1 }, 429, { 'Retry-After': '0.1' })
434
434
  mockResponse({ id: '123', username: 'bot' })
435
435
 
@@ -440,7 +440,7 @@ describe('DiscordBotClient', () => {
440
440
  expect(fetchCalls.length).toBe(2)
441
441
  })
442
442
 
443
- test('handles global rate limit', async () => {
443
+ it('handles global rate limit', async () => {
444
444
  mockResponse({ message: 'Global rate limited', global: true }, 429, {
445
445
  'Retry-After': '0.1',
446
446
  'X-RateLimit-Global': 'true',
@@ -454,7 +454,7 @@ describe('DiscordBotClient', () => {
454
454
  expect(fetchCalls.length).toBe(2)
455
455
  })
456
456
 
457
- test('throws after max retries exceeded', async () => {
457
+ it('throws after max retries exceeded', async () => {
458
458
  for (let i = 0; i <= 3; i++) {
459
459
  mockResponse({ message: 'Rate limited' }, 429, { 'Retry-After': '0.01' })
460
460
  }
@@ -466,7 +466,7 @@ describe('DiscordBotClient', () => {
466
466
  })
467
467
 
468
468
  describe('retry logic', () => {
469
- test('retries on 500 server error', async () => {
469
+ it('retries on 500 server error', async () => {
470
470
  mockResponse({ message: 'Internal Server Error' }, 500)
471
471
  mockResponse({ id: '123', username: 'bot' })
472
472
 
@@ -477,7 +477,7 @@ describe('DiscordBotClient', () => {
477
477
  expect(fetchCalls.length).toBe(2)
478
478
  })
479
479
 
480
- test('does not retry on 4xx client errors (except 429)', async () => {
480
+ it('does not retry on 4xx client errors (except 429)', async () => {
481
481
  mockResponse({ message: 'Not Found' }, 404)
482
482
 
483
483
  const client = await new DiscordBotClient().login({ token: 'bot-token' })
@@ -485,7 +485,7 @@ describe('DiscordBotClient', () => {
485
485
  expect(fetchCalls.length).toBe(1)
486
486
  })
487
487
 
488
- test('exponential backoff increases delay', async () => {
488
+ it('exponential backoff increases delay', async () => {
489
489
  mockResponse({ message: 'Error' }, 500)
490
490
  mockResponse({ message: 'Error' }, 500)
491
491
  mockResponse({ id: '123', username: 'bot' })
@@ -347,6 +347,10 @@ export class DiscordBotClient {
347
347
  return this.request<DiscordChannel>('PATCH', `/channels/${threadId}`, { archived })
348
348
  }
349
349
 
350
+ async gatewayConnect(): Promise<{ token: string }> {
351
+ return { token: this.ensureAuth() }
352
+ }
353
+
350
354
  async resolveChannel(guildId: string, channel: string): Promise<string> {
351
355
  if (/^\d+$/.test(channel)) return channel
352
356
 
@@ -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'
@@ -55,7 +55,7 @@ describe('auth commands', () => {
55
55
  })
56
56
 
57
57
  describe('setAction', () => {
58
- test('validates and stores bot token with default bot_id from auth', async () => {
58
+ it('validates and stores bot token with default bot_id from auth', async () => {
59
59
  const manager = new DiscordBotCredentialManager(tempDir)
60
60
 
61
61
  const result = await setAction('token123', { _credManager: manager })
@@ -71,7 +71,7 @@ describe('auth commands', () => {
71
71
  expect(creds?.bot_id).toBe('bot123')
72
72
  })
73
73
 
74
- test('uses --bot flag as bot_id', async () => {
74
+ it('uses --bot flag as bot_id', async () => {
75
75
  const manager = new DiscordBotCredentialManager(tempDir)
76
76
 
77
77
  const result = await setAction('token123', { bot: 'mybot', _credManager: manager })
@@ -81,7 +81,7 @@ describe('auth commands', () => {
81
81
  expect(creds?.token).toBe('token123')
82
82
  })
83
83
 
84
- test('rejects user tokens (bot: false)', async () => {
84
+ it('rejects user tokens (bot: false)', async () => {
85
85
  mockTestAuth.mockImplementationOnce(() =>
86
86
  Promise.resolve({
87
87
  id: 'user123',
@@ -98,7 +98,7 @@ describe('auth commands', () => {
98
98
  expect(result.error).toContain('not a bot token')
99
99
  })
100
100
 
101
- test('rejects user tokens (bot: undefined)', async () => {
101
+ it('rejects user tokens (bot: undefined)', async () => {
102
102
  mockTestAuth.mockImplementationOnce(() =>
103
103
  Promise.resolve({
104
104
  id: 'user123',
@@ -114,7 +114,7 @@ describe('auth commands', () => {
114
114
  expect(result.error).toContain('not a bot token')
115
115
  })
116
116
 
117
- test('handles client errors', async () => {
117
+ it('handles client errors', async () => {
118
118
  mockTestAuth.mockImplementationOnce(() => Promise.reject(new Error('Invalid token')))
119
119
 
120
120
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -127,7 +127,7 @@ describe('auth commands', () => {
127
127
  })
128
128
 
129
129
  describe('clearAction', () => {
130
- test('removes all stored credentials', async () => {
130
+ it('removes all stored credentials', async () => {
131
131
  const manager = new DiscordBotCredentialManager(tempDir)
132
132
  await manager.setCredentials({
133
133
  token: 'token123',
@@ -143,7 +143,7 @@ describe('auth commands', () => {
143
143
  })
144
144
 
145
145
  describe('statusAction', () => {
146
- test('returns no credentials when none set', async () => {
146
+ it('returns no credentials when none set', async () => {
147
147
  const manager = new DiscordBotCredentialManager(tempDir)
148
148
 
149
149
  const result = await statusAction({ _credManager: manager })
@@ -152,7 +152,7 @@ describe('auth commands', () => {
152
152
  expect(result.error).toBeDefined()
153
153
  })
154
154
 
155
- test('returns valid status for current bot', async () => {
155
+ it('returns valid status for current bot', async () => {
156
156
  const manager = new DiscordBotCredentialManager(tempDir)
157
157
  await manager.setCredentials({
158
158
  token: 'token123',
@@ -169,7 +169,7 @@ describe('auth commands', () => {
169
169
  expect(result.bot_name).toBe('testbot')
170
170
  })
171
171
 
172
- test('returns status for specific --bot', async () => {
172
+ it('returns status for specific --bot', async () => {
173
173
  const manager = new DiscordBotCredentialManager(tempDir)
174
174
  await manager.setCredentials({
175
175
  token: 'token1',
@@ -188,7 +188,7 @@ describe('auth commands', () => {
188
188
  expect(result.bot_id).toBe('bot123')
189
189
  })
190
190
 
191
- test('returns invalid when token test fails', async () => {
191
+ it('returns invalid when token test fails', async () => {
192
192
  mockTestAuth.mockImplementationOnce(() => Promise.reject(new Error('Unauthorized')))
193
193
 
194
194
  const manager = new DiscordBotCredentialManager(tempDir)
@@ -203,7 +203,7 @@ describe('auth commands', () => {
203
203
  expect(result.valid).toBe(false)
204
204
  })
205
205
 
206
- test('returns invalid when bot field is false', async () => {
206
+ it('returns invalid when bot field is false', async () => {
207
207
  mockTestAuth.mockImplementationOnce(() =>
208
208
  Promise.resolve({
209
209
  id: 'user123',
@@ -226,7 +226,7 @@ describe('auth commands', () => {
226
226
  })
227
227
 
228
228
  describe('listAction', () => {
229
- test('returns all stored bots', async () => {
229
+ it('returns all stored bots', async () => {
230
230
  const manager = new DiscordBotCredentialManager(tempDir)
231
231
  await manager.setCredentials({
232
232
  token: 'token1',
@@ -245,7 +245,7 @@ describe('auth commands', () => {
245
245
  expect(result.bots?.find((b) => b.bot_id === 'bot2')?.is_current).toBe(true)
246
246
  })
247
247
 
248
- test('returns empty list when no bots stored', async () => {
248
+ it('returns empty list when no bots stored', async () => {
249
249
  const manager = new DiscordBotCredentialManager(tempDir)
250
250
 
251
251
  const result = await listAction({ _credManager: manager })
@@ -255,7 +255,7 @@ describe('auth commands', () => {
255
255
  })
256
256
 
257
257
  describe('useAction', () => {
258
- test('switches current bot', async () => {
258
+ it('switches current bot', async () => {
259
259
  const manager = new DiscordBotCredentialManager(tempDir)
260
260
  await manager.setCredentials({
261
261
  token: 'token1',
@@ -274,7 +274,7 @@ describe('auth commands', () => {
274
274
  expect(result.bot_id).toBe('bot1')
275
275
  })
276
276
 
277
- test('returns error for unknown bot', async () => {
277
+ it('returns error for unknown bot', async () => {
278
278
  const manager = new DiscordBotCredentialManager(tempDir)
279
279
 
280
280
  const result = await useAction('nonexistent', { _credManager: manager })
@@ -284,7 +284,7 @@ describe('auth commands', () => {
284
284
  })
285
285
 
286
286
  describe('removeAction', () => {
287
- test('removes a stored bot', async () => {
287
+ it('removes a stored bot', async () => {
288
288
  const manager = new DiscordBotCredentialManager(tempDir)
289
289
  await manager.setCredentials({
290
290
  token: 'token1',
@@ -298,7 +298,7 @@ describe('auth commands', () => {
298
298
  expect(await manager.getCredentials('bot1')).toBeNull()
299
299
  })
300
300
 
301
- test('returns error for unknown bot', async () => {
301
+ it('returns error for unknown bot', async () => {
302
302
  const manager = new DiscordBotCredentialManager(tempDir)
303
303
 
304
304
  const result = await removeAction('nonexistent', { _credManager: manager })