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, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
  import type { Command } from 'commander'
@@ -55,7 +55,7 @@ describe('auth commands', () => {
55
55
  })
56
56
 
57
57
  describe('status', () => {
58
- test('outputs error and exits when no account found', async () => {
58
+ it('outputs error and exits when no account found', async () => {
59
59
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
60
60
 
61
61
  await expect(authCommand.parseAsync(['status'], { from: 'user' })).rejects.toThrow('process.exit called')
@@ -65,7 +65,7 @@ describe('auth commands', () => {
65
65
  expect(output.error).toContain('No Instagram account configured')
66
66
  })
67
67
 
68
- test('outputs account info when account exists', async () => {
68
+ it('outputs account info when account exists', async () => {
69
69
  mockGetAccount.mockImplementation(() =>
70
70
  Promise.resolve({
71
71
  account_id: 'user_testuser',
@@ -84,7 +84,7 @@ describe('auth commands', () => {
84
84
  expect(output.pk).toBe('12345')
85
85
  })
86
86
 
87
- test('outputs error for specific account not found', async () => {
87
+ it('outputs error for specific account not found', async () => {
88
88
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
89
89
 
90
90
  await expect(
@@ -97,7 +97,7 @@ describe('auth commands', () => {
97
97
  })
98
98
 
99
99
  describe('list', () => {
100
- test('outputs empty array when no accounts', async () => {
100
+ it('outputs empty array when no accounts', async () => {
101
101
  mockListAccounts.mockImplementation(() => Promise.resolve([]))
102
102
 
103
103
  await authCommand.parseAsync(['list'], { from: 'user' })
@@ -106,7 +106,7 @@ describe('auth commands', () => {
106
106
  expect(output).toEqual([])
107
107
  })
108
108
 
109
- test('outputs accounts list', async () => {
109
+ it('outputs accounts list', async () => {
110
110
  mockListAccounts.mockImplementation(() =>
111
111
  Promise.resolve([
112
112
  {
@@ -140,7 +140,7 @@ describe('auth commands', () => {
140
140
  })
141
141
 
142
142
  describe('use', () => {
143
- test('switches to specified account', async () => {
143
+ it('switches to specified account', async () => {
144
144
  mockSetCurrent.mockImplementation(() => Promise.resolve(true))
145
145
  mockGetAccount.mockImplementation(() =>
146
146
  Promise.resolve({
@@ -160,7 +160,7 @@ describe('auth commands', () => {
160
160
  expect(output.account_id).toBe('user_alice')
161
161
  })
162
162
 
163
- test('outputs error when account not found', async () => {
163
+ it('outputs error when account not found', async () => {
164
164
  mockSetCurrent.mockImplementation(() => Promise.resolve(false))
165
165
 
166
166
  await expect(authCommand.parseAsync(['use', 'missing_account'], { from: 'user' })).rejects.toThrow(
@@ -173,7 +173,7 @@ describe('auth commands', () => {
173
173
  })
174
174
 
175
175
  describe('logout', () => {
176
- test('removes account and outputs success', async () => {
176
+ it('removes account and outputs success', async () => {
177
177
  mockGetAccount.mockImplementation(() =>
178
178
  Promise.resolve({
179
179
  account_id: 'user_alice',
@@ -194,7 +194,7 @@ describe('auth commands', () => {
194
194
  expect(output.account_id).toBe('user_alice')
195
195
  })
196
196
 
197
- test('outputs error when no account configured', async () => {
197
+ it('outputs error when no account configured', async () => {
198
198
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
199
199
 
200
200
  await expect(authCommand.parseAsync(['logout'], { from: 'user' })).rejects.toThrow('process.exit called')
@@ -203,7 +203,7 @@ describe('auth commands', () => {
203
203
  expect(output.error).toContain('No Instagram account configured')
204
204
  })
205
205
 
206
- test('outputs error for specific account not found', async () => {
206
+ it('outputs error for specific account not found', async () => {
207
207
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
208
208
 
209
209
  await expect(
@@ -4,6 +4,7 @@ import { Writable } from 'node:stream'
4
4
 
5
5
  import { Command } from 'commander'
6
6
 
7
+ import { collectBrowserProfileOption } from '@/shared/chromium'
7
8
  import { handleError } from '@/shared/utils/error-handler'
8
9
  import { formatOutput } from '@/shared/utils/output'
9
10
  import { info, warn, error as stderrError, debug } from '@/shared/utils/stderr'
@@ -385,11 +386,12 @@ async function useAction(accountId: string, options: { pretty?: boolean }): Prom
385
386
  }
386
387
  }
387
388
 
388
- async function extractAction(options: { pretty?: boolean; debug?: boolean }): Promise<void> {
389
+ async function extractAction(options: { pretty?: boolean; debug?: boolean; browserProfile?: string[] }): Promise<void> {
389
390
  try {
390
391
  const extractor = new InstagramTokenExtractor(
391
392
  undefined,
392
393
  options.debug ? (msg) => debug(`[debug] ${msg}`) : undefined,
394
+ options.browserProfile,
393
395
  )
394
396
 
395
397
  if (options.debug) {
@@ -536,6 +538,12 @@ export const authCommand = new Command('auth')
536
538
  .description('Extract Instagram cookies from browser (Chrome, Edge, Arc, Brave)')
537
539
  .option('--pretty', 'Pretty print JSON output')
538
540
  .option('--debug', 'Show debug output')
541
+ .option(
542
+ '--browser-profile <path>',
543
+ 'Additional Chromium profile/user-data directory to scan (repeatable, comma-separated supported)',
544
+ collectBrowserProfileOption,
545
+ [],
546
+ )
539
547
  .action(extractAction),
540
548
  )
541
549
  .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
  const originalConsoleLog = console.log
4
4
  import type { Command } from 'commander'
@@ -67,7 +67,7 @@ describe('chat commands', () => {
67
67
  })
68
68
 
69
69
  describe('list', () => {
70
- test('lists DM conversations', async () => {
70
+ it('lists DM conversations', async () => {
71
71
  await expect(chatCommand.parseAsync(['list'], { from: 'user' })).rejects.toThrow('process.exit called')
72
72
 
73
73
  expect(processExitSpy).toHaveBeenCalledWith(0)
@@ -78,7 +78,7 @@ describe('chat commands', () => {
78
78
  expect(output[1].id).toBe('thread-2')
79
79
  })
80
80
 
81
- test('passes custom limit', async () => {
81
+ it('passes custom limit', async () => {
82
82
  await expect(chatCommand.parseAsync(['list', '--limit', '5'], { from: 'user' })).rejects.toThrow(
83
83
  'process.exit called',
84
84
  )
@@ -88,7 +88,7 @@ describe('chat commands', () => {
88
88
  })
89
89
 
90
90
  describe('search', () => {
91
- test('searches DM conversations by query', async () => {
91
+ it('searches DM conversations by query', async () => {
92
92
  await expect(chatCommand.parseAsync(['search', 'Alice'], { from: 'user' })).rejects.toThrow('process.exit called')
93
93
 
94
94
  expect(processExitSpy).toHaveBeenCalledWith(0)
@@ -98,7 +98,7 @@ describe('chat commands', () => {
98
98
  expect(output[0].id).toBe('thread-1')
99
99
  })
100
100
 
101
- test('passes custom limit to search', async () => {
101
+ it('passes custom limit to search', async () => {
102
102
  await expect(chatCommand.parseAsync(['search', 'Alice', '--limit', '10'], { from: 'user' })).rejects.toThrow(
103
103
  'process.exit called',
104
104
  )
@@ -106,7 +106,7 @@ describe('chat commands', () => {
106
106
  expect(mockSearchChats).toHaveBeenCalledWith('Alice', 10)
107
107
  })
108
108
 
109
- test('returns empty array when no results', async () => {
109
+ it('returns empty array when no results', async () => {
110
110
  mockSearchChats.mockImplementation(() => Promise.resolve([]))
111
111
 
112
112
  await expect(chatCommand.parseAsync(['search', 'nobody'], { from: 'user' })).rejects.toThrow(
@@ -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
  const originalConsoleLog = console.log
4
4
  import type { Command } from 'commander'
@@ -68,7 +68,7 @@ describe('message commands', () => {
68
68
  })
69
69
 
70
70
  describe('list', () => {
71
- test('lists messages from a thread', async () => {
71
+ it('lists messages from a thread', async () => {
72
72
  await expect(messageCommand.parseAsync(['list', 'thread-123'], { from: 'user' })).rejects.toThrow(
73
73
  'process.exit called',
74
74
  )
@@ -79,7 +79,7 @@ describe('message commands', () => {
79
79
  expect(output).toEqual([{ id: 'msg-1', text: 'Hello' }])
80
80
  })
81
81
 
82
- test('passes custom limit', async () => {
82
+ it('passes custom limit', async () => {
83
83
  await expect(
84
84
  messageCommand.parseAsync(['list', 'thread-123', '--limit', '10'], { from: 'user' }),
85
85
  ).rejects.toThrow('process.exit called')
@@ -89,7 +89,7 @@ describe('message commands', () => {
89
89
  })
90
90
 
91
91
  describe('send', () => {
92
- test('sends a message to a thread', async () => {
92
+ it('sends a message to a thread', async () => {
93
93
  await expect(messageCommand.parseAsync(['send', 'thread-123', 'Hello world'], { from: 'user' })).rejects.toThrow(
94
94
  'process.exit called',
95
95
  )
@@ -102,7 +102,7 @@ describe('message commands', () => {
102
102
  })
103
103
 
104
104
  describe('send-to', () => {
105
- test('sends a message to a user by username', async () => {
105
+ it('sends a message to a user by username', async () => {
106
106
  await expect(messageCommand.parseAsync(['send-to', 'targetuser', 'Hi there'], { from: 'user' })).rejects.toThrow(
107
107
  'process.exit called',
108
108
  )
@@ -114,7 +114,7 @@ describe('message commands', () => {
114
114
  expect(output).toEqual({ id: 'msg-3', text: 'Sent to user' })
115
115
  })
116
116
 
117
- test('strips @ prefix from username', async () => {
117
+ it('strips @ prefix from username', async () => {
118
118
  await expect(messageCommand.parseAsync(['send-to', '@targetuser', 'Hi there'], { from: 'user' })).rejects.toThrow(
119
119
  'process.exit called',
120
120
  )
@@ -122,7 +122,7 @@ describe('message commands', () => {
122
122
  expect(mockSearchUsers).toHaveBeenCalledWith('targetuser')
123
123
  })
124
124
 
125
- test('handles user not found error', async () => {
125
+ it('handles user not found error', async () => {
126
126
  mockSearchUsers.mockImplementation(() => Promise.resolve([]))
127
127
 
128
128
  try {
@@ -136,7 +136,7 @@ describe('message commands', () => {
136
136
  })
137
137
 
138
138
  describe('search', () => {
139
- test('searches messages by query', async () => {
139
+ it('searches messages by query', async () => {
140
140
  await expect(messageCommand.parseAsync(['search', 'hello'], { from: 'user' })).rejects.toThrow(
141
141
  'process.exit called',
142
142
  )
@@ -147,7 +147,7 @@ describe('message commands', () => {
147
147
  expect(output).toEqual([{ id: 'msg-4', text: 'Found' }])
148
148
  })
149
149
 
150
- test('passes thread option to search', async () => {
150
+ it('passes thread option to search', async () => {
151
151
  await expect(
152
152
  messageCommand.parseAsync(['search', 'hello', '--thread', 'thread-456'], { from: 'user' }),
153
153
  ).rejects.toThrow('process.exit called')
@@ -155,7 +155,7 @@ describe('message commands', () => {
155
155
  expect(mockSearchMessages).toHaveBeenCalledWith('hello', { threadId: 'thread-456', limit: 20 })
156
156
  })
157
157
 
158
- test('passes limit option to search', async () => {
158
+ it('passes limit option to search', async () => {
159
159
  await expect(messageCommand.parseAsync(['search', 'hello2', '--limit', '5'], { from: 'user' })).rejects.toThrow(
160
160
  'process.exit called',
161
161
  )
@@ -165,7 +165,7 @@ describe('message commands', () => {
165
165
  })
166
166
 
167
167
  describe('search-users', () => {
168
- test('searches users by query', async () => {
168
+ it('searches users by query', async () => {
169
169
  await expect(messageCommand.parseAsync(['search-users', 'target'], { from: 'user' })).rejects.toThrow(
170
170
  'process.exit called',
171
171
  )
@@ -1,51 +1,51 @@
1
- import { describe, expect, test } from 'bun:test'
1
+ import { describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { parseLimitOption } from '@/platforms/instagram/commands/shared'
4
4
  import { InstagramError } from '@/platforms/instagram/types'
5
5
 
6
6
  describe('parseLimitOption', () => {
7
- test('returns parsed integer for valid input', () => {
7
+ it('returns parsed integer for valid input', () => {
8
8
  expect(parseLimitOption('10', 20)).toBe(10)
9
9
  })
10
10
 
11
- test('returns default when undefined', () => {
11
+ it('returns default when undefined', () => {
12
12
  expect(parseLimitOption(undefined, 20)).toBe(20)
13
13
  })
14
14
 
15
- test('trims whitespace', () => {
15
+ it('trims whitespace', () => {
16
16
  expect(parseLimitOption(' 15 ', 20)).toBe(15)
17
17
  })
18
18
 
19
- test('throws InstagramError for non-numeric input', () => {
19
+ it('throws InstagramError for non-numeric input', () => {
20
20
  expect(() => parseLimitOption('abc', 20)).toThrow(InstagramError)
21
21
  })
22
22
 
23
- test('throws for zero', () => {
23
+ it('throws for zero', () => {
24
24
  expect(() => parseLimitOption('0', 20)).toThrow(InstagramError)
25
25
  })
26
26
 
27
- test('throws for negative numbers', () => {
27
+ it('throws for negative numbers', () => {
28
28
  expect(() => parseLimitOption('-5', 20)).toThrow(InstagramError)
29
29
  })
30
30
 
31
- test('throws for values exceeding default maxValue', () => {
31
+ it('throws for values exceeding default maxValue', () => {
32
32
  expect(() => parseLimitOption('101', 20)).toThrow(InstagramError)
33
33
  })
34
34
 
35
- test('respects custom maxValue', () => {
35
+ it('respects custom maxValue', () => {
36
36
  expect(parseLimitOption('50', 20, 50)).toBe(50)
37
37
  expect(() => parseLimitOption('51', 20, 50)).toThrow(InstagramError)
38
38
  })
39
39
 
40
- test('throws for decimal numbers', () => {
40
+ it('throws for decimal numbers', () => {
41
41
  expect(() => parseLimitOption('10.5', 20)).toThrow(InstagramError)
42
42
  })
43
43
 
44
- test('accepts boundary value 1', () => {
44
+ it('accepts boundary value 1', () => {
45
45
  expect(parseLimitOption('1', 20)).toBe(1)
46
46
  })
47
47
 
48
- test('accepts boundary value 100', () => {
48
+ it('accepts boundary value 100', () => {
49
49
  expect(parseLimitOption('100', 20)).toBe(100)
50
50
  })
51
51
  })
@@ -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
 
3
3
  import { InstagramClient } from '../client'
4
4
  import * as sharedModule from './shared'
@@ -29,7 +29,7 @@ describe('whoami command', () => {
29
29
  consoleLogSpy?.mockRestore()
30
30
  })
31
31
 
32
- test('outputs profile information', async () => {
32
+ it('outputs profile information', async () => {
33
33
  await whoamiAction({})
34
34
 
35
35
  expect(consoleLogSpy).toHaveBeenCalledTimes(1)
@@ -40,7 +40,7 @@ describe('whoami command', () => {
40
40
  expect(output.profile_pic_url).toBe('https://example.com/pic.jpg')
41
41
  })
42
42
 
43
- test('outputs profile with null optional fields', async () => {
43
+ it('outputs profile with null optional fields', async () => {
44
44
  getProfileSpy.mockResolvedValue({
45
45
  user_id: '987654321',
46
46
  username: 'testuser',
@@ -1,4 +1,4 @@
1
- import { afterAll, describe, expect, test } from 'bun:test'
1
+ import { afterAll, describe, expect, it } from 'bun:test'
2
2
  import { existsSync, rmSync } from 'node:fs'
3
3
  import { join } from 'node:path'
4
4
 
@@ -34,7 +34,7 @@ afterAll(() => {
34
34
 
35
35
  describe('InstagramCredentialManager', () => {
36
36
  describe('loadConfig', () => {
37
- test('returns default config when file does not exist', async () => {
37
+ it('returns default config when file does not exist', async () => {
38
38
  const manager = setup()
39
39
  const config = await manager.loadConfig()
40
40
 
@@ -43,7 +43,7 @@ describe('InstagramCredentialManager', () => {
43
43
  })
44
44
 
45
45
  describe('saveConfig', () => {
46
- test('creates file and can be re-read via loadConfig', async () => {
46
+ it('creates file and can be re-read via loadConfig', async () => {
47
47
  const manager = setup()
48
48
  const config = {
49
49
  current: 'test-account',
@@ -60,14 +60,14 @@ describe('InstagramCredentialManager', () => {
60
60
  })
61
61
 
62
62
  describe('getAccount', () => {
63
- test('returns null when no accounts exist', async () => {
63
+ it('returns null when no accounts exist', async () => {
64
64
  const manager = setup()
65
65
  const account = await manager.getAccount()
66
66
 
67
67
  expect(account).toBeNull()
68
68
  })
69
69
 
70
- test('returns null for specific accountId when no accounts exist', async () => {
70
+ it('returns null for specific accountId when no accounts exist', async () => {
71
71
  const manager = setup()
72
72
  const account = await manager.getAccount('nonexistent')
73
73
 
@@ -76,7 +76,7 @@ describe('InstagramCredentialManager', () => {
76
76
  })
77
77
 
78
78
  describe('setAccount', () => {
79
- test('round-trips: set then get returns same account', async () => {
79
+ it('round-trips: set then get returns same account', async () => {
80
80
  const manager = setup()
81
81
  const account = makeAccount()
82
82
 
@@ -86,7 +86,7 @@ describe('InstagramCredentialManager', () => {
86
86
  expect(retrieved).toEqual(account)
87
87
  })
88
88
 
89
- test('sets first account as current automatically', async () => {
89
+ it('sets first account as current automatically', async () => {
90
90
  const manager = setup()
91
91
  const account = makeAccount()
92
92
 
@@ -96,7 +96,7 @@ describe('InstagramCredentialManager', () => {
96
96
  expect(current).toEqual(account)
97
97
  })
98
98
 
99
- test('does not override current when it is already set', async () => {
99
+ it('does not override current when it is already set', async () => {
100
100
  const manager = setup()
101
101
  const first = makeAccount({ account_id: 'first-account' })
102
102
  const second = makeAccount({ account_id: 'second-account' })
@@ -108,7 +108,7 @@ describe('InstagramCredentialManager', () => {
108
108
  expect(current?.account_id).toBe('first-account')
109
109
  })
110
110
 
111
- test('getAccount with normalized ID lookup via createAccountId', async () => {
111
+ it('getAccount looks up account by normalized ID via createAccountId', async () => {
112
112
  const manager = setup()
113
113
  const account = makeAccount({ account_id: 'my-username' })
114
114
 
@@ -120,14 +120,14 @@ describe('InstagramCredentialManager', () => {
120
120
  })
121
121
 
122
122
  describe('listAccounts', () => {
123
- test('returns empty array when no accounts', async () => {
123
+ it('returns empty array when no accounts', async () => {
124
124
  const manager = setup()
125
125
  const accounts = await manager.listAccounts()
126
126
 
127
127
  expect(accounts).toEqual([])
128
128
  })
129
129
 
130
- test('returns all accounts with is_current flag', async () => {
130
+ it('returns all accounts with is_current flag', async () => {
131
131
  const manager = setup()
132
132
  const first = makeAccount({ account_id: 'first-account' })
133
133
  const second = makeAccount({ account_id: 'second-account' })
@@ -146,7 +146,7 @@ describe('InstagramCredentialManager', () => {
146
146
  })
147
147
 
148
148
  describe('setCurrent', () => {
149
- test('switches active account and returns true', async () => {
149
+ it('switches active account and returns true', async () => {
150
150
  const manager = setup()
151
151
  const first = makeAccount({ account_id: 'first-account' })
152
152
  const second = makeAccount({ account_id: 'second-account' })
@@ -161,7 +161,7 @@ describe('InstagramCredentialManager', () => {
161
161
  expect(current?.account_id).toBe('second-account')
162
162
  })
163
163
 
164
- test('returns false for non-existent account', async () => {
164
+ it('returns false for non-existent account', async () => {
165
165
  const manager = setup()
166
166
 
167
167
  const result = await manager.setCurrent('nonexistent')
@@ -171,7 +171,7 @@ describe('InstagramCredentialManager', () => {
171
171
  })
172
172
 
173
173
  describe('removeAccount', () => {
174
- test('removes account and adjusts current to next available', async () => {
174
+ it('removes account and adjusts current to next available', async () => {
175
175
  const manager = setup()
176
176
  const first = makeAccount({ account_id: 'first-account' })
177
177
  const second = makeAccount({ account_id: 'second-account' })
@@ -190,7 +190,7 @@ describe('InstagramCredentialManager', () => {
190
190
  expect(current?.account_id).toBe('second-account')
191
191
  })
192
192
 
193
- test('returns false for non-existent account', async () => {
193
+ it('returns false for non-existent account', async () => {
194
194
  const manager = setup()
195
195
 
196
196
  const result = await manager.removeAccount('nonexistent')
@@ -200,7 +200,7 @@ describe('InstagramCredentialManager', () => {
200
200
  })
201
201
 
202
202
  describe('clearCredentials', () => {
203
- test('removes credentials file when it exists', async () => {
203
+ it('removes credentials file when it exists', async () => {
204
204
  const manager = setup()
205
205
  const account = makeAccount()
206
206
  await manager.setAccount(account)
@@ -214,7 +214,7 @@ describe('InstagramCredentialManager', () => {
214
214
  expect(existsSync(credentialsPath)).toBe(false)
215
215
  })
216
216
 
217
- test('does not throw when credentials file does not exist', async () => {
217
+ it('does not throw when credentials file does not exist', async () => {
218
218
  const manager = setup()
219
219
 
220
220
  await expect(manager.clearCredentials()).resolves.toBeUndefined()
@@ -222,7 +222,7 @@ describe('InstagramCredentialManager', () => {
222
222
  })
223
223
 
224
224
  describe('getAccountPaths', () => {
225
- test('returns correct paths structure for account ID', async () => {
225
+ it('returns correct paths structure for account ID', async () => {
226
226
  const testConfigDir = join(
227
227
  import.meta.dir,
228
228
  `.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
@@ -236,7 +236,7 @@ describe('InstagramCredentialManager', () => {
236
236
  expect(paths.session_path).toBe(join(testConfigDir, 'instagram', 'test-account', 'session.json'))
237
237
  })
238
238
 
239
- test('normalizes account ID via createAccountId', async () => {
239
+ it('normalizes account ID via createAccountId', async () => {
240
240
  const testConfigDir = join(
241
241
  import.meta.dir,
242
242
  `.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
@@ -252,7 +252,7 @@ describe('InstagramCredentialManager', () => {
252
252
  })
253
253
 
254
254
  describe('ensureAccountPaths', () => {
255
- test('creates directories', async () => {
255
+ it('creates directories', async () => {
256
256
  const manager = setup()
257
257
 
258
258
  const paths = await manager.ensureAccountPaths('test-account')
@@ -260,7 +260,7 @@ describe('InstagramCredentialManager', () => {
260
260
  expect(existsSync(paths.account_dir)).toBe(true)
261
261
  })
262
262
 
263
- test('returns paths structure', async () => {
263
+ it('returns paths structure', async () => {
264
264
  const testConfigDir = join(
265
265
  import.meta.dir,
266
266
  `.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
@@ -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 fs from 'node:fs'
3
3
 
4
4
  import { InstagramCredentialManager } from '@/platforms/instagram/credential-manager'
@@ -46,7 +46,7 @@ afterEach(() => {
46
46
  })
47
47
 
48
48
  describe('ensureInstagramAuth', () => {
49
- test('exits with error when no account configured', async () => {
49
+ it('exits with error when no account configured', async () => {
50
50
  // given
51
51
  getAccountSpy.mockResolvedValue(null)
52
52
 
@@ -56,7 +56,7 @@ describe('ensureInstagramAuth', () => {
56
56
  expect(consoleSpy).toHaveBeenCalled()
57
57
  })
58
58
 
59
- test('exits with error when session file missing', async () => {
59
+ it('exits with error when session file missing', async () => {
60
60
  // given
61
61
  getAccountSpy.mockResolvedValue(validAccount)
62
62
  existsSyncSpy.mockReturnValue(false)
@@ -67,7 +67,7 @@ describe('ensureInstagramAuth', () => {
67
67
  expect(consoleSpy).toHaveBeenCalled()
68
68
  })
69
69
 
70
- test('succeeds when account and session file exist', async () => {
70
+ it('succeeds when account and session file exist', async () => {
71
71
  // given
72
72
  getAccountSpy.mockResolvedValue(validAccount)
73
73
  existsSyncSpy.mockReturnValue(true)
@@ -1,4 +1,4 @@
1
- import { expect, test } from 'bun:test'
1
+ import { expect, it } from 'bun:test'
2
2
 
3
3
  import {
4
4
  createAccountId,
@@ -11,34 +11,34 @@ import {
11
11
  InstagramListener,
12
12
  } from '@/platforms/instagram/index'
13
13
 
14
- test('InstagramClient is exported from barrel', () => {
14
+ it('InstagramClient is exported from barrel', () => {
15
15
  expect(typeof InstagramClient).toBe('function')
16
16
  })
17
17
 
18
- test('InstagramCredentialManager is exported from barrel', () => {
18
+ it('InstagramCredentialManager is exported from barrel', () => {
19
19
  expect(typeof InstagramCredentialManager).toBe('function')
20
20
  })
21
21
 
22
- test('InstagramListener is exported from barrel', () => {
22
+ it('InstagramListener is exported from barrel', () => {
23
23
  expect(typeof InstagramListener).toBe('function')
24
24
  })
25
25
 
26
- test('InstagramError is exported from barrel', () => {
26
+ it('InstagramError is exported from barrel', () => {
27
27
  expect(typeof InstagramError).toBe('function')
28
28
  })
29
29
 
30
- test('createAccountId is exported from barrel', () => {
30
+ it('createAccountId is exported from barrel', () => {
31
31
  expect(typeof createAccountId).toBe('function')
32
32
  })
33
33
 
34
- test('extractMediaUrl is exported from barrel', () => {
34
+ it('extractMediaUrl is exported from barrel', () => {
35
35
  expect(typeof extractMediaUrl).toBe('function')
36
36
  })
37
37
 
38
- test('extractMessageText is exported from barrel', () => {
38
+ it('extractMessageText is exported from barrel', () => {
39
39
  expect(typeof extractMessageText).toBe('function')
40
40
  })
41
41
 
42
- test('getMessageType is exported from barrel', () => {
42
+ it('getMessageType is exported from barrel', () => {
43
43
  expect(typeof getMessageType).toBe('function')
44
44
  })