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,43 +1,43 @@
1
- import { describe, expect, test } from 'bun:test'
1
+ import { describe, expect, it } from 'bun:test'
2
2
 
3
3
  import { LineClient } from './client'
4
4
  import { LineError } from './types'
5
5
  import type { LineChat, LineDevice, LineLoginResult, LineMessage, LineSendResult } from './types'
6
6
 
7
7
  describe('LineClient', () => {
8
- test('constructor creates instance without errors', () => {
8
+ it('constructor creates instance without errors', () => {
9
9
  const client = new LineClient()
10
10
  expect(client).toBeInstanceOf(LineClient)
11
11
  })
12
12
 
13
- test('constructor accepts a custom credential manager', () => {
13
+ it('constructor accepts a custom credential manager', () => {
14
14
  const { LineCredentialManager } = require('./credential-manager')
15
15
  const manager = new LineCredentialManager()
16
16
  const client = new LineClient(manager)
17
17
  expect(client).toBeInstanceOf(LineClient)
18
18
  })
19
19
 
20
- test('close() is idempotent - can be called multiple times without error', () => {
20
+ it('close() is idempotent - can be called multiple times without error', () => {
21
21
  const client = new LineClient()
22
22
  expect(() => client.close()).not.toThrow()
23
23
  expect(() => client.close()).not.toThrow()
24
24
  expect(() => client.close()).not.toThrow()
25
25
  })
26
26
 
27
- test('close() is idempotent after login attempt fails', async () => {
27
+ it('close() is idempotent after login attempt fails', async () => {
28
28
  const client = new LineClient()
29
29
  client.close()
30
30
  client.close()
31
31
  })
32
32
 
33
33
  describe('ensureClient throws when not logged in', () => {
34
- test('getChats() throws LineError with code not_connected', async () => {
34
+ it('getChats() throws LineError with code not_connected', async () => {
35
35
  const client = new LineClient()
36
36
  await expect(client.getChats()).rejects.toThrow(LineError)
37
37
  await expect(client.getChats()).rejects.toMatchObject({ code: 'not_connected' })
38
38
  })
39
39
 
40
- test('getMessages() throws LineError when not logged in', async () => {
40
+ it('getMessages() throws LineError when not logged in', async () => {
41
41
  const client = new LineClient()
42
42
  await expect(client.getMessages('chat123')).rejects.toThrow(LineError)
43
43
  await expect(client.getMessages('chat123')).rejects.toMatchObject({
@@ -45,7 +45,7 @@ describe('LineClient', () => {
45
45
  })
46
46
  })
47
47
 
48
- test('sendMessage() throws LineError when not logged in', async () => {
48
+ it('sendMessage() throws LineError when not logged in', async () => {
49
49
  const client = new LineClient()
50
50
  await expect(client.sendMessage('chat123', 'hello')).rejects.toThrow(LineError)
51
51
  await expect(client.sendMessage('chat123', 'hello')).rejects.toMatchObject({
@@ -55,7 +55,7 @@ describe('LineClient', () => {
55
55
  })
56
56
 
57
57
  describe('login() without credentials', () => {
58
- test('throws LineError when no saved credentials exist', async () => {
58
+ it('throws LineError when no saved credentials exist', async () => {
59
59
  const { LineCredentialManager } = require('./credential-manager')
60
60
  const { mkdtemp } = require('node:fs/promises')
61
61
  const { tmpdir } = require('node:os')
@@ -71,7 +71,7 @@ describe('LineClient', () => {
71
71
  })
72
72
 
73
73
  describe('LineError', () => {
74
- test('LineError has correct name, code, and message', () => {
74
+ it('LineError has correct name, code, and message', () => {
75
75
  const err = new LineError('test_code', 'test message')
76
76
  expect(err).toBeInstanceOf(Error)
77
77
  expect(err).toBeInstanceOf(LineError)
@@ -80,7 +80,7 @@ describe('LineClient', () => {
80
80
  expect(err.message).toBe('test message')
81
81
  })
82
82
 
83
- test('LineError is thrown by getChats and wraps the not_connected error', async () => {
83
+ it('LineError is thrown by getChats and wraps the not_connected error', async () => {
84
84
  const client = new LineClient()
85
85
  try {
86
86
  await client.getChats()
@@ -95,13 +95,13 @@ describe('LineClient', () => {
95
95
  })
96
96
 
97
97
  describe('default device detection', () => {
98
- test('LineClient can be instantiated (device detection does not throw)', () => {
98
+ it('LineClient can be instantiated (device detection does not throw)', () => {
99
99
  expect(() => new LineClient()).not.toThrow()
100
100
  })
101
101
  })
102
102
 
103
103
  describe('type exports', () => {
104
- test('LineChat type is correctly shaped', () => {
104
+ it('LineChat type is correctly shaped', () => {
105
105
  const chat: LineChat = {
106
106
  chat_id: 'c1234567890abcdef1234567890abcdef',
107
107
  type: 'group',
@@ -114,7 +114,7 @@ describe('LineClient', () => {
114
114
  expect(chat.member_count).toBe(5)
115
115
  })
116
116
 
117
- test('LineMessage type is correctly shaped', () => {
117
+ it('LineMessage type is correctly shaped', () => {
118
118
  const msg: LineMessage = {
119
119
  message_id: 'msg123',
120
120
  chat_id: 'chat456',
@@ -127,7 +127,7 @@ describe('LineClient', () => {
127
127
  expect(msg.text).toBe('Hello')
128
128
  })
129
129
 
130
- test('LineMessage text can be null', () => {
130
+ it('LineMessage text can be null', () => {
131
131
  const msg: LineMessage = {
132
132
  message_id: 'msg123',
133
133
  chat_id: 'chat456',
@@ -139,7 +139,7 @@ describe('LineClient', () => {
139
139
  expect(msg.text).toBeNull()
140
140
  })
141
141
 
142
- test('LineSendResult type is correctly shaped', () => {
142
+ it('LineSendResult type is correctly shaped', () => {
143
143
  const result: LineSendResult = {
144
144
  success: true,
145
145
  chat_id: 'chat456',
@@ -149,7 +149,7 @@ describe('LineClient', () => {
149
149
  expect(result.success).toBe(true)
150
150
  })
151
151
 
152
- test('LineLoginResult type is correctly shaped', () => {
152
+ it('LineLoginResult type is correctly shaped', () => {
153
153
  const result: LineLoginResult = {
154
154
  authenticated: true,
155
155
  account_id: 'u1234567890abcdef1234567890abcdef',
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -55,7 +55,7 @@ afterEach(() => {
55
55
  console.log = originalConsoleLog
56
56
  })
57
57
 
58
- test('status: outputs account info when account exists', async () => {
58
+ it('status: outputs account info when account exists', async () => {
59
59
  // when
60
60
  await authCommand.parseAsync(['node', 'auth', 'status'])
61
61
 
@@ -68,7 +68,7 @@ test('status: outputs account info when account exists', async () => {
68
68
  expect(output.device).toBe('ANDROIDSECONDARY')
69
69
  })
70
70
 
71
- test('status: outputs error when no account configured', async () => {
71
+ it('status: outputs error when no account configured', async () => {
72
72
  // given
73
73
  getAccountSpy.mockResolvedValue(null)
74
74
 
@@ -81,7 +81,7 @@ test('status: outputs error when no account configured', async () => {
81
81
  expect(output.error).toBe('No LINE account configured')
82
82
  })
83
83
 
84
- test('list: outputs all accounts', async () => {
84
+ it('list: outputs all accounts', async () => {
85
85
  // when
86
86
  await authCommand.parseAsync(['node', 'auth', 'list'])
87
87
 
@@ -94,7 +94,7 @@ test('list: outputs all accounts', async () => {
94
94
  expect(output[1].account_id).toBe('u456')
95
95
  })
96
96
 
97
- test('list: outputs empty array when no accounts', async () => {
97
+ it('list: outputs empty array when no accounts', async () => {
98
98
  // given
99
99
  listAccountsSpy.mockResolvedValue([])
100
100
 
@@ -106,7 +106,7 @@ test('list: outputs empty array when no accounts', async () => {
106
106
  expect(output).toHaveLength(0)
107
107
  })
108
108
 
109
- test('use: sets current account and outputs result', async () => {
109
+ it('use: sets current account and outputs result', async () => {
110
110
  // when
111
111
  await authCommand.parseAsync(['node', 'auth', 'use', 'u456'])
112
112
 
@@ -117,7 +117,7 @@ test('use: sets current account and outputs result', async () => {
117
117
  expect(output.current_account).toBe('u456')
118
118
  })
119
119
 
120
- test('logout: removes specific account when account-id provided', async () => {
120
+ it('logout: removes specific account when account-id provided', async () => {
121
121
  // when
122
122
  await authCommand.parseAsync(['node', 'auth', 'logout', 'u123'])
123
123
 
@@ -129,7 +129,7 @@ test('logout: removes specific account when account-id provided', async () => {
129
129
  expect(output.message).toContain('u123')
130
130
  })
131
131
 
132
- test('logout: clears all accounts when no account-id provided', async () => {
132
+ it('logout: clears all accounts when no account-id provided', async () => {
133
133
  // when
134
134
  await authCommand.parseAsync(['node', 'auth', 'logout'])
135
135
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -48,7 +48,7 @@ afterEach(() => {
48
48
  console.log = originalConsoleLog
49
49
  })
50
50
 
51
- test('list: fetches and outputs chats', async () => {
51
+ it('list: fetches and outputs chats', async () => {
52
52
  // when
53
53
  await chatCommand.parseAsync(['node', 'chat', 'list'])
54
54
 
@@ -62,7 +62,7 @@ test('list: fetches and outputs chats', async () => {
62
62
  expect(output[1].chat_id).toBe('c222')
63
63
  })
64
64
 
65
- test('list: uses default limit of 50 when no limit provided', async () => {
65
+ it('list: uses default limit of 50 when no limit provided', async () => {
66
66
  // when
67
67
  await chatCommand.parseAsync(['node', 'chat', 'list'])
68
68
 
@@ -70,7 +70,7 @@ test('list: uses default limit of 50 when no limit provided', async () => {
70
70
  expect(getChatsSpy).toHaveBeenCalledWith({ limit: 50 })
71
71
  })
72
72
 
73
- test('list: uses custom limit when --limit option provided', async () => {
73
+ it('list: uses custom limit when --limit option provided', async () => {
74
74
  // when
75
75
  await chatCommand.parseAsync(['node', 'chat', 'list', '--limit', '10'])
76
76
 
@@ -78,7 +78,7 @@ test('list: uses custom limit when --limit option provided', async () => {
78
78
  expect(getChatsSpy).toHaveBeenCalledWith({ limit: 10 })
79
79
  })
80
80
 
81
- test('list: closes client after fetching chats', async () => {
81
+ it('list: closes client after fetching chats', async () => {
82
82
  // when
83
83
  await chatCommand.parseAsync(['node', 'chat', 'list'])
84
84
 
@@ -86,7 +86,7 @@ test('list: closes client after fetching chats', async () => {
86
86
  expect(closeSpy).toHaveBeenCalledTimes(1)
87
87
  })
88
88
 
89
- test('list: outputs chat metadata', async () => {
89
+ it('list: outputs chat metadata', async () => {
90
90
  // when
91
91
  await chatCommand.parseAsync(['node', 'chat', 'list'])
92
92
 
@@ -98,7 +98,7 @@ test('list: outputs chat metadata', async () => {
98
98
  expect(chat.display_name).toBeDefined()
99
99
  })
100
100
 
101
- test('list: includes different chat types', async () => {
101
+ it('list: includes different chat types', async () => {
102
102
  // when
103
103
  await chatCommand.parseAsync(['node', 'chat', 'list'])
104
104
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -42,7 +42,7 @@ afterEach(() => {
42
42
  console.log = originalConsoleLog
43
43
  })
44
44
 
45
- test('list: fetches and outputs friends', async () => {
45
+ it('list: fetches and outputs friends', async () => {
46
46
  // when
47
47
  await friendCommand.parseAsync(['node', 'friend', 'list'])
48
48
 
@@ -56,7 +56,7 @@ test('list: fetches and outputs friends', async () => {
56
56
  expect(output[0].display_name).toBe('Alice')
57
57
  })
58
58
 
59
- test('list: outputs friends with metadata', async () => {
59
+ it('list: outputs friends with metadata', async () => {
60
60
  // when
61
61
  await friendCommand.parseAsync(['node', 'friend', 'list'])
62
62
 
@@ -67,7 +67,7 @@ test('list: outputs friends with metadata', async () => {
67
67
  expect(friend.display_name).toBeDefined()
68
68
  })
69
69
 
70
- test('list: closes client after fetching friends', async () => {
70
+ it('list: closes client after fetching friends', async () => {
71
71
  // when
72
72
  await friendCommand.parseAsync(['node', 'friend', 'list'])
73
73
 
@@ -75,7 +75,7 @@ test('list: closes client after fetching friends', async () => {
75
75
  expect(closeSpy).toHaveBeenCalledTimes(1)
76
76
  })
77
77
 
78
- test('list: outputs empty array when no friends', async () => {
78
+ it('list: outputs empty array when no friends', async () => {
79
79
  // given
80
80
  getFriendsSpy.mockResolvedValue([])
81
81
 
@@ -87,7 +87,7 @@ test('list: outputs empty array when no friends', async () => {
87
87
  expect(output).toHaveLength(0)
88
88
  })
89
89
 
90
- test('list: includes all friend fields', async () => {
90
+ it('list: includes all friend fields', async () => {
91
91
  // when
92
92
  await friendCommand.parseAsync(['node', 'friend', 'list'])
93
93
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -55,7 +55,7 @@ afterEach(() => {
55
55
  console.log = originalConsoleLog
56
56
  })
57
57
 
58
- test('list: fetches and outputs messages for a chat', async () => {
58
+ it('list: fetches and outputs messages for a chat', async () => {
59
59
  // when
60
60
  await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
61
61
 
@@ -69,7 +69,7 @@ test('list: fetches and outputs messages for a chat', async () => {
69
69
  expect(output[0].text).toBe('Hello world')
70
70
  })
71
71
 
72
- test('list: uses custom count when --count option provided', async () => {
72
+ it('list: uses custom count when --count option provided', async () => {
73
73
  // when
74
74
  await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1', '--count', '5'])
75
75
 
@@ -77,7 +77,7 @@ test('list: uses custom count when --count option provided', async () => {
77
77
  expect(getMessagesSpy).toHaveBeenCalledWith('chat-1', { count: 5 })
78
78
  })
79
79
 
80
- test('list: closes client after fetching messages', async () => {
80
+ it('list: closes client after fetching messages', async () => {
81
81
  // when
82
82
  await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
83
83
 
@@ -85,7 +85,7 @@ test('list: closes client after fetching messages', async () => {
85
85
  expect(closeSpy).toHaveBeenCalledTimes(1)
86
86
  })
87
87
 
88
- test('send: sends message and outputs result', async () => {
88
+ it('send: sends message and outputs result', async () => {
89
89
  // when
90
90
  await messageCommand.parseAsync(['node', 'message', 'send', 'chat-1', 'Hello!'])
91
91
 
@@ -98,7 +98,7 @@ test('send: sends message and outputs result', async () => {
98
98
  expect(output.message_id).toBe('msg-new')
99
99
  })
100
100
 
101
- test('send: closes client after sending message', async () => {
101
+ it('send: closes client after sending message', async () => {
102
102
  // when
103
103
  await messageCommand.parseAsync(['node', 'message', 'send', 'chat-1', 'Hello!'])
104
104
 
@@ -106,7 +106,7 @@ test('send: closes client after sending message', async () => {
106
106
  expect(closeSpy).toHaveBeenCalledTimes(1)
107
107
  })
108
108
 
109
- test('list: outputs messages with metadata', async () => {
109
+ it('list: outputs messages with metadata', async () => {
110
110
  // when
111
111
  await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
112
112
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -34,7 +34,7 @@ afterEach(() => {
34
34
  console.log = originalConsoleLog
35
35
  })
36
36
 
37
- test('whoami: fetches and outputs profile', async () => {
37
+ it('whoami: fetches and outputs profile', async () => {
38
38
  // when
39
39
  await whoamiCommand.parseAsync(['node', 'whoami'])
40
40
 
@@ -47,7 +47,7 @@ test('whoami: fetches and outputs profile', async () => {
47
47
  expect(output.display_name).toBe('Test User')
48
48
  })
49
49
 
50
- test('whoami: outputs profile with all fields', async () => {
50
+ it('whoami: outputs profile with all fields', async () => {
51
51
  // when
52
52
  await whoamiCommand.parseAsync(['node', 'whoami'])
53
53
 
@@ -59,7 +59,7 @@ test('whoami: outputs profile with all fields', async () => {
59
59
  expect(output.status_message).toBeDefined()
60
60
  })
61
61
 
62
- test('whoami: closes client after fetching profile', async () => {
62
+ it('whoami: closes client after fetching profile', async () => {
63
63
  // when
64
64
  await whoamiCommand.parseAsync(['node', 'whoami'])
65
65
 
@@ -67,7 +67,7 @@ test('whoami: closes client after fetching profile', async () => {
67
67
  expect(closeSpy).toHaveBeenCalledTimes(1)
68
68
  })
69
69
 
70
- test('whoami: outputs profile with picture_url', async () => {
70
+ it('whoami: outputs profile with picture_url', async () => {
71
71
  // when
72
72
  await whoamiCommand.parseAsync(['node', 'whoami'])
73
73
 
@@ -76,7 +76,7 @@ test('whoami: outputs profile with picture_url', async () => {
76
76
  expect(output.picture_url).toBe('https://example.com/pic.jpg')
77
77
  })
78
78
 
79
- test('whoami: outputs profile with status_message', async () => {
79
+ it('whoami: outputs profile with status_message', async () => {
80
80
  // when
81
81
  await whoamiCommand.parseAsync(['node', 'whoami'])
82
82
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
2
2
  import { mkdir, rm, stat } from 'node:fs/promises'
3
3
  import { tmpdir } from 'node:os'
4
4
  import { join } from 'node:path'
@@ -29,12 +29,12 @@ afterEach(async () => {
29
29
  })
30
30
 
31
31
  describe('LineCredentialManager', () => {
32
- test('load returns default config when file does not exist', async () => {
32
+ it('load returns default config when file does not exist', async () => {
33
33
  const config = await manager.load()
34
34
  expect(config).toEqual({ current_account: null, accounts: {} })
35
35
  })
36
36
 
37
- test('save and load round trip', async () => {
37
+ it('saves and loads in a round trip', async () => {
38
38
  const account = makeAccount('alice')
39
39
  const config = { current_account: 'alice', accounts: { alice: account } }
40
40
 
@@ -44,14 +44,14 @@ describe('LineCredentialManager', () => {
44
44
  expect(loaded).toEqual(config)
45
45
  })
46
46
 
47
- test('file is created with 0o600 permissions', async () => {
47
+ it('file is created with 0o600 permissions', async () => {
48
48
  await manager.save({ current_account: null, accounts: {} })
49
49
  const fileStat = await stat(join(tempDir, 'line-credentials.json'))
50
50
  // Check owner read/write only (0o600)
51
51
  expect(fileStat.mode & 0o777).toBe(0o600)
52
52
  })
53
53
 
54
- test('setAccount adds account and sets as current if first', async () => {
54
+ it('setAccount adds account and sets as current if first', async () => {
55
55
  const account = makeAccount('alice')
56
56
  await manager.setAccount(account)
57
57
 
@@ -60,7 +60,7 @@ describe('LineCredentialManager', () => {
60
60
  expect(loaded.current_account).toBe('alice')
61
61
  })
62
62
 
63
- test('setAccount does not change current if already set', async () => {
63
+ it('setAccount does not change current if already set', async () => {
64
64
  await manager.setAccount(makeAccount('alice'))
65
65
  await manager.setAccount(makeAccount('bob'))
66
66
 
@@ -68,12 +68,12 @@ describe('LineCredentialManager', () => {
68
68
  expect(loaded.current_account).toBe('alice')
69
69
  })
70
70
 
71
- test('getAccount returns null when no accounts', async () => {
71
+ it('getAccount returns null when no accounts', async () => {
72
72
  const result = await manager.getAccount()
73
73
  expect(result).toBeNull()
74
74
  })
75
75
 
76
- test('getAccount returns current account when no id given', async () => {
76
+ it('getAccount returns current account when no id given', async () => {
77
77
  const account = makeAccount('alice')
78
78
  await manager.setAccount(account)
79
79
 
@@ -81,7 +81,7 @@ describe('LineCredentialManager', () => {
81
81
  expect(result).toEqual(account)
82
82
  })
83
83
 
84
- test('getAccount returns account by id', async () => {
84
+ it('getAccount returns account by id', async () => {
85
85
  await manager.setAccount(makeAccount('alice'))
86
86
  const bob = makeAccount('bob')
87
87
  await manager.setAccount(bob)
@@ -90,13 +90,13 @@ describe('LineCredentialManager', () => {
90
90
  expect(result).toEqual(bob)
91
91
  })
92
92
 
93
- test('getAccount returns null for unknown id', async () => {
93
+ it('getAccount returns null for unknown id', async () => {
94
94
  await manager.setAccount(makeAccount('alice'))
95
95
  const result = await manager.getAccount('unknown')
96
96
  expect(result).toBeNull()
97
97
  })
98
98
 
99
- test('removeAccount removes the account', async () => {
99
+ it('removeAccount removes the account', async () => {
100
100
  await manager.setAccount(makeAccount('alice'))
101
101
  await manager.removeAccount('alice')
102
102
 
@@ -104,7 +104,7 @@ describe('LineCredentialManager', () => {
104
104
  expect(loaded.accounts['alice']).toBeUndefined()
105
105
  })
106
106
 
107
- test('removeAccount clears current if it was active', async () => {
107
+ it('removeAccount clears current if it was active', async () => {
108
108
  await manager.setAccount(makeAccount('alice'))
109
109
  await manager.removeAccount('alice')
110
110
 
@@ -112,7 +112,7 @@ describe('LineCredentialManager', () => {
112
112
  expect(loaded.current_account).toBeNull()
113
113
  })
114
114
 
115
- test('removeAccount sets next account as current when active is removed', async () => {
115
+ it('removeAccount sets next account as current when active is removed', async () => {
116
116
  await manager.setAccount(makeAccount('alice'))
117
117
  await manager.setAccount(makeAccount('bob'))
118
118
  await manager.removeAccount('alice')
@@ -121,7 +121,7 @@ describe('LineCredentialManager', () => {
121
121
  expect(loaded.current_account).toBe('bob')
122
122
  })
123
123
 
124
- test('setCurrentAccount updates current account', async () => {
124
+ it('setCurrentAccount updates current account', async () => {
125
125
  await manager.setAccount(makeAccount('alice'))
126
126
  await manager.setAccount(makeAccount('bob'))
127
127
  await manager.setCurrentAccount('bob')
@@ -130,7 +130,7 @@ describe('LineCredentialManager', () => {
130
130
  expect(loaded.current_account).toBe('bob')
131
131
  })
132
132
 
133
- test('listAccounts returns correct format', async () => {
133
+ it('listAccounts returns correct format', async () => {
134
134
  await manager.setAccount(makeAccount('alice'))
135
135
  await manager.setAccount(makeAccount('bob'))
136
136
 
@@ -148,7 +148,7 @@ describe('LineCredentialManager', () => {
148
148
  expect(bob?.is_current).toBe(false)
149
149
  })
150
150
 
151
- test('clearAll removes the credentials file', async () => {
151
+ it('clearAll removes the credentials file', async () => {
152
152
  await manager.setAccount(makeAccount('alice'))
153
153
  await manager.clearAll()
154
154
 
@@ -156,7 +156,7 @@ describe('LineCredentialManager', () => {
156
156
  expect(config).toEqual({ current_account: null, accounts: {} })
157
157
  })
158
158
 
159
- test('clearAll does not throw if file does not exist', async () => {
159
+ it('clearAll does not throw if file does not exist', async () => {
160
160
  await expect(manager.clearAll()).resolves.toBeUndefined()
161
161
  })
162
162
  })
@@ -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
  CredentialManager,
@@ -12,38 +12,38 @@ import {
12
12
  LineSendResultSchema,
13
13
  } from '@/platforms/line/index'
14
14
 
15
- test('LineClient is exported from barrel', () => {
15
+ it('LineClient is exported from barrel', () => {
16
16
  expect(typeof LineClient).toBe('function')
17
17
  })
18
18
 
19
- test('LineError is exported from barrel', () => {
19
+ it('LineError is exported from barrel', () => {
20
20
  expect(typeof LineError).toBe('function')
21
21
  })
22
22
 
23
- test('CredentialManager is exported from barrel', () => {
23
+ it('CredentialManager is exported from barrel', () => {
24
24
  expect(typeof CredentialManager).toBe('function')
25
25
  })
26
26
 
27
- test('LineCredentialManager is exported from barrel', () => {
27
+ it('LineCredentialManager is exported from barrel', () => {
28
28
  expect(typeof LineCredentialManager).toBe('function')
29
29
  })
30
30
 
31
- test('LineChatSchema is exported from barrel', () => {
31
+ it('LineChatSchema is exported from barrel', () => {
32
32
  expect(typeof LineChatSchema.parse).toBe('function')
33
33
  })
34
34
 
35
- test('LineMessageSchema is exported from barrel', () => {
35
+ it('LineMessageSchema is exported from barrel', () => {
36
36
  expect(typeof LineMessageSchema.parse).toBe('function')
37
37
  })
38
38
 
39
- test('LineSendResultSchema is exported from barrel', () => {
39
+ it('LineSendResultSchema is exported from barrel', () => {
40
40
  expect(typeof LineSendResultSchema.parse).toBe('function')
41
41
  })
42
42
 
43
- test('LineAccountCredentialsSchema is exported from barrel', () => {
43
+ it('LineAccountCredentialsSchema is exported from barrel', () => {
44
44
  expect(typeof LineAccountCredentialsSchema.parse).toBe('function')
45
45
  })
46
46
 
47
- test('LineConfigSchema is exported from barrel', () => {
47
+ it('LineConfigSchema is exported from barrel', () => {
48
48
  expect(typeof LineConfigSchema.parse).toBe('function')
49
49
  })