agent-messenger 2.10.1 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.env.template +4 -1
  3. package/README.md +77 -27
  4. package/bun.lock +26 -0
  5. package/dist/package.json +14 -1
  6. package/dist/src/platforms/channeltalk/commands/auth.d.ts +2 -1
  7. package/dist/src/platforms/channeltalk/commands/auth.d.ts.map +1 -1
  8. package/dist/src/platforms/channeltalk/commands/auth.js +5 -3
  9. package/dist/src/platforms/channeltalk/commands/auth.js.map +1 -1
  10. package/dist/src/platforms/channeltalk/token-extractor.d.ts +2 -1
  11. package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
  12. package/dist/src/platforms/channeltalk/token-extractor.js +22 -6
  13. package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
  14. package/dist/src/platforms/channeltalkbot/cli.d.ts.map +1 -1
  15. package/dist/src/platforms/channeltalkbot/cli.js +11 -1
  16. package/dist/src/platforms/channeltalkbot/cli.js.map +1 -1
  17. package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
  18. package/dist/src/platforms/channeltalkbot/commands/auth.js +1 -5
  19. package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
  20. package/dist/src/platforms/channeltalkbot/commands/bot.d.ts.map +1 -1
  21. package/dist/src/platforms/channeltalkbot/commands/bot.js +1 -6
  22. package/dist/src/platforms/channeltalkbot/commands/bot.js.map +1 -1
  23. package/dist/src/platforms/channeltalkbot/commands/chat.d.ts.map +1 -1
  24. package/dist/src/platforms/channeltalkbot/commands/chat.js +1 -6
  25. package/dist/src/platforms/channeltalkbot/commands/chat.js.map +1 -1
  26. package/dist/src/platforms/channeltalkbot/commands/group.d.ts.map +1 -1
  27. package/dist/src/platforms/channeltalkbot/commands/group.js +1 -6
  28. package/dist/src/platforms/channeltalkbot/commands/group.js.map +1 -1
  29. package/dist/src/platforms/channeltalkbot/commands/manager.d.ts.map +1 -1
  30. package/dist/src/platforms/channeltalkbot/commands/manager.js +1 -6
  31. package/dist/src/platforms/channeltalkbot/commands/manager.js.map +1 -1
  32. package/dist/src/platforms/channeltalkbot/commands/message.d.ts.map +1 -1
  33. package/dist/src/platforms/channeltalkbot/commands/message.js +1 -6
  34. package/dist/src/platforms/channeltalkbot/commands/message.js.map +1 -1
  35. package/dist/src/platforms/channeltalkbot/commands/whoami.d.ts.map +1 -1
  36. package/dist/src/platforms/channeltalkbot/commands/whoami.js +1 -6
  37. package/dist/src/platforms/channeltalkbot/commands/whoami.js.map +1 -1
  38. package/dist/src/platforms/channeltalkbot/credential-manager.d.ts +5 -0
  39. package/dist/src/platforms/channeltalkbot/credential-manager.d.ts.map +1 -1
  40. package/dist/src/platforms/channeltalkbot/credential-manager.js +34 -4
  41. package/dist/src/platforms/channeltalkbot/credential-manager.js.map +1 -1
  42. package/dist/src/platforms/discord/commands/auth.d.ts +1 -0
  43. package/dist/src/platforms/discord/commands/auth.d.ts.map +1 -1
  44. package/dist/src/platforms/discord/commands/auth.js +3 -1
  45. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  46. package/dist/src/platforms/discord/listener.d.ts +2 -0
  47. package/dist/src/platforms/discord/listener.d.ts.map +1 -1
  48. package/dist/src/platforms/discord/listener.js +51 -21
  49. package/dist/src/platforms/discord/listener.js.map +1 -1
  50. package/dist/src/platforms/discord/token-extractor.d.ts +2 -1
  51. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  52. package/dist/src/platforms/discord/token-extractor.js +21 -6
  53. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  54. package/dist/src/platforms/discordbot/cli.d.ts.map +1 -1
  55. package/dist/src/platforms/discordbot/cli.js +12 -1
  56. package/dist/src/platforms/discordbot/cli.js.map +1 -1
  57. package/dist/src/platforms/discordbot/client.d.ts +3 -0
  58. package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
  59. package/dist/src/platforms/discordbot/client.js +3 -0
  60. package/dist/src/platforms/discordbot/client.js.map +1 -1
  61. package/dist/src/platforms/discordbot/commands/auth.d.ts.map +1 -1
  62. package/dist/src/platforms/discordbot/commands/auth.js +1 -5
  63. package/dist/src/platforms/discordbot/commands/auth.js.map +1 -1
  64. package/dist/src/platforms/discordbot/commands/message.d.ts.map +1 -1
  65. package/dist/src/platforms/discordbot/commands/message.js +1 -6
  66. package/dist/src/platforms/discordbot/commands/message.js.map +1 -1
  67. package/dist/src/platforms/discordbot/commands/server.d.ts.map +1 -1
  68. package/dist/src/platforms/discordbot/commands/server.js +1 -4
  69. package/dist/src/platforms/discordbot/commands/server.js.map +1 -1
  70. package/dist/src/platforms/discordbot/commands/whoami.d.ts.map +1 -1
  71. package/dist/src/platforms/discordbot/commands/whoami.js +1 -6
  72. package/dist/src/platforms/discordbot/commands/whoami.js.map +1 -1
  73. package/dist/src/platforms/discordbot/index.d.ts +3 -1
  74. package/dist/src/platforms/discordbot/index.d.ts.map +1 -1
  75. package/dist/src/platforms/discordbot/index.js +2 -1
  76. package/dist/src/platforms/discordbot/index.js.map +1 -1
  77. package/dist/src/platforms/discordbot/listener.d.ts +43 -0
  78. package/dist/src/platforms/discordbot/listener.d.ts.map +1 -0
  79. package/dist/src/platforms/discordbot/listener.js +292 -0
  80. package/dist/src/platforms/discordbot/listener.js.map +1 -0
  81. package/dist/src/platforms/discordbot/types.d.ts +161 -0
  82. package/dist/src/platforms/discordbot/types.d.ts.map +1 -1
  83. package/dist/src/platforms/discordbot/types.js +34 -0
  84. package/dist/src/platforms/discordbot/types.js.map +1 -1
  85. package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
  86. package/dist/src/platforms/instagram/commands/auth.js +3 -1
  87. package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
  88. package/dist/src/platforms/instagram/token-extractor.d.ts +2 -1
  89. package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
  90. package/dist/src/platforms/instagram/token-extractor.js +11 -2
  91. package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
  92. package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -1
  93. package/dist/src/platforms/slack/commands/auth.js +4 -2
  94. package/dist/src/platforms/slack/commands/auth.js.map +1 -1
  95. package/dist/src/platforms/slack/token-extractor.d.ts +4 -1
  96. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  97. package/dist/src/platforms/slack/token-extractor.js +64 -15
  98. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  99. package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
  100. package/dist/src/platforms/slackbot/cli.js +15 -3
  101. package/dist/src/platforms/slackbot/cli.js.map +1 -1
  102. package/dist/src/platforms/slackbot/client.d.ts +22 -1
  103. package/dist/src/platforms/slackbot/client.d.ts.map +1 -1
  104. package/dist/src/platforms/slackbot/client.js +104 -1
  105. package/dist/src/platforms/slackbot/client.js.map +1 -1
  106. package/dist/src/platforms/slackbot/commands/auth.d.ts.map +1 -1
  107. package/dist/src/platforms/slackbot/commands/auth.js +1 -5
  108. package/dist/src/platforms/slackbot/commands/auth.js.map +1 -1
  109. package/dist/src/platforms/slackbot/commands/file.d.ts +3 -0
  110. package/dist/src/platforms/slackbot/commands/file.d.ts.map +1 -0
  111. package/dist/src/platforms/slackbot/commands/file.js +164 -0
  112. package/dist/src/platforms/slackbot/commands/file.js.map +1 -0
  113. package/dist/src/platforms/slackbot/commands/index.d.ts +1 -0
  114. package/dist/src/platforms/slackbot/commands/index.d.ts.map +1 -1
  115. package/dist/src/platforms/slackbot/commands/index.js +1 -0
  116. package/dist/src/platforms/slackbot/commands/index.js.map +1 -1
  117. package/dist/src/platforms/slackbot/commands/message.d.ts.map +1 -1
  118. package/dist/src/platforms/slackbot/commands/message.js +19 -0
  119. package/dist/src/platforms/slackbot/commands/message.js.map +1 -1
  120. package/dist/src/platforms/slackbot/commands/whoami.d.ts.map +1 -1
  121. package/dist/src/platforms/slackbot/commands/whoami.js +1 -6
  122. package/dist/src/platforms/slackbot/commands/whoami.js.map +1 -1
  123. package/dist/src/platforms/slackbot/credential-manager.d.ts +1 -0
  124. package/dist/src/platforms/slackbot/credential-manager.d.ts.map +1 -1
  125. package/dist/src/platforms/slackbot/credential-manager.js +30 -2
  126. package/dist/src/platforms/slackbot/credential-manager.js.map +1 -1
  127. package/dist/src/platforms/slackbot/index.d.ts +4 -1
  128. package/dist/src/platforms/slackbot/index.d.ts.map +1 -1
  129. package/dist/src/platforms/slackbot/index.js +1 -0
  130. package/dist/src/platforms/slackbot/index.js.map +1 -1
  131. package/dist/src/platforms/slackbot/listener.d.ts +44 -0
  132. package/dist/src/platforms/slackbot/listener.d.ts.map +1 -0
  133. package/dist/src/platforms/slackbot/listener.js +313 -0
  134. package/dist/src/platforms/slackbot/listener.js.map +1 -0
  135. package/dist/src/platforms/slackbot/types.d.ts +196 -1
  136. package/dist/src/platforms/slackbot/types.d.ts.map +1 -1
  137. package/dist/src/platforms/slackbot/types.js +4 -1
  138. package/dist/src/platforms/slackbot/types.js.map +1 -1
  139. package/dist/src/platforms/teams/commands/auth.d.ts +1 -0
  140. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  141. package/dist/src/platforms/teams/commands/auth.js +37 -6
  142. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  143. package/dist/src/platforms/teams/ensure-auth.js +31 -9
  144. package/dist/src/platforms/teams/ensure-auth.js.map +1 -1
  145. package/dist/src/platforms/teams/token-extractor.d.ts +4 -1
  146. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  147. package/dist/src/platforms/teams/token-extractor.js +80 -31
  148. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  149. package/dist/src/platforms/webex/commands/auth.d.ts +1 -0
  150. package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
  151. package/dist/src/platforms/webex/commands/auth.js +3 -1
  152. package/dist/src/platforms/webex/commands/auth.js.map +1 -1
  153. package/dist/src/platforms/webex/token-extractor.d.ts +3 -1
  154. package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
  155. package/dist/src/platforms/webex/token-extractor.js +16 -2
  156. package/dist/src/platforms/webex/token-extractor.js.map +1 -1
  157. package/dist/src/platforms/wechatbot/cli.d.ts.map +1 -1
  158. package/dist/src/platforms/wechatbot/cli.js +11 -1
  159. package/dist/src/platforms/wechatbot/cli.js.map +1 -1
  160. package/dist/src/platforms/wechatbot/commands/auth.d.ts.map +1 -1
  161. package/dist/src/platforms/wechatbot/commands/auth.js +1 -5
  162. package/dist/src/platforms/wechatbot/commands/auth.js.map +1 -1
  163. package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
  164. package/dist/src/platforms/wechatbot/commands/message.js +1 -6
  165. package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
  166. package/dist/src/platforms/wechatbot/commands/template.d.ts.map +1 -1
  167. package/dist/src/platforms/wechatbot/commands/template.js +1 -6
  168. package/dist/src/platforms/wechatbot/commands/template.js.map +1 -1
  169. package/dist/src/platforms/wechatbot/commands/user.d.ts.map +1 -1
  170. package/dist/src/platforms/wechatbot/commands/user.js +1 -6
  171. package/dist/src/platforms/wechatbot/commands/user.js.map +1 -1
  172. package/dist/src/platforms/wechatbot/commands/whoami.d.ts.map +1 -1
  173. package/dist/src/platforms/wechatbot/commands/whoami.js +1 -6
  174. package/dist/src/platforms/wechatbot/commands/whoami.js.map +1 -1
  175. package/dist/src/platforms/whatsappbot/cli.d.ts.map +1 -1
  176. package/dist/src/platforms/whatsappbot/cli.js +11 -1
  177. package/dist/src/platforms/whatsappbot/cli.js.map +1 -1
  178. package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
  179. package/dist/src/platforms/whatsappbot/commands/auth.js +1 -5
  180. package/dist/src/platforms/whatsappbot/commands/auth.js.map +1 -1
  181. package/dist/src/platforms/whatsappbot/commands/message.d.ts.map +1 -1
  182. package/dist/src/platforms/whatsappbot/commands/message.js +1 -6
  183. package/dist/src/platforms/whatsappbot/commands/message.js.map +1 -1
  184. package/dist/src/platforms/whatsappbot/commands/template.d.ts.map +1 -1
  185. package/dist/src/platforms/whatsappbot/commands/template.js +1 -6
  186. package/dist/src/platforms/whatsappbot/commands/template.js.map +1 -1
  187. package/dist/src/platforms/whatsappbot/commands/whoami.d.ts.map +1 -1
  188. package/dist/src/platforms/whatsappbot/commands/whoami.js +1 -6
  189. package/dist/src/platforms/whatsappbot/commands/whoami.js.map +1 -1
  190. package/dist/src/shared/chromium/browsers.d.ts +8 -0
  191. package/dist/src/shared/chromium/browsers.d.ts.map +1 -1
  192. package/dist/src/shared/chromium/browsers.js +58 -3
  193. package/dist/src/shared/chromium/browsers.js.map +1 -1
  194. package/dist/src/shared/chromium/cli-options.d.ts +5 -0
  195. package/dist/src/shared/chromium/cli-options.d.ts.map +1 -0
  196. package/dist/src/shared/chromium/cli-options.js +8 -0
  197. package/dist/src/shared/chromium/cli-options.js.map +1 -0
  198. package/dist/src/shared/chromium/decryptor.d.ts +6 -0
  199. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
  200. package/dist/src/shared/chromium/decryptor.js +26 -6
  201. package/dist/src/shared/chromium/decryptor.js.map +1 -1
  202. package/dist/src/shared/chromium/index.d.ts +3 -1
  203. package/dist/src/shared/chromium/index.d.ts.map +1 -1
  204. package/dist/src/shared/chromium/index.js +2 -1
  205. package/dist/src/shared/chromium/index.js.map +1 -1
  206. package/dist/src/shared/utils/cli-output.d.ts +7 -0
  207. package/dist/src/shared/utils/cli-output.d.ts.map +1 -0
  208. package/dist/src/shared/utils/cli-output.js +7 -0
  209. package/dist/src/shared/utils/cli-output.js.map +1 -0
  210. package/dist/src/tui/app.d.ts.map +1 -1
  211. package/dist/src/tui/app.js +73 -20
  212. package/dist/src/tui/app.js.map +1 -1
  213. package/docs/content/docs/cli/channeltalk.mdx +4 -0
  214. package/docs/content/docs/cli/discord.mdx +5 -0
  215. package/docs/content/docs/cli/instagram.mdx +3 -0
  216. package/docs/content/docs/cli/slack.mdx +5 -0
  217. package/docs/content/docs/cli/slackbot.mdx +60 -22
  218. package/docs/content/docs/cli/teams.mdx +5 -0
  219. package/docs/content/docs/cli/webex.mdx +3 -0
  220. package/docs/content/docs/sdk/channeltalkbot.mdx +38 -1
  221. package/docs/content/docs/sdk/discordbot.mdx +501 -0
  222. package/docs/content/docs/sdk/meta.json +2 -0
  223. package/docs/content/docs/sdk/slackbot.mdx +576 -0
  224. package/e2e/README.md +1 -1
  225. package/e2e/channeltalk.e2e.test.ts +13 -13
  226. package/e2e/channeltalkbot.e2e.test.ts +13 -13
  227. package/e2e/config.ts +9 -4
  228. package/e2e/discord.e2e.test.ts +24 -24
  229. package/e2e/discordbot.e2e.test.ts +16 -16
  230. package/e2e/instagram.e2e.test.ts +10 -10
  231. package/e2e/kakaotalk.e2e.test.ts +7 -7
  232. package/e2e/line.e2e.test.ts +8 -8
  233. package/e2e/slack.e2e.test.ts +34 -34
  234. package/e2e/slackbot.e2e.test.ts +14 -14
  235. package/e2e/teams.e2e.test.ts +23 -23
  236. package/e2e/telegram.e2e.test.ts +8 -8
  237. package/e2e/webex.e2e.test.ts +14 -14
  238. package/e2e/whatsapp.e2e.test.ts +8 -8
  239. package/e2e/whatsappbot.e2e.test.ts +6 -6
  240. package/examples/discordbot-listen.ts +65 -0
  241. package/examples/slackbot-listen.ts +65 -0
  242. package/package.json +14 -1
  243. package/skills/agent-channeltalk/SKILL.md +5 -1
  244. package/skills/agent-channeltalk/references/authentication.md +5 -1
  245. package/skills/agent-channeltalkbot/SKILL.md +17 -3
  246. package/skills/agent-channeltalkbot/references/authentication.md +7 -5
  247. package/skills/agent-discord/SKILL.md +5 -1
  248. package/skills/agent-discord/references/authentication.md +7 -1
  249. package/skills/agent-discordbot/SKILL.md +13 -2
  250. package/skills/agent-discordbot/references/common-patterns.md +1 -1
  251. package/skills/agent-instagram/SKILL.md +7 -1
  252. package/skills/agent-instagram/references/authentication.md +6 -0
  253. package/skills/agent-kakaotalk/SKILL.md +1 -1
  254. package/skills/agent-line/SKILL.md +1 -1
  255. package/skills/agent-slack/SKILL.md +5 -1
  256. package/skills/agent-slack/references/authentication.md +7 -1
  257. package/skills/agent-slackbot/SKILL.md +56 -4
  258. package/skills/agent-slackbot/references/authentication.md +4 -0
  259. package/skills/agent-teams/SKILL.md +5 -1
  260. package/skills/agent-teams/references/authentication.md +7 -1
  261. package/skills/agent-telegram/SKILL.md +1 -1
  262. package/skills/agent-webex/SKILL.md +7 -1
  263. package/skills/agent-webex/references/authentication.md +6 -0
  264. package/skills/agent-wechatbot/SKILL.md +16 -1
  265. package/skills/agent-wechatbot/references/authentication.md +219 -0
  266. package/skills/agent-wechatbot/references/common-patterns.md +358 -0
  267. package/skills/agent-wechatbot/templates/account-summary.sh +122 -0
  268. package/skills/agent-wechatbot/templates/post-message.sh +122 -0
  269. package/skills/agent-wechatbot/templates/send-template.sh +152 -0
  270. package/skills/agent-whatsapp/SKILL.md +1 -1
  271. package/skills/agent-whatsappbot/SKILL.md +30 -1
  272. package/src/platforms/channeltalk/client.test.ts +26 -26
  273. package/src/platforms/channeltalk/commands/auth.test.ts +31 -19
  274. package/src/platforms/channeltalk/commands/auth.ts +15 -5
  275. package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
  276. package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
  277. package/src/platforms/channeltalk/commands/group.test.ts +4 -4
  278. package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
  279. package/src/platforms/channeltalk/commands/message.test.ts +17 -17
  280. package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
  281. package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
  282. package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
  283. package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
  284. package/src/platforms/channeltalk/index.test.ts +23 -23
  285. package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
  286. package/src/platforms/channeltalk/token-extractor.ts +24 -5
  287. package/src/platforms/channeltalk/types.test.ts +12 -12
  288. package/src/platforms/channeltalkbot/cli.ts +9 -0
  289. package/src/platforms/channeltalkbot/client.test.ts +14 -14
  290. package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
  291. package/src/platforms/channeltalkbot/commands/auth.ts +1 -5
  292. package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
  293. package/src/platforms/channeltalkbot/commands/bot.ts +1 -6
  294. package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
  295. package/src/platforms/channeltalkbot/commands/chat.ts +1 -6
  296. package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
  297. package/src/platforms/channeltalkbot/commands/group.ts +1 -6
  298. package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
  299. package/src/platforms/channeltalkbot/commands/manager.ts +1 -6
  300. package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
  301. package/src/platforms/channeltalkbot/commands/message.ts +1 -6
  302. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
  303. package/src/platforms/channeltalkbot/commands/whoami.test.ts +6 -4
  304. package/src/platforms/channeltalkbot/commands/whoami.ts +1 -6
  305. package/src/platforms/channeltalkbot/credential-manager.test.ts +123 -29
  306. package/src/platforms/channeltalkbot/credential-manager.ts +37 -4
  307. package/src/platforms/channeltalkbot/index.test.ts +15 -15
  308. package/src/platforms/discord/client.test.ts +28 -28
  309. package/src/platforms/discord/commands/auth.test.ts +7 -7
  310. package/src/platforms/discord/commands/auth.ts +13 -2
  311. package/src/platforms/discord/commands/channel.test.ts +7 -7
  312. package/src/platforms/discord/commands/dm.test.ts +4 -4
  313. package/src/platforms/discord/commands/file.test.ts +4 -4
  314. package/src/platforms/discord/commands/friend.test.ts +6 -6
  315. package/src/platforms/discord/commands/member.test.ts +5 -5
  316. package/src/platforms/discord/commands/mention.test.ts +5 -5
  317. package/src/platforms/discord/commands/message.test.ts +9 -9
  318. package/src/platforms/discord/commands/note.test.ts +6 -6
  319. package/src/platforms/discord/commands/profile.test.ts +4 -4
  320. package/src/platforms/discord/commands/reaction.test.ts +5 -5
  321. package/src/platforms/discord/commands/server.test.ts +7 -7
  322. package/src/platforms/discord/commands/snapshot.test.ts +6 -6
  323. package/src/platforms/discord/commands/thread.test.ts +6 -6
  324. package/src/platforms/discord/commands/user.test.ts +5 -5
  325. package/src/platforms/discord/commands/whoami.test.ts +6 -6
  326. package/src/platforms/discord/credential-manager.test.ts +16 -16
  327. package/src/platforms/discord/ensure-auth.test.ts +8 -8
  328. package/src/platforms/discord/index.test.ts +17 -17
  329. package/src/platforms/discord/listener.test.ts +92 -34
  330. package/src/platforms/discord/listener.ts +43 -19
  331. package/src/platforms/discord/token-extractor.test.ts +53 -53
  332. package/src/platforms/discord/token-extractor.ts +30 -6
  333. package/src/platforms/discord/types.test.ts +26 -26
  334. package/src/platforms/discordbot/cli.ts +10 -0
  335. package/src/platforms/discordbot/client.test.ts +31 -31
  336. package/src/platforms/discordbot/client.ts +4 -0
  337. package/src/platforms/discordbot/commands/auth.test.ts +18 -18
  338. package/src/platforms/discordbot/commands/auth.ts +1 -5
  339. package/src/platforms/discordbot/commands/channel.test.ts +11 -11
  340. package/src/platforms/discordbot/commands/file.test.ts +7 -7
  341. package/src/platforms/discordbot/commands/message.test.ts +25 -25
  342. package/src/platforms/discordbot/commands/message.ts +1 -6
  343. package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
  344. package/src/platforms/discordbot/commands/server.test.ts +12 -12
  345. package/src/platforms/discordbot/commands/server.ts +1 -5
  346. package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
  347. package/src/platforms/discordbot/commands/thread.test.ts +10 -10
  348. package/src/platforms/discordbot/commands/user.test.ts +9 -9
  349. package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
  350. package/src/platforms/discordbot/commands/whoami.ts +1 -6
  351. package/src/platforms/discordbot/credential-manager.test.ts +28 -28
  352. package/src/platforms/discordbot/index.test.ts +82 -0
  353. package/src/platforms/discordbot/index.ts +27 -9
  354. package/src/platforms/discordbot/listener.test.ts +1002 -0
  355. package/src/platforms/discordbot/listener.ts +321 -0
  356. package/src/platforms/discordbot/types.ts +163 -0
  357. package/src/platforms/instagram/client.test.ts +18 -18
  358. package/src/platforms/instagram/commands/auth.test.ts +11 -11
  359. package/src/platforms/instagram/commands/auth.ts +9 -1
  360. package/src/platforms/instagram/commands/chat.test.ts +6 -6
  361. package/src/platforms/instagram/commands/message.test.ts +11 -11
  362. package/src/platforms/instagram/commands/shared.test.ts +12 -12
  363. package/src/platforms/instagram/commands/whoami.test.ts +3 -3
  364. package/src/platforms/instagram/credential-manager.test.ts +21 -21
  365. package/src/platforms/instagram/ensure-auth.test.ts +4 -4
  366. package/src/platforms/instagram/index.test.ts +9 -9
  367. package/src/platforms/instagram/listener.test.ts +8 -8
  368. package/src/platforms/instagram/token-extractor.test.ts +35 -35
  369. package/src/platforms/instagram/token-extractor.ts +13 -1
  370. package/src/platforms/kakaotalk/client.test.ts +33 -33
  371. package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
  372. package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
  373. package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
  374. package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
  375. package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
  376. package/src/platforms/kakaotalk/index.test.ts +15 -15
  377. package/src/platforms/kakaotalk/listener.test.ts +17 -17
  378. package/src/platforms/line/client.test.ts +17 -17
  379. package/src/platforms/line/commands/auth.test.ts +8 -8
  380. package/src/platforms/line/commands/chat.test.ts +7 -7
  381. package/src/platforms/line/commands/friend.test.ts +6 -6
  382. package/src/platforms/line/commands/message.test.ts +7 -7
  383. package/src/platforms/line/commands/whoami.test.ts +6 -6
  384. package/src/platforms/line/credential-manager.test.ts +17 -17
  385. package/src/platforms/line/index.test.ts +10 -10
  386. package/src/platforms/line/listener.test.ts +15 -15
  387. package/src/platforms/line/types.test.ts +14 -14
  388. package/src/platforms/slack/cli.test.ts +8 -8
  389. package/src/platforms/slack/client.test.ts +151 -151
  390. package/src/platforms/slack/commands/activity.test.ts +13 -13
  391. package/src/platforms/slack/commands/auth.test.ts +34 -34
  392. package/src/platforms/slack/commands/auth.ts +11 -2
  393. package/src/platforms/slack/commands/bookmark.test.ts +9 -9
  394. package/src/platforms/slack/commands/channel.test.ts +17 -17
  395. package/src/platforms/slack/commands/drafts.test.ts +7 -7
  396. package/src/platforms/slack/commands/emoji.test.ts +3 -3
  397. package/src/platforms/slack/commands/file.test.ts +12 -12
  398. package/src/platforms/slack/commands/message.test.ts +19 -19
  399. package/src/platforms/slack/commands/pin.test.ts +7 -7
  400. package/src/platforms/slack/commands/reaction.test.ts +10 -10
  401. package/src/platforms/slack/commands/reminder.test.ts +9 -9
  402. package/src/platforms/slack/commands/saved.test.ts +7 -7
  403. package/src/platforms/slack/commands/sections.test.ts +5 -5
  404. package/src/platforms/slack/commands/snapshot.test.ts +13 -13
  405. package/src/platforms/slack/commands/unread.test.ts +6 -6
  406. package/src/platforms/slack/commands/user.test.ts +10 -10
  407. package/src/platforms/slack/commands/usergroup.test.ts +15 -15
  408. package/src/platforms/slack/commands/whoami.test.ts +6 -6
  409. package/src/platforms/slack/commands/workspace.test.ts +26 -26
  410. package/src/platforms/slack/credential-manager.test.ts +14 -14
  411. package/src/platforms/slack/ensure-auth.test.ts +21 -21
  412. package/src/platforms/slack/index.test.ts +12 -12
  413. package/src/platforms/slack/listener.test.ts +17 -17
  414. package/src/platforms/slack/token-extractor-node.test.ts +2 -2
  415. package/src/platforms/slack/token-extractor.test.ts +133 -37
  416. package/src/platforms/slack/token-extractor.ts +76 -13
  417. package/src/platforms/slack/types.test.ts +21 -21
  418. package/src/platforms/slackbot/cli.ts +13 -1
  419. package/src/platforms/slackbot/client.test.ts +296 -22
  420. package/src/platforms/slackbot/client.ts +130 -2
  421. package/src/platforms/slackbot/commands/auth.test.ts +14 -14
  422. package/src/platforms/slackbot/commands/auth.ts +1 -5
  423. package/src/platforms/slackbot/commands/channel.test.ts +7 -7
  424. package/src/platforms/slackbot/commands/file.test.ts +201 -0
  425. package/src/platforms/slackbot/commands/file.ts +212 -0
  426. package/src/platforms/slackbot/commands/index.ts +1 -0
  427. package/src/platforms/slackbot/commands/message.test.ts +13 -13
  428. package/src/platforms/slackbot/commands/message.ts +22 -0
  429. package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
  430. package/src/platforms/slackbot/commands/user.test.ts +7 -7
  431. package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
  432. package/src/platforms/slackbot/commands/whoami.ts +1 -6
  433. package/src/platforms/slackbot/credential-manager.test.ts +83 -23
  434. package/src/platforms/slackbot/credential-manager.ts +32 -2
  435. package/src/platforms/slackbot/index.test.ts +59 -0
  436. package/src/platforms/slackbot/index.ts +31 -7
  437. package/src/platforms/slackbot/listener.test.ts +1012 -0
  438. package/src/platforms/slackbot/listener.ts +362 -0
  439. package/src/platforms/slackbot/types.test.ts +7 -7
  440. package/src/platforms/slackbot/types.ts +224 -1
  441. package/src/platforms/teams/client.test.ts +30 -30
  442. package/src/platforms/teams/commands/auth.test.ts +9 -9
  443. package/src/platforms/teams/commands/auth.ts +66 -7
  444. package/src/platforms/teams/commands/channel.test.ts +7 -7
  445. package/src/platforms/teams/commands/file.test.ts +4 -4
  446. package/src/platforms/teams/commands/message.test.ts +5 -5
  447. package/src/platforms/teams/commands/reaction.test.ts +4 -4
  448. package/src/platforms/teams/commands/snapshot.test.ts +7 -7
  449. package/src/platforms/teams/commands/team.test.ts +8 -8
  450. package/src/platforms/teams/commands/user.test.ts +4 -4
  451. package/src/platforms/teams/commands/whoami.test.ts +6 -6
  452. package/src/platforms/teams/credential-manager.test.ts +17 -17
  453. package/src/platforms/teams/ensure-auth.test.ts +69 -18
  454. package/src/platforms/teams/ensure-auth.ts +39 -11
  455. package/src/platforms/teams/index.test.ts +15 -15
  456. package/src/platforms/teams/token-extractor.test.ts +251 -69
  457. package/src/platforms/teams/token-extractor.ts +94 -31
  458. package/src/platforms/teams/types.test.ts +26 -26
  459. package/src/platforms/telegram/app-config.test.ts +4 -4
  460. package/src/platforms/telegram/chat-utils.test.ts +12 -12
  461. package/src/platforms/telegram/client.test.ts +4 -4
  462. package/src/platforms/telegram/commands/auth.test.ts +16 -16
  463. package/src/platforms/telegram/commands/chat.test.ts +9 -9
  464. package/src/platforms/telegram/commands/message.test.ts +6 -6
  465. package/src/platforms/telegram/commands/shared.test.ts +3 -3
  466. package/src/platforms/telegram/commands/whoami.test.ts +3 -3
  467. package/src/platforms/telegram/credential-manager.test.ts +10 -10
  468. package/src/platforms/telegram/types.test.ts +6 -6
  469. package/src/platforms/webex/app-config.test.ts +8 -8
  470. package/src/platforms/webex/cli.test.ts +5 -5
  471. package/src/platforms/webex/client.test.ts +65 -65
  472. package/src/platforms/webex/commands/auth.test.ts +18 -18
  473. package/src/platforms/webex/commands/auth.ts +13 -2
  474. package/src/platforms/webex/commands/member.test.ts +5 -5
  475. package/src/platforms/webex/commands/message.test.ts +12 -12
  476. package/src/platforms/webex/commands/snapshot.test.ts +5 -5
  477. package/src/platforms/webex/commands/space.test.ts +10 -10
  478. package/src/platforms/webex/commands/whoami.test.ts +6 -6
  479. package/src/platforms/webex/credential-manager.test.ts +22 -22
  480. package/src/platforms/webex/encryption.test.ts +4 -4
  481. package/src/platforms/webex/ensure-auth.test.ts +5 -5
  482. package/src/platforms/webex/index.test.ts +5 -5
  483. package/src/platforms/webex/markdown-to-html.test.ts +33 -33
  484. package/src/platforms/webex/token-extractor.test.ts +23 -23
  485. package/src/platforms/webex/token-extractor.ts +25 -3
  486. package/src/platforms/webex/types.test.ts +27 -27
  487. package/src/platforms/wechatbot/cli.ts +9 -0
  488. package/src/platforms/wechatbot/client.test.ts +27 -27
  489. package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
  490. package/src/platforms/wechatbot/commands/auth.ts +1 -5
  491. package/src/platforms/wechatbot/commands/message.test.ts +8 -8
  492. package/src/platforms/wechatbot/commands/message.ts +1 -6
  493. package/src/platforms/wechatbot/commands/template.test.ts +9 -9
  494. package/src/platforms/wechatbot/commands/template.ts +1 -6
  495. package/src/platforms/wechatbot/commands/user.test.ts +7 -7
  496. package/src/platforms/wechatbot/commands/user.ts +1 -6
  497. package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
  498. package/src/platforms/wechatbot/commands/whoami.ts +1 -6
  499. package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
  500. package/src/platforms/wechatbot/index.test.ts +10 -10
  501. package/src/platforms/wechatbot/types.test.ts +25 -25
  502. package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
  503. package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
  504. package/src/platforms/whatsapp/commands/message.test.ts +10 -10
  505. package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
  506. package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
  507. package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
  508. package/src/platforms/whatsapp/index.test.ts +8 -8
  509. package/src/platforms/whatsapp/types.test.ts +42 -42
  510. package/src/platforms/whatsappbot/cli.ts +9 -0
  511. package/src/platforms/whatsappbot/client.test.ts +27 -27
  512. package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
  513. package/src/platforms/whatsappbot/commands/auth.ts +1 -5
  514. package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
  515. package/src/platforms/whatsappbot/commands/message.ts +1 -6
  516. package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
  517. package/src/platforms/whatsappbot/commands/template.ts +1 -6
  518. package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
  519. package/src/platforms/whatsappbot/commands/whoami.ts +1 -6
  520. package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
  521. package/src/platforms/whatsappbot/index.test.ts +7 -7
  522. package/src/platforms/whatsappbot/types.test.ts +18 -18
  523. package/src/shared/chromium/browsers.test.ts +102 -22
  524. package/src/shared/chromium/browsers.ts +72 -3
  525. package/src/shared/chromium/cli-options.test.ts +22 -0
  526. package/src/shared/chromium/cli-options.ts +12 -0
  527. package/src/shared/chromium/cookie-reader.test.ts +13 -13
  528. package/src/shared/chromium/decryptor.test.ts +97 -32
  529. package/src/shared/chromium/decryptor.ts +27 -6
  530. package/src/shared/chromium/index.ts +3 -0
  531. package/src/shared/utils/cli-output.test.ts +57 -0
  532. package/src/shared/utils/cli-output.ts +8 -0
  533. package/src/shared/utils/concurrency.test.ts +6 -6
  534. package/src/shared/utils/derived-key-cache.test.ts +11 -11
  535. package/src/tui/app.ts +129 -20
  536. package/src/tui/utils.test.ts +31 -31
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, spyOn, it } from 'bun:test'
2
2
  import * as childProcess from 'node:child_process'
3
3
 
4
4
  import { WebexClient } from '../client'
@@ -42,7 +42,7 @@ describe('auth commands', () => {
42
42
  })
43
43
 
44
44
  describe('loginAction with --token', () => {
45
- test('authenticates with provided token (bot token flow)', async () => {
45
+ it('authenticates with provided token (bot token flow)', async () => {
46
46
  protoSpy(WebexClient.prototype, 'login').mockResolvedValue(new WebexClient())
47
47
  protoSpy(WebexClient.prototype, 'testAuth').mockResolvedValue(mockPerson)
48
48
  protoSpy(WebexCredentialManager.prototype, 'saveConfig').mockResolvedValue(undefined)
@@ -56,7 +56,7 @@ describe('auth commands', () => {
56
56
  expect(output.user.displayName).toBe('Test User')
57
57
  })
58
58
 
59
- test('saves tokenType as manual with expiresAt 0', async () => {
59
+ it('saves tokenType as manual with expiresAt 0', async () => {
60
60
  protoSpy(WebexClient.prototype, 'login').mockResolvedValue(new WebexClient())
61
61
  protoSpy(WebexClient.prototype, 'testAuth').mockResolvedValue(mockPerson)
62
62
  const saveSpy = protoSpy(WebexCredentialManager.prototype, 'saveConfig').mockResolvedValue(undefined)
@@ -71,7 +71,7 @@ describe('auth commands', () => {
71
71
  })
72
72
 
73
73
  describe('loginAction with --client-id and --client-secret', () => {
74
- test('uses provided credentials for Device Grant flow', async () => {
74
+ it('uses provided credentials for Device Grant flow', async () => {
75
75
  protoSpy(WebexCredentialManager.prototype, 'requestDeviceCode').mockResolvedValue({
76
76
  deviceCode: 'd',
77
77
  userCode: 'u',
@@ -101,7 +101,7 @@ describe('auth commands', () => {
101
101
  )
102
102
  })
103
103
 
104
- test('saves tokenType as oauth in config', async () => {
104
+ it('saves tokenType as oauth in config', async () => {
105
105
  protoSpy(WebexCredentialManager.prototype, 'requestDeviceCode').mockResolvedValue({
106
106
  deviceCode: 'd',
107
107
  userCode: 'u',
@@ -125,7 +125,7 @@ describe('auth commands', () => {
125
125
  expect(savedConfig.tokenType).toBe('oauth')
126
126
  })
127
127
 
128
- test('saves clientId and clientSecret in config', async () => {
128
+ it('saves clientId and clientSecret in config', async () => {
129
129
  protoSpy(WebexCredentialManager.prototype, 'requestDeviceCode').mockResolvedValue({
130
130
  deviceCode: 'd',
131
131
  userCode: 'u',
@@ -152,7 +152,7 @@ describe('auth commands', () => {
152
152
  })
153
153
 
154
154
  describe('statusAction', () => {
155
- test('shows authenticated status when token is valid', async () => {
155
+ it('shows authenticated status when token is valid', async () => {
156
156
  protoSpy(WebexCredentialManager.prototype, 'loadConfig').mockResolvedValue(null)
157
157
  protoSpy(WebexCredentialManager.prototype, 'getToken').mockResolvedValue('valid-token')
158
158
  protoSpy(WebexClient.prototype, 'login').mockResolvedValue(new WebexClient())
@@ -166,7 +166,7 @@ describe('auth commands', () => {
166
166
  expect(output.user.displayName).toBe('Test User')
167
167
  })
168
168
 
169
- test('shows not authenticated when no token', async () => {
169
+ it('shows not authenticated when no token', async () => {
170
170
  protoSpy(WebexCredentialManager.prototype, 'loadConfig').mockResolvedValue(null)
171
171
  protoSpy(WebexCredentialManager.prototype, 'getToken').mockResolvedValue(null)
172
172
  const exitSpy = protoSpy(process, 'exit').mockImplementation(() => undefined as never)
@@ -179,7 +179,7 @@ describe('auth commands', () => {
179
179
  expect(exitSpy).toHaveBeenCalledWith(1)
180
180
  })
181
181
 
182
- test('shows not authenticated when token validation fails', async () => {
182
+ it('shows not authenticated when token validation fails', async () => {
183
183
  protoSpy(WebexCredentialManager.prototype, 'loadConfig').mockResolvedValue(null)
184
184
  protoSpy(WebexCredentialManager.prototype, 'getToken').mockResolvedValue('invalid-token')
185
185
  protoSpy(WebexClient.prototype, 'login').mockResolvedValue(new WebexClient())
@@ -192,7 +192,7 @@ describe('auth commands', () => {
192
192
  expect(output.authenticated).toBe(false)
193
193
  })
194
194
 
195
- test('loads config for stored client credentials', async () => {
195
+ it('loads config for stored client credentials', async () => {
196
196
  protoSpy(WebexCredentialManager.prototype, 'loadConfig').mockResolvedValue({
197
197
  accessToken: 'at',
198
198
  refreshToken: 'rt',
@@ -211,7 +211,7 @@ describe('auth commands', () => {
211
211
  })
212
212
 
213
213
  describe('extractAction', () => {
214
- test('passes deviceUrl and tokenType to client.login', async () => {
214
+ it('passes deviceUrl and tokenType to client.login', async () => {
215
215
  protoSpy(WebexTokenExtractor.prototype, 'extract').mockResolvedValue({
216
216
  accessToken: 'extracted-token-at-least-twenty-chars',
217
217
  refreshToken: 'refresh-token',
@@ -232,7 +232,7 @@ describe('auth commands', () => {
232
232
  })
233
233
  })
234
234
 
235
- test('attempts refresh when token is expired', async () => {
235
+ it('attempts refresh when token is expired', async () => {
236
236
  protoSpy(WebexTokenExtractor.prototype, 'extract').mockResolvedValue({
237
237
  accessToken: 'expired-token-at-least-twenty-chars-',
238
238
  refreshToken: 'valid-refresh-token',
@@ -257,7 +257,7 @@ describe('auth commands', () => {
257
257
  expect(output.refreshed).toBe(true)
258
258
  })
259
259
 
260
- test('reports expired token with actionable hint when refresh fails', async () => {
260
+ it('reports expired token with actionable hint when refresh fails', async () => {
261
261
  protoSpy(WebexTokenExtractor.prototype, 'extract').mockResolvedValue({
262
262
  accessToken: 'expired-token-at-least-twenty-chars-',
263
263
  refreshToken: 'bad-refresh-token',
@@ -278,7 +278,7 @@ describe('auth commands', () => {
278
278
  expect(exitSpy).toHaveBeenCalledWith(1)
279
279
  })
280
280
 
281
- test('rethrows non-auth errors even when token is expired', async () => {
281
+ it('rethrows non-auth errors even when token is expired', async () => {
282
282
  protoSpy(WebexTokenExtractor.prototype, 'extract').mockResolvedValue({
283
283
  accessToken: 'expired-token-at-least-twenty-chars-',
284
284
  refreshToken: 'bad-refresh-token',
@@ -298,7 +298,7 @@ describe('auth commands', () => {
298
298
  }
299
299
  })
300
300
 
301
- test('rethrows non-expiry auth errors', async () => {
301
+ it('rethrows non-expiry auth errors', async () => {
302
302
  protoSpy(WebexTokenExtractor.prototype, 'extract').mockResolvedValue({
303
303
  accessToken: 'valid-token-at-least-twenty-chars-xx',
304
304
  expiresAt: Date.now() + 3600000,
@@ -316,7 +316,7 @@ describe('auth commands', () => {
316
316
  }
317
317
  })
318
318
 
319
- test('outputs no token found when extract returns null', async () => {
319
+ it('outputs no token found when extract returns null', async () => {
320
320
  protoSpy(WebexTokenExtractor.prototype, 'extract').mockResolvedValue(null)
321
321
  const exitSpy = protoSpy(process, 'exit').mockImplementation(() => undefined as never)
322
322
 
@@ -330,7 +330,7 @@ describe('auth commands', () => {
330
330
  })
331
331
 
332
332
  describe('logoutAction', () => {
333
- test('clears credentials when authenticated', async () => {
333
+ it('clears credentials when authenticated', async () => {
334
334
  protoSpy(WebexCredentialManager.prototype, 'loadConfig').mockResolvedValue({
335
335
  accessToken: 'token',
336
336
  refreshToken: 'refresh',
@@ -346,7 +346,7 @@ describe('auth commands', () => {
346
346
  expect(output.success).toBe(true)
347
347
  })
348
348
 
349
- test('shows error when not authenticated', async () => {
349
+ it('shows error when not authenticated', async () => {
350
350
  protoSpy(WebexCredentialManager.prototype, 'loadConfig').mockResolvedValue(null)
351
351
  const exitSpy = protoSpy(process, 'exit').mockImplementation(() => undefined as never)
352
352
 
@@ -1,5 +1,6 @@
1
1
  import { Command } from 'commander'
2
2
 
3
+ import { collectBrowserProfileOption } from '@/shared/chromium'
3
4
  import { handleError } from '@/shared/utils/error-handler'
4
5
  import { formatOutput } from '@/shared/utils/output'
5
6
  import { info, debug } from '@/shared/utils/stderr'
@@ -141,10 +142,14 @@ export async function statusAction(options: { pretty?: boolean }): Promise<void>
141
142
  }
142
143
  }
143
144
 
144
- export async function extractAction(options: { pretty?: boolean; debug?: boolean }): Promise<void> {
145
+ export async function extractAction(options: {
146
+ pretty?: boolean
147
+ debug?: boolean
148
+ browserProfile?: string[]
149
+ }): Promise<void> {
145
150
  try {
146
151
  const debugLog = options.debug ? (msg: string) => debug(`[debug] ${msg}`) : undefined
147
- const extractor = new WebexTokenExtractor(undefined, debugLog)
152
+ const extractor = new WebexTokenExtractor(undefined, debugLog, undefined, options.browserProfile)
148
153
 
149
154
  if (options.debug) {
150
155
  debug('[debug] Searching browser profiles for Webex tokens...')
@@ -283,6 +288,12 @@ export const authCommand = new Command('auth')
283
288
  .description('Extract Webex token from browser (Chrome, Edge, Arc, Brave)')
284
289
  .option('--pretty', 'Pretty print JSON output')
285
290
  .option('--debug', 'Show debug output')
291
+ .option(
292
+ '--browser-profile <path>',
293
+ 'Additional Chromium profile/user-data directory to scan (repeatable, comma-separated supported)',
294
+ collectBrowserProfileOption,
295
+ [],
296
+ )
286
297
  .action(extractAction),
287
298
  )
288
299
  .addCommand(
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  import { WebexError } from '../types'
4
4
 
@@ -59,7 +59,7 @@ describe('member commands', () => {
59
59
  consoleSpy.mockRestore()
60
60
  })
61
61
 
62
- test('listAction calls listMemberships with spaceId and outputs mapped members', async () => {
62
+ it('calls listMemberships with spaceId and outputs mapped members', async () => {
63
63
  await listAction('room-1', {})
64
64
 
65
65
  expect(mockListMemberships).toHaveBeenCalledWith('room-1', { max: undefined })
@@ -85,13 +85,13 @@ describe('member commands', () => {
85
85
  )
86
86
  })
87
87
 
88
- test('listAction passes limit option to listMemberships', async () => {
88
+ it('passes limit option to listMemberships', async () => {
89
89
  await listAction('room-1', { limit: 25 })
90
90
 
91
91
  expect(mockListMemberships).toHaveBeenCalledWith('room-1', { max: 25 })
92
92
  })
93
93
 
94
- test('listAction handles not-authenticated case', async () => {
94
+ it('throws when not authenticated', async () => {
95
95
  mockLogin.mockImplementation(async () => {
96
96
  throw new WebexError('No Webex credentials found.', 'no_credentials')
97
97
  })
@@ -101,7 +101,7 @@ describe('member commands', () => {
101
101
  expect(mockHandleError).toHaveBeenCalledWith(expect.any(WebexError))
102
102
  })
103
103
 
104
- test('listAction handles API error', async () => {
104
+ it('throws on API error', async () => {
105
105
  mockListMemberships.mockImplementation(async () => {
106
106
  throw new Error('API failure')
107
107
  })
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  import { WebexError } from '../types'
4
4
 
@@ -77,7 +77,7 @@ afterEach(() => {
77
77
  consoleLogSpy.mockRestore()
78
78
  })
79
79
 
80
- test('send: calls sendMessage with correct args and outputs result', async () => {
80
+ it('calls sendMessage with correct args and outputs result', async () => {
81
81
  await sendAction('space_456', 'Hello world', { pretty: false })
82
82
 
83
83
  expect(mockSendMessage).toHaveBeenCalledWith('space_456', 'Hello world', {
@@ -90,13 +90,13 @@ test('send: calls sendMessage with correct args and outputs result', async () =>
90
90
  expect(output).toContain('user@example.com')
91
91
  })
92
92
 
93
- test('send: with --markdown passes markdown option', async () => {
93
+ it('passes markdown option when --markdown flag is set on send', async () => {
94
94
  await sendAction('space_456', '**bold**', { markdown: true, pretty: false })
95
95
 
96
96
  expect(mockSendMessage).toHaveBeenCalledWith('space_456', '**bold**', { markdown: true })
97
97
  })
98
98
 
99
- test('send: not authenticated shows error', async () => {
99
+ it('throws when not authenticated on send', async () => {
100
100
  mockLogin.mockImplementation(async () => {
101
101
  throw new WebexError('No Webex credentials found.', 'no_credentials')
102
102
  })
@@ -106,7 +106,7 @@ test('send: not authenticated shows error', async () => {
106
106
  expect(mockHandleError).toHaveBeenCalledWith(expect.any(WebexError))
107
107
  })
108
108
 
109
- test('dm: calls sendDirectMessage with email and text', async () => {
109
+ it('calls sendDirectMessage with email and text', async () => {
110
110
  await dmAction('alice@example.com', 'Hello!', { pretty: false })
111
111
 
112
112
  expect(mockSendDirectMessage).toHaveBeenCalledWith('alice@example.com', 'Hello!', {
@@ -117,7 +117,7 @@ test('dm: calls sendDirectMessage with email and text', async () => {
117
117
  expect(output).toContain('msg_123')
118
118
  })
119
119
 
120
- test('dm: with --markdown passes markdown option', async () => {
120
+ it('passes markdown option to sendDirectMessage when --markdown flag is set', async () => {
121
121
  await dmAction('alice@example.com', '**bold**', { markdown: true, pretty: false })
122
122
 
123
123
  expect(mockSendDirectMessage).toHaveBeenCalledWith('alice@example.com', '**bold**', {
@@ -125,7 +125,7 @@ test('dm: with --markdown passes markdown option', async () => {
125
125
  })
126
126
  })
127
127
 
128
- test('list: calls listMessages with limit and outputs array', async () => {
128
+ it('calls listMessages with limit and outputs array', async () => {
129
129
  await listAction('space_456', { limit: 50, pretty: false })
130
130
 
131
131
  expect(mockListMessages).toHaveBeenCalledWith('space_456', { max: 50 })
@@ -135,7 +135,7 @@ test('list: calls listMessages with limit and outputs array', async () => {
135
135
  expect(output).toContain('msg_124')
136
136
  })
137
137
 
138
- test('get: calls getMessage with correct id and outputs result', async () => {
138
+ it('calls getMessage with correct id and outputs result', async () => {
139
139
  await getAction('msg_123', { pretty: false })
140
140
 
141
141
  expect(mockGetMessage).toHaveBeenCalledWith('msg_123')
@@ -145,7 +145,7 @@ test('get: calls getMessage with correct id and outputs result', async () => {
145
145
  expect(output).toContain('user@example.com')
146
146
  })
147
147
 
148
- test('delete: with --force calls deleteMessage and outputs deleted id', async () => {
148
+ it('calls deleteMessage and outputs deleted id when --force flag is set', async () => {
149
149
  await deleteAction('msg_123', { force: true, pretty: false })
150
150
 
151
151
  expect(mockDeleteMessage).toHaveBeenCalledWith('msg_123')
@@ -155,7 +155,7 @@ test('delete: with --force calls deleteMessage and outputs deleted id', async ()
155
155
  expect(output).toContain('msg_123')
156
156
  })
157
157
 
158
- test('delete: without --force shows warning and does not delete', async () => {
158
+ it('shows warning and does not delete without --force flag', async () => {
159
159
  try {
160
160
  await deleteAction('msg_123', { force: false, pretty: false })
161
161
  } catch {}
@@ -167,7 +167,7 @@ test('delete: without --force shows warning and does not delete', async () => {
167
167
  expect(output).toContain('--force')
168
168
  })
169
169
 
170
- test('edit: calls editMessage with roomId in args and outputs result', async () => {
170
+ it('calls editMessage with roomId in args and outputs result', async () => {
171
171
  await editAction('msg_123', 'space_456', 'Updated message', { pretty: false })
172
172
 
173
173
  expect(mockEditMessage).toHaveBeenCalledWith('msg_123', 'space_456', 'Updated message', {
@@ -179,7 +179,7 @@ test('edit: calls editMessage with roomId in args and outputs result', async ()
179
179
  expect(output).toContain('Updated message')
180
180
  })
181
181
 
182
- test('edit: with --markdown passes markdown option', async () => {
182
+ it('passes markdown option to editMessage when --markdown flag is set', async () => {
183
183
  await editAction('msg_123', 'space_456', '**updated**', { markdown: true, pretty: false })
184
184
 
185
185
  expect(mockEditMessage).toHaveBeenCalledWith('msg_123', 'space_456', '**updated**', {
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  import { WebexError } from '../types'
4
4
 
@@ -79,7 +79,7 @@ describe('snapshot command', () => {
79
79
  consoleSpy.mockRestore()
80
80
  })
81
81
 
82
- test('brief snapshot returns spaces with id and title only', async () => {
82
+ it('returns spaces with id and title only in brief mode', async () => {
83
83
  await snapshotAction({})
84
84
 
85
85
  expect(consoleSpy).toHaveBeenCalled()
@@ -91,7 +91,7 @@ describe('snapshot command', () => {
91
91
  expect(output.hint).toBeDefined()
92
92
  })
93
93
 
94
- test('full snapshot returns spaces with id, title, type, lastActivity', async () => {
94
+ it('returns spaces with id, title, type, and lastActivity in full mode', async () => {
95
95
  await snapshotAction({ full: true })
96
96
 
97
97
  expect(consoleSpy).toHaveBeenCalled()
@@ -104,7 +104,7 @@ describe('snapshot command', () => {
104
104
  expect(output.hint).toBeUndefined()
105
105
  })
106
106
 
107
- test('filters spaces to only those in my memberships', async () => {
107
+ it('filters spaces to only those in my memberships', async () => {
108
108
  await snapshotAction({})
109
109
 
110
110
  const output = JSON.parse(consoleSpy.mock.calls[consoleSpy.mock.calls.length - 1][0])
@@ -112,7 +112,7 @@ describe('snapshot command', () => {
112
112
  expect(output.spaces[0].id).toBe('space-1')
113
113
  })
114
114
 
115
- test('not authenticated outputs error', async () => {
115
+ it('throws when not authenticated', async () => {
116
116
  mockLogin.mockImplementation(async () => {
117
117
  throw new WebexError('No Webex credentials found.', 'no_credentials')
118
118
  })
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  import { WebexError } from '../types'
4
4
 
@@ -74,7 +74,7 @@ afterEach(() => {
74
74
  })
75
75
 
76
76
  describe('listAction', () => {
77
- test('calls listSpaces and outputs mapped array', async () => {
77
+ it('calls listSpaces and outputs mapped array', async () => {
78
78
  await listAction({})
79
79
 
80
80
  expect(mockListSpaces).toHaveBeenCalled()
@@ -98,19 +98,19 @@ describe('listAction', () => {
98
98
  )
99
99
  })
100
100
 
101
- test('passes type and limit options to listSpaces', async () => {
101
+ it('passes type and limit options to listSpaces', async () => {
102
102
  await listAction({ type: 'group', limit: 10 })
103
103
 
104
104
  expect(mockListSpaces).toHaveBeenCalledWith({ type: 'group', max: 10 })
105
105
  })
106
106
 
107
- test('passes undefined type and limit when not provided', async () => {
107
+ it('passes undefined type and limit when not provided', async () => {
108
108
  await listAction({})
109
109
 
110
110
  expect(mockListSpaces).toHaveBeenCalledWith({ type: undefined, max: undefined })
111
111
  })
112
112
 
113
- test('outputs pretty-printed JSON when pretty is true', async () => {
113
+ it('outputs pretty-printed JSON when pretty is true', async () => {
114
114
  await listAction({ pretty: true })
115
115
 
116
116
  expect(consoleLogSpy).toHaveBeenCalledWith(
@@ -137,7 +137,7 @@ describe('listAction', () => {
137
137
  )
138
138
  })
139
139
 
140
- test('not authenticated: outputs error and exits', async () => {
140
+ it('throws when not authenticated', async () => {
141
141
  mockLogin.mockImplementation(async () => {
142
142
  throw new WebexError('No Webex credentials found.', 'no_credentials')
143
143
  })
@@ -150,7 +150,7 @@ describe('listAction', () => {
150
150
  })
151
151
 
152
152
  describe('infoAction', () => {
153
- test('calls getSpace with spaceId and outputs space details', async () => {
153
+ it('calls getSpace with spaceId and outputs space details', async () => {
154
154
  await infoAction('space-1', {})
155
155
 
156
156
  expect(mockGetSpace).toHaveBeenCalledWith('space-1')
@@ -168,7 +168,7 @@ describe('infoAction', () => {
168
168
  )
169
169
  })
170
170
 
171
- test('outputs null for teamId when not present', async () => {
171
+ it('outputs null for teamId when not present', async () => {
172
172
  mockGetSpace.mockImplementation(() => Promise.resolve({ ...mockSpace, teamId: undefined }))
173
173
 
174
174
  await infoAction('space-1', {})
@@ -179,7 +179,7 @@ describe('infoAction', () => {
179
179
  expect(output.teamId).toBeNull()
180
180
  })
181
181
 
182
- test('outputs pretty-printed JSON when pretty is true', async () => {
182
+ it('outputs pretty-printed JSON when pretty is true', async () => {
183
183
  await infoAction('space-1', { pretty: true })
184
184
 
185
185
  expect(consoleLogSpy).toHaveBeenCalledWith(
@@ -200,7 +200,7 @@ describe('infoAction', () => {
200
200
  )
201
201
  })
202
202
 
203
- test('not authenticated: outputs error and exits', async () => {
203
+ it('throws when not authenticated', async () => {
204
204
  mockLogin.mockImplementation(async () => {
205
205
  throw new WebexError('No Webex credentials found.', 'no_credentials')
206
206
  })
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, spyOn, it } from 'bun:test'
2
2
 
3
3
  import * as clientModule from '../client'
4
4
  import { WebexError } from '../types'
@@ -42,19 +42,19 @@ afterEach(() => {
42
42
  processExitSpy?.mockRestore()
43
43
  })
44
44
 
45
- test('whoami command is defined with correct name and description', () => {
45
+ it('whoami command is defined with correct name and description', () => {
46
46
  expect(whoamiCommand).toBeDefined()
47
47
  expect(whoamiCommand.name()).toBe('whoami')
48
48
  expect(whoamiCommand.description()).toBe('Show current authenticated user')
49
49
  })
50
50
 
51
- test('whoami command has --pretty option', () => {
51
+ it('whoami command has --pretty option', () => {
52
52
  const options = whoamiCommand.options
53
53
  const hasPretty = options.some((opt: { long?: string }) => opt.long === '--pretty')
54
54
  expect(hasPretty).toBe(true)
55
55
  })
56
56
 
57
- test('whoami calls testAuth and outputs user fields', async () => {
57
+ it('whoami calls testAuth and outputs user fields', async () => {
58
58
  // given: authenticated webex user
59
59
  // when: running whoami
60
60
  await whoamiCommand.parseAsync([], { from: 'user' })
@@ -75,7 +75,7 @@ test('whoami calls testAuth and outputs user fields', async () => {
75
75
  )
76
76
  })
77
77
 
78
- test('whoami outputs pretty-printed JSON when --pretty flag is passed', async () => {
78
+ it('whoami outputs pretty-printed JSON when --pretty flag is passed', async () => {
79
79
  // given: authenticated webex user
80
80
  // when: running whoami with --pretty
81
81
  await whoamiCommand.parseAsync(['--pretty'], { from: 'user' })
@@ -100,7 +100,7 @@ test('whoami outputs pretty-printed JSON when --pretty flag is passed', async ()
100
100
  )
101
101
  })
102
102
 
103
- test('whoami exits with code 1 when not authenticated', async () => {
103
+ it('whoami exits with code 1 when not authenticated', async () => {
104
104
  // given: no credentials
105
105
  webexClientSpy.mockImplementation(
106
106
  () =>