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 { afterAll, beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterAll, beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  type WorkspaceEntry = {
4
4
  workspace_id: string
@@ -20,6 +20,9 @@ const mockListChannels = mock(() =>
20
20
  ]),
21
21
  )
22
22
  const mockExtract = mock(() => Promise.resolve([{ accountCookie: 'fresh-account', sessionCookie: 'fresh-session' }]))
23
+ const mockCreateTokenExtractor = mock((_browserProfile?: string[]) => ({
24
+ extract: mockExtract,
25
+ }))
23
26
 
24
27
  import {
25
28
  clearAction,
@@ -89,9 +92,7 @@ setChannelAuthCommandDependenciesForTesting({
89
92
  return true
90
93
  },
91
94
  }),
92
- createTokenExtractor: () => ({
93
- extract: mockExtract,
94
- }),
95
+ createTokenExtractor: mockCreateTokenExtractor,
95
96
  })
96
97
 
97
98
  describe('channel auth commands', () => {
@@ -105,6 +106,7 @@ describe('channel auth commands', () => {
105
106
  mockGetAccount.mockReset()
106
107
  mockListChannels.mockReset()
107
108
  mockExtract.mockReset()
109
+ mockCreateTokenExtractor.mockReset()
108
110
 
109
111
  mockGetAccount.mockImplementation(() => Promise.resolve({ id: 'acct-1', name: 'Alice' }))
110
112
  mockListChannels.mockImplementation(() =>
@@ -116,10 +118,13 @@ describe('channel auth commands', () => {
116
118
  mockExtract.mockImplementation(() =>
117
119
  Promise.resolve([{ accountCookie: 'fresh-account', sessionCookie: 'fresh-session' }]),
118
120
  )
121
+ mockCreateTokenExtractor.mockImplementation((_browserProfile?: string[]) => ({
122
+ extract: mockExtract,
123
+ }))
119
124
  })
120
125
 
121
126
  describe('extractAction', () => {
122
- test('extracts fresh cookies and saves all workspaces', async () => {
127
+ it('extracts fresh cookies and saves all workspaces', async () => {
123
128
  const result = await extractAction()
124
129
 
125
130
  expect(mockExtract).toHaveBeenCalledTimes(1)
@@ -136,7 +141,14 @@ describe('channel auth commands', () => {
136
141
  expect(workspaceStore.get('ws-2')?.account_cookie).toBe('fresh-account')
137
142
  })
138
143
 
139
- test('preserves current workspace if it still exists after re-extraction', async () => {
144
+ it('passes custom browser profile paths to the token extractor', async () => {
145
+ await extractAction({ browserProfile: ['/tmp/profile-a', '/tmp/profile-b'] })
146
+
147
+ expect(mockCreateTokenExtractor).toHaveBeenCalledWith(['/tmp/profile-a', '/tmp/profile-b'])
148
+ expect(mockExtract).toHaveBeenCalledTimes(1)
149
+ })
150
+
151
+ it('preserves current workspace if it still exists after re-extraction', async () => {
140
152
  workspaceStore.set('ws-2', {
141
153
  workspace_id: 'ws-2',
142
154
  workspace_name: 'Workspace 2',
@@ -157,7 +169,7 @@ describe('channel auth commands', () => {
157
169
  })
158
170
  })
159
171
 
160
- test('switches to first workspace when previous current no longer exists', async () => {
172
+ it('switches to first workspace when previous current no longer exists', async () => {
161
173
  workspaceStore.set('ws-old', {
162
174
  workspace_id: 'ws-old',
163
175
  workspace_name: 'Old Workspace',
@@ -178,7 +190,7 @@ describe('channel auth commands', () => {
178
190
  })
179
191
  })
180
192
 
181
- test('returns error when token extraction fails', async () => {
193
+ it('returns error when token extraction fails', async () => {
182
194
  mockExtract.mockImplementation(() => Promise.resolve([]))
183
195
 
184
196
  const result = await extractAction()
@@ -188,7 +200,7 @@ describe('channel auth commands', () => {
188
200
  })
189
201
  })
190
202
 
191
- test('returns error when no workspaces found', async () => {
203
+ it('returns error when no workspaces found', async () => {
192
204
  mockListChannels.mockImplementation(() => Promise.resolve([]))
193
205
 
194
206
  const result = await extractAction()
@@ -200,14 +212,14 @@ describe('channel auth commands', () => {
200
212
  })
201
213
 
202
214
  describe('statusAction', () => {
203
- test('returns an error when no credentials exist', async () => {
215
+ it('returns an error when no credentials exist', async () => {
204
216
  const result = await statusAction()
205
217
 
206
218
  expect(result.valid).toBe(false)
207
219
  expect(result.error).toBe('No credentials. Run "agent-channeltalk auth extract" first.')
208
220
  })
209
221
 
210
- test('returns valid status for current workspace', async () => {
222
+ it('returns valid status for current workspace', async () => {
211
223
  workspaceStore.set('ws-1', {
212
224
  workspace_id: 'ws-1',
213
225
  workspace_name: 'Workspace 1',
@@ -228,7 +240,7 @@ describe('channel auth commands', () => {
228
240
  })
229
241
  })
230
242
 
231
- test('returns invalid status with stored info when api validation fails', async () => {
243
+ it('returns invalid status with stored info when api validation fails', async () => {
232
244
  workspaceStore.set('ws-1', {
233
245
  workspace_id: 'ws-1',
234
246
  workspace_name: 'Workspace 1',
@@ -251,7 +263,7 @@ describe('channel auth commands', () => {
251
263
  })
252
264
  })
253
265
 
254
- test('returns workspace-specific error for unknown workspace', async () => {
266
+ it('returns workspace-specific error for unknown workspace', async () => {
255
267
  const result = await statusAction({ workspace: 'missing' })
256
268
 
257
269
  expect(result).toEqual({
@@ -262,7 +274,7 @@ describe('channel auth commands', () => {
262
274
  })
263
275
 
264
276
  describe('clearAction', () => {
265
- test('removes all stored credentials', async () => {
277
+ it('removes all stored credentials', async () => {
266
278
  workspaceStore.set('ws-1', {
267
279
  workspace_id: 'ws-1',
268
280
  workspace_name: 'Workspace 1',
@@ -280,7 +292,7 @@ describe('channel auth commands', () => {
280
292
  })
281
293
 
282
294
  describe('listAction', () => {
283
- test('lists all workspaces with current flag', async () => {
295
+ it('lists all workspaces with current flag', async () => {
284
296
  workspaceStore.set('ws-1', {
285
297
  workspace_id: 'ws-1',
286
298
  workspace_name: 'Workspace 1',
@@ -305,7 +317,7 @@ describe('channel auth commands', () => {
305
317
  })
306
318
 
307
319
  describe('useAction', () => {
308
- test('switches current workspace', async () => {
320
+ it('switches current workspace', async () => {
309
321
  workspaceStore.set('ws-1', {
310
322
  workspace_id: 'ws-1',
311
323
  workspace_name: 'Workspace 1',
@@ -326,7 +338,7 @@ describe('channel auth commands', () => {
326
338
  expect(currentWorkspaceId).toBe('ws-1')
327
339
  })
328
340
 
329
- test('returns error for unknown workspace', async () => {
341
+ it('returns error for unknown workspace', async () => {
330
342
  const result = await useAction('missing')
331
343
 
332
344
  expect(result).toEqual({
@@ -336,7 +348,7 @@ describe('channel auth commands', () => {
336
348
  })
337
349
 
338
350
  describe('removeAction', () => {
339
- test('removes a stored workspace', async () => {
351
+ it('removes a stored workspace', async () => {
340
352
  workspaceStore.set('ws-1', {
341
353
  workspace_id: 'ws-1',
342
354
  workspace_name: 'Workspace 1',
@@ -351,7 +363,7 @@ describe('channel auth commands', () => {
351
363
  expect(workspaceStore.has('ws-1')).toBe(false)
352
364
  })
353
365
 
354
- test('returns error for unknown workspace', async () => {
366
+ it('returns error for unknown workspace', async () => {
355
367
  const result = await removeAction('missing')
356
368
 
357
369
  expect(result).toEqual({
@@ -1,5 +1,6 @@
1
1
  import { Command } from 'commander'
2
2
 
3
+ import { collectBrowserProfileOption } from '@/shared/chromium'
3
4
  import { formatOutput } from '@/shared/utils/output'
4
5
 
5
6
  import { ChannelClient } from '../client'
@@ -9,6 +10,7 @@ import { ChannelTokenExtractor } from '../token-extractor'
9
10
  interface ActionOptions {
10
11
  workspace?: string
11
12
  pretty?: boolean
13
+ browserProfile?: string[]
12
14
  _credManager?: ChannelCredentialManager
13
15
  }
14
16
 
@@ -60,7 +62,8 @@ let createChannelClient: (
60
62
 
61
63
  let createCredentialManager = (): ChannelCredentialManagerLike => new ChannelCredentialManager()
62
64
 
63
- let createTokenExtractor = (): ChannelTokenExtractorLike => new ChannelTokenExtractor()
65
+ let createTokenExtractor = (browserProfile?: string[]): ChannelTokenExtractorLike =>
66
+ new ChannelTokenExtractor(undefined, browserProfile)
64
67
 
65
68
  export function setChannelAuthCommandDependenciesForTesting(dependencies: {
66
69
  createChannelClient?: (
@@ -68,7 +71,7 @@ export function setChannelAuthCommandDependenciesForTesting(dependencies: {
68
71
  sessionCookie?: string,
69
72
  ) => ChannelClientLike | Promise<ChannelClientLike>
70
73
  createCredentialManager?: () => ChannelCredentialManagerLike
71
- createTokenExtractor?: () => ChannelTokenExtractorLike
74
+ createTokenExtractor?: (browserProfile?: string[]) => ChannelTokenExtractorLike
72
75
  }): void {
73
76
  if (dependencies.createChannelClient) createChannelClient = dependencies.createChannelClient
74
77
  if (dependencies.createCredentialManager) createCredentialManager = dependencies.createCredentialManager
@@ -79,13 +82,14 @@ export function resetChannelAuthCommandDependenciesForTesting(): void {
79
82
  createChannelClient = async (accountCookie: string, sessionCookie?: string): Promise<ChannelClientLike> =>
80
83
  new ChannelClient().login({ accountCookie, sessionCookie })
81
84
  createCredentialManager = (): ChannelCredentialManagerLike => new ChannelCredentialManager()
82
- createTokenExtractor = (): ChannelTokenExtractorLike => new ChannelTokenExtractor()
85
+ createTokenExtractor = (browserProfile?: string[]): ChannelTokenExtractorLike =>
86
+ new ChannelTokenExtractor(undefined, browserProfile)
83
87
  }
84
88
 
85
89
  export async function extractAction(options: ActionOptions = {}): Promise<ExtractResult | ErrorResult> {
86
90
  try {
87
91
  const credManager = options._credManager ?? createCredentialManager()
88
- const extractor = createTokenExtractor()
92
+ const extractor = createTokenExtractor(options.browserProfile)
89
93
  const extracted = await extractor.extract()
90
94
 
91
95
  if (extracted.length === 0) {
@@ -270,7 +274,13 @@ export function createAuthCommand(): Command {
270
274
  new Command('extract')
271
275
  .description('Extract cookies from Channel Talk desktop app or a supported Chromium browser')
272
276
  .option('--pretty', 'Pretty print JSON output')
273
- .action(async (opts: { pretty?: boolean }) => {
277
+ .option(
278
+ '--browser-profile <path>',
279
+ 'Additional Chromium profile/user-data directory to scan (repeatable, comma-separated supported)',
280
+ collectBrowserProfileOption,
281
+ [],
282
+ )
283
+ .action(async (opts: { pretty?: boolean; browserProfile?: string[] }) => {
274
284
  cliOutput(await extractAction(opts), opts.pretty)
275
285
  }),
276
286
  )
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockListBots = mock(() =>
4
4
  Promise.resolve([
@@ -35,7 +35,7 @@ describe('bot commands', () => {
35
35
  )
36
36
  })
37
37
 
38
- test('listAction lists bots', async () => {
38
+ it('listAction lists bots', async () => {
39
39
  const result = await listAction({ limit: '8' })
40
40
 
41
41
  expect(mockListBots).toHaveBeenCalledWith('ws-1', { limit: 8 })
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockListUserChats = mock(() =>
4
4
  Promise.resolve([
@@ -62,7 +62,7 @@ describe('chat commands', () => {
62
62
  )
63
63
  })
64
64
 
65
- test('listAction lists user chats with the requested state filter', async () => {
65
+ it('listAction lists user chats with the requested state filter', async () => {
66
66
  const result = await listAction({ state: 'closed', limit: '5' })
67
67
 
68
68
  expect(mockListUserChats).toHaveBeenCalledWith('ws-1', { state: 'closed', limit: 5 })
@@ -78,7 +78,7 @@ describe('chat commands', () => {
78
78
  ])
79
79
  })
80
80
 
81
- test('getAction gets a specific user chat', async () => {
81
+ it('getAction gets a specific user chat', async () => {
82
82
  const result = await getAction('chat-1')
83
83
 
84
84
  expect(mockGetUserChat).toHaveBeenCalledWith('ws-1', 'chat-1')
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockListGroups = mock(() =>
4
4
  Promise.resolve([
@@ -103,7 +103,7 @@ describe('group commands', () => {
103
103
  )
104
104
  })
105
105
 
106
- test('listAction lists groups', async () => {
106
+ it('listAction lists groups', async () => {
107
107
  const result = await listAction({ limit: '3' })
108
108
 
109
109
  expect(mockListGroups).toHaveBeenCalledWith('ws-1', { limit: 3 })
@@ -121,7 +121,7 @@ describe('group commands', () => {
121
121
  ])
122
122
  })
123
123
 
124
- test('getAction gets a specific group', async () => {
124
+ it('getAction gets a specific group', async () => {
125
125
  const result = await getAction('grp-1')
126
126
 
127
127
  expect(mockGetGroup).toHaveBeenCalledWith('ws-1', 'grp-1')
@@ -137,7 +137,7 @@ describe('group commands', () => {
137
137
  })
138
138
  })
139
139
 
140
- test('messagesAction gets group messages with limit and sort', async () => {
140
+ it('messagesAction gets group messages with limit and sort', async () => {
141
141
  const result = await messagesAction('grp-1', { limit: '7', sort: 'asc' })
142
142
 
143
143
  expect(mockGetGroupMessages).toHaveBeenCalledWith('ws-1', 'grp-1', { limit: 7, sortOrder: 'asc' })
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockListManagers = mock(() =>
4
4
  Promise.resolve([
@@ -43,7 +43,7 @@ describe('manager commands', () => {
43
43
  )
44
44
  })
45
45
 
46
- test('listAction lists managers', async () => {
46
+ it('listAction lists managers', async () => {
47
47
  const result = await listAction({ limit: '12' })
48
48
 
49
49
  expect(mockListManagers).toHaveBeenCalledWith('ws-1', { limit: 12 })
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockSendGroupMessage = mock(() =>
4
4
  Promise.resolve({
@@ -306,7 +306,7 @@ describe('message commands', () => {
306
306
  )
307
307
  })
308
308
 
309
- test('sendAction sends a group message with wrapped blocks', async () => {
309
+ it('sendAction sends a group message with wrapped blocks', async () => {
310
310
  const result = await sendAction('group', 'grp-1', 'Hello group')
311
311
 
312
312
  expect(mockSendGroupMessage).toHaveBeenCalledWith('ws-1', 'grp-1', [{ type: 'text', value: 'Hello group' }])
@@ -319,7 +319,7 @@ describe('message commands', () => {
319
319
  })
320
320
  })
321
321
 
322
- test('sendAction sends a user chat message with wrapped blocks', async () => {
322
+ it('sendAction sends a user chat message with wrapped blocks', async () => {
323
323
  const result = await sendAction('user-chat', 'chat-1', 'Hello user chat')
324
324
 
325
325
  expect(mockSendUserChatMessage).toHaveBeenCalledWith('ws-1', 'chat-1', [{ type: 'text', value: 'Hello user chat' }])
@@ -332,7 +332,7 @@ describe('message commands', () => {
332
332
  })
333
333
  })
334
334
 
335
- test('sendAction sends a direct chat message with wrapped blocks', async () => {
335
+ it('sendAction sends a direct chat message with wrapped blocks', async () => {
336
336
  const result = await sendAction('direct-chat', 'dm-1', 'Hello direct chat')
337
337
 
338
338
  expect(mockSendDirectChatMessage).toHaveBeenCalledWith('ws-1', 'dm-1', [
@@ -347,7 +347,7 @@ describe('message commands', () => {
347
347
  })
348
348
  })
349
349
 
350
- test('listAction lists group messages with limit and sort options', async () => {
350
+ it('listAction lists group messages with limit and sort options', async () => {
351
351
  const result = await listAction('group', 'grp-1', { limit: '10', sort: 'asc' })
352
352
 
353
353
  expect(mockGetGroupMessages).toHaveBeenCalledWith('ws-1', 'grp-1', { limit: 10, sortOrder: 'asc' })
@@ -365,7 +365,7 @@ describe('message commands', () => {
365
365
  ])
366
366
  })
367
367
 
368
- test('listAction lists user chat messages', async () => {
368
+ it('listAction lists user chat messages', async () => {
369
369
  const result = await listAction('user-chat', 'chat-1')
370
370
 
371
371
  expect(mockGetUserChatMessages).toHaveBeenCalledWith('ws-1', 'chat-1', { limit: 25, sortOrder: 'desc' })
@@ -376,7 +376,7 @@ describe('message commands', () => {
376
376
  })
377
377
  })
378
378
 
379
- test('listAction lists direct chat messages', async () => {
379
+ it('listAction lists direct chat messages', async () => {
380
380
  const result = await listAction('direct-chat', 'dm-1')
381
381
 
382
382
  expect(mockGetDirectChatMessages).toHaveBeenCalledWith('ws-1', 'dm-1', { limit: 25, sortOrder: 'desc' })
@@ -387,21 +387,21 @@ describe('message commands', () => {
387
387
  })
388
388
  })
389
389
 
390
- test('getAction returns specific message by ID', async () => {
390
+ it('getAction returns specific message by ID', async () => {
391
391
  const result = await getAction('group', 'grp-1', 'msg-group-list-1')
392
392
 
393
393
  expect(result.error).toBeUndefined()
394
394
  expect(result.id).toBe('msg-group-list-1')
395
395
  })
396
396
 
397
- test('getAction returns error when message not found', async () => {
397
+ it('getAction returns error when message not found', async () => {
398
398
  const result = await getAction('group', 'grp-1', 'nonexistent')
399
399
 
400
400
  expect(result.error).toBeDefined()
401
401
  expect(result.error).toContain('not found')
402
402
  })
403
403
 
404
- test('searchAction searches team chat messages by default', async () => {
404
+ it('searchAction searches team chat messages by default', async () => {
405
405
  const result = await searchAction('search')
406
406
 
407
407
  expect(mockSearchTeamChatMessages).toHaveBeenCalledWith('ws-1', 'search', { limit: undefined })
@@ -420,7 +420,7 @@ describe('message commands', () => {
420
420
  ])
421
421
  })
422
422
 
423
- test('searchAction searches user chat messages with scope option', async () => {
423
+ it('searchAction searches user chat messages with scope option', async () => {
424
424
  const result = await searchAction('search', { scope: 'user-chat' })
425
425
 
426
426
  expect(mockSearchUserChatMessages).toHaveBeenCalledWith('ws-1', 'search', { limit: undefined })
@@ -439,13 +439,13 @@ describe('message commands', () => {
439
439
  ])
440
440
  })
441
441
 
442
- test('searchAction passes limit parameter', async () => {
442
+ it('searchAction passes limit parameter', async () => {
443
443
  await searchAction('test', { limit: '5' })
444
444
 
445
445
  expect(mockSearchTeamChatMessages).toHaveBeenCalledWith('ws-1', 'test', { limit: 5 })
446
446
  })
447
447
 
448
- test('searchAction returns error on failure', async () => {
448
+ it('searchAction returns error on failure', async () => {
449
449
  mockSearchTeamChatMessages.mockImplementation(() => Promise.reject(new Error('Network error')))
450
450
 
451
451
  const result = await searchAction('test')
@@ -454,7 +454,7 @@ describe('message commands', () => {
454
454
  expect(result.results).toBeUndefined()
455
455
  })
456
456
 
457
- test('searchAction returns error for invalid scope', async () => {
457
+ it('searchAction returns error for invalid scope', async () => {
458
458
  const result = await searchAction('test', { scope: 'invalid' })
459
459
 
460
460
  expect(result.error).toContain('Invalid --scope value')
@@ -462,7 +462,7 @@ describe('message commands', () => {
462
462
  expect(result.results).toBeUndefined()
463
463
  })
464
464
 
465
- test('searchAction handles zero hits', async () => {
465
+ it('searchAction handles zero hits', async () => {
466
466
  mockSearchTeamChatMessages.mockImplementation(() =>
467
467
  Promise.resolve({ hits: [], bots: [], sessions: [], groups: [] }),
468
468
  )
@@ -473,7 +473,7 @@ describe('message commands', () => {
473
473
  expect(result.error).toBeUndefined()
474
474
  })
475
475
 
476
- test('searchAction handles missing highlight plainText key', async () => {
476
+ it('searchAction handles missing highlight plainText key', async () => {
477
477
  mockSearchTeamChatMessages.mockImplementation(() =>
478
478
  Promise.resolve({
479
479
  hits: [
@@ -506,7 +506,7 @@ describe('message commands', () => {
506
506
  expect(result.results?.[0]?.plain_text).toBe('some message')
507
507
  })
508
508
 
509
- test('searchAction uses extractText for block-only messages', async () => {
509
+ it('searchAction uses extractText for block-only messages', async () => {
510
510
  mockSearchTeamChatMessages.mockImplementation(() =>
511
511
  Promise.resolve({
512
512
  hits: [
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockGetChannel = mock(() => Promise.resolve({ id: 'ws-1', name: 'Workspace One' }))
4
4
  const mockListManagers = mock(() =>
@@ -81,7 +81,7 @@ describe('snapshot command', () => {
81
81
  mockListUserChats.mockClear()
82
82
  })
83
83
 
84
- test('brief snapshot returns workspace, groups (name only), chat counts, and hint', async () => {
84
+ it('brief snapshot returns workspace, groups (name only), chat counts, and hint', async () => {
85
85
  const result = await snapshotAction()
86
86
 
87
87
  expect(result.error).toBeUndefined()
@@ -100,7 +100,7 @@ describe('snapshot command', () => {
100
100
  expect(mockGetGroupMessages).not.toHaveBeenCalled()
101
101
  })
102
102
 
103
- test('brief groups-only returns group names without messages', async () => {
103
+ it('brief groups-only returns group names without messages', async () => {
104
104
  const result = await snapshotAction({ groupsOnly: true })
105
105
 
106
106
  expect(result.workspace).toEqual({ id: 'ws-1', name: 'Workspace One' })
@@ -112,7 +112,7 @@ describe('snapshot command', () => {
112
112
  expect(mockListUserChats).not.toHaveBeenCalled()
113
113
  })
114
114
 
115
- test('brief chats-only returns counts without recent details', async () => {
115
+ it('brief chats-only returns counts without recent details', async () => {
116
116
  const result = await snapshotAction({ chatsOnly: true })
117
117
 
118
118
  expect(result.workspace).toEqual({ id: 'ws-1', name: 'Workspace One' })
@@ -126,7 +126,7 @@ describe('snapshot command', () => {
126
126
  expect(mockGetGroupMessages).not.toHaveBeenCalled()
127
127
  })
128
128
 
129
- test('full snapshot returns workspace, managers, bots, groups, and user chats', async () => {
129
+ it('full snapshot returns workspace, managers, bots, groups, and user chats', async () => {
130
130
  const result = await snapshotAction({ full: true })
131
131
 
132
132
  expect(result.error).toBeUndefined()
@@ -201,7 +201,7 @@ describe('snapshot command', () => {
201
201
  })
202
202
  })
203
203
 
204
- test('full groups-only includes messages', async () => {
204
+ it('full groups-only includes messages', async () => {
205
205
  const result = await snapshotAction({ full: true, groupsOnly: true, limit: 3 })
206
206
 
207
207
  expect(mockGetGroupMessages).toHaveBeenCalledWith('ws-1', 'grp-1', { limit: 3, sortOrder: 'desc' })
@@ -214,7 +214,7 @@ describe('snapshot command', () => {
214
214
  })
215
215
  })
216
216
 
217
- test('full chats-only includes recent details', async () => {
217
+ it('full chats-only includes recent details', async () => {
218
218
  const result = await snapshotAction({ full: true, chatsOnly: true, limit: 1 })
219
219
 
220
220
  expect(result.workspace).toEqual({ id: 'ws-1', name: 'Workspace One' })
@@ -1,4 +1,4 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test'
1
+ import { beforeEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  const mockGetAccount = mock(() =>
4
4
  Promise.resolve({
@@ -37,7 +37,7 @@ describe('whoami command', () => {
37
37
  )
38
38
  })
39
39
 
40
- test('whoamiAction returns account info', async () => {
40
+ it('returns account info', async () => {
41
41
  const result = await whoamiAction({})
42
42
 
43
43
  expect(mockGetAccount).toHaveBeenCalled()
@@ -53,7 +53,7 @@ describe('whoami command', () => {
53
53
  expect(result.error).toBeUndefined()
54
54
  })
55
55
 
56
- test('whoamiAction returns error when getAccount fails', async () => {
56
+ it('returns error when getAccount fails', async () => {
57
57
  mockGetAccount.mockImplementation(() => Promise.reject(new Error('Not authenticated')))
58
58
 
59
59
  const result = await whoamiAction({})