agent-messenger 2.7.0 → 2.8.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 (511) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.github/workflows/ci.yml +6 -0
  3. package/.oxfmtrc.json +13 -1
  4. package/.oxlintrc.json +10 -1
  5. package/README.md +1 -1
  6. package/dist/package.json +59 -58
  7. package/dist/src/platforms/channeltalk/client.d.ts.map +1 -1
  8. package/dist/src/platforms/channeltalk/client.js +2 -2
  9. package/dist/src/platforms/channeltalk/client.js.map +1 -1
  10. package/dist/src/platforms/channeltalk/commands/auth.d.ts.map +1 -1
  11. package/dist/src/platforms/channeltalk/commands/auth.js.map +1 -1
  12. package/dist/src/platforms/channeltalk/commands/message.d.ts.map +1 -1
  13. package/dist/src/platforms/channeltalk/commands/message.js.map +1 -1
  14. package/dist/src/platforms/channeltalk/commands/snapshot.d.ts.map +1 -1
  15. package/dist/src/platforms/channeltalk/commands/snapshot.js.map +1 -1
  16. package/dist/src/platforms/channeltalk/ensure-auth.d.ts.map +1 -1
  17. package/dist/src/platforms/channeltalk/ensure-auth.js.map +1 -1
  18. package/dist/src/platforms/channeltalk/token-extractor.d.ts +9 -23
  19. package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
  20. package/dist/src/platforms/channeltalk/token-extractor.js +109 -341
  21. package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
  22. package/dist/src/platforms/channeltalkbot/client.d.ts +1 -1
  23. package/dist/src/platforms/channeltalkbot/client.d.ts.map +1 -1
  24. package/dist/src/platforms/channeltalkbot/client.js +4 -4
  25. package/dist/src/platforms/channeltalkbot/client.js.map +1 -1
  26. package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
  27. package/dist/src/platforms/channeltalkbot/commands/auth.js +4 -1
  28. package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
  29. package/dist/src/platforms/channeltalkbot/commands/shared.d.ts.map +1 -1
  30. package/dist/src/platforms/channeltalkbot/commands/shared.js.map +1 -1
  31. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  32. package/dist/src/platforms/discord/commands/whoami.d.ts.map +1 -1
  33. package/dist/src/platforms/discord/commands/whoami.js.map +1 -1
  34. package/dist/src/platforms/discord/token-extractor.d.ts +2 -10
  35. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  36. package/dist/src/platforms/discord/token-extractor.js +38 -172
  37. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  38. package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
  39. package/dist/src/platforms/discordbot/client.js.map +1 -1
  40. package/dist/src/platforms/instagram/cli.d.ts.map +1 -1
  41. package/dist/src/platforms/instagram/cli.js +1 -4
  42. package/dist/src/platforms/instagram/cli.js.map +1 -1
  43. package/dist/src/platforms/instagram/client.d.ts.map +1 -1
  44. package/dist/src/platforms/instagram/client.js +8 -7
  45. package/dist/src/platforms/instagram/client.js.map +1 -1
  46. package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
  47. package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
  48. package/dist/src/platforms/instagram/commands/chat.d.ts.map +1 -1
  49. package/dist/src/platforms/instagram/commands/chat.js.map +1 -1
  50. package/dist/src/platforms/instagram/commands/message.d.ts.map +1 -1
  51. package/dist/src/platforms/instagram/commands/message.js.map +1 -1
  52. package/dist/src/platforms/instagram/commands/shared.d.ts.map +1 -1
  53. package/dist/src/platforms/instagram/commands/shared.js.map +1 -1
  54. package/dist/src/platforms/instagram/credential-manager.d.ts.map +1 -1
  55. package/dist/src/platforms/instagram/credential-manager.js +1 -1
  56. package/dist/src/platforms/instagram/credential-manager.js.map +1 -1
  57. package/dist/src/platforms/instagram/ensure-auth.d.ts.map +1 -1
  58. package/dist/src/platforms/instagram/ensure-auth.js.map +1 -1
  59. package/dist/src/platforms/instagram/token-extractor.d.ts +7 -19
  60. package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
  61. package/dist/src/platforms/instagram/token-extractor.js +44 -270
  62. package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
  63. package/dist/src/platforms/instagram/types.d.ts.map +1 -1
  64. package/dist/src/platforms/instagram/types.js +4 -2
  65. package/dist/src/platforms/instagram/types.js.map +1 -1
  66. package/dist/src/platforms/kakaotalk/auth/kakao-login.d.ts.map +1 -1
  67. package/dist/src/platforms/kakaotalk/auth/kakao-login.js +18 -4
  68. package/dist/src/platforms/kakaotalk/auth/kakao-login.js.map +1 -1
  69. package/dist/src/platforms/kakaotalk/client.d.ts.map +1 -1
  70. package/dist/src/platforms/kakaotalk/client.js +3 -3
  71. package/dist/src/platforms/kakaotalk/client.js.map +1 -1
  72. package/dist/src/platforms/kakaotalk/commands/auth.d.ts.map +1 -1
  73. package/dist/src/platforms/kakaotalk/commands/auth.js +15 -9
  74. package/dist/src/platforms/kakaotalk/commands/auth.js.map +1 -1
  75. package/dist/src/platforms/kakaotalk/commands/shared.d.ts.map +1 -1
  76. package/dist/src/platforms/kakaotalk/commands/shared.js.map +1 -1
  77. package/dist/src/platforms/kakaotalk/protocol/connection.d.ts.map +1 -1
  78. package/dist/src/platforms/kakaotalk/protocol/connection.js.map +1 -1
  79. package/dist/src/platforms/kakaotalk/protocol/crypto.js +1 -1
  80. package/dist/src/platforms/kakaotalk/protocol/crypto.js.map +1 -1
  81. package/dist/src/platforms/kakaotalk/protocol/session.d.ts.map +1 -1
  82. package/dist/src/platforms/kakaotalk/protocol/session.js +1 -3
  83. package/dist/src/platforms/kakaotalk/protocol/session.js.map +1 -1
  84. package/dist/src/platforms/kakaotalk/token-extractor.js +5 -2
  85. package/dist/src/platforms/kakaotalk/token-extractor.js.map +1 -1
  86. package/dist/src/platforms/kakaotalk/types.d.ts.map +1 -1
  87. package/dist/src/platforms/kakaotalk/types.js +4 -2
  88. package/dist/src/platforms/kakaotalk/types.js.map +1 -1
  89. package/dist/src/platforms/line/cli.d.ts.map +1 -1
  90. package/dist/src/platforms/line/cli.js +1 -4
  91. package/dist/src/platforms/line/cli.js.map +1 -1
  92. package/dist/src/platforms/line/client.d.ts.map +1 -1
  93. package/dist/src/platforms/line/client.js +5 -13
  94. package/dist/src/platforms/line/client.js.map +1 -1
  95. package/dist/src/platforms/line/commands/chat.d.ts.map +1 -1
  96. package/dist/src/platforms/line/commands/chat.js.map +1 -1
  97. package/dist/src/platforms/line/commands/message.d.ts.map +1 -1
  98. package/dist/src/platforms/line/commands/message.js.map +1 -1
  99. package/dist/src/platforms/line/listener.js +1 -1
  100. package/dist/src/platforms/line/listener.js.map +1 -1
  101. package/dist/src/platforms/slack/cli.d.ts.map +1 -1
  102. package/dist/src/platforms/slack/cli.js.map +1 -1
  103. package/dist/src/platforms/slack/client-mappers.d.ts +14 -0
  104. package/dist/src/platforms/slack/client-mappers.d.ts.map +1 -0
  105. package/dist/src/platforms/slack/client-mappers.js +245 -0
  106. package/dist/src/platforms/slack/client-mappers.js.map +1 -0
  107. package/dist/src/platforms/slack/client.d.ts +0 -1
  108. package/dist/src/platforms/slack/client.d.ts.map +1 -1
  109. package/dist/src/platforms/slack/client.js +41 -455
  110. package/dist/src/platforms/slack/client.js.map +1 -1
  111. package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -1
  112. package/dist/src/platforms/slack/commands/channel.js.map +1 -1
  113. package/dist/src/platforms/slack/commands/emoji.d.ts.map +1 -1
  114. package/dist/src/platforms/slack/commands/emoji.js +1 -3
  115. package/dist/src/platforms/slack/commands/emoji.js.map +1 -1
  116. package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
  117. package/dist/src/platforms/slack/commands/message.js.map +1 -1
  118. package/dist/src/platforms/slack/commands/reminder.d.ts.map +1 -1
  119. package/dist/src/platforms/slack/commands/reminder.js.map +1 -1
  120. package/dist/src/platforms/slack/commands/user.d.ts.map +1 -1
  121. package/dist/src/platforms/slack/commands/user.js.map +1 -1
  122. package/dist/src/platforms/slack/commands/usergroup.d.ts.map +1 -1
  123. package/dist/src/platforms/slack/commands/usergroup.js.map +1 -1
  124. package/dist/src/platforms/slack/commands/whoami.d.ts.map +1 -1
  125. package/dist/src/platforms/slack/commands/whoami.js.map +1 -1
  126. package/dist/src/platforms/slack/token-extractor.d.ts +2 -6
  127. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  128. package/dist/src/platforms/slack/token-extractor.js +35 -229
  129. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  130. package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
  131. package/dist/src/platforms/slackbot/cli.js +1 -1
  132. package/dist/src/platforms/slackbot/cli.js.map +1 -1
  133. package/dist/src/platforms/teams/client.d.ts.map +1 -1
  134. package/dist/src/platforms/teams/client.js +1 -1
  135. package/dist/src/platforms/teams/client.js.map +1 -1
  136. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  137. package/dist/src/platforms/teams/commands/auth.js +4 -1
  138. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  139. package/dist/src/platforms/teams/commands/whoami.d.ts.map +1 -1
  140. package/dist/src/platforms/teams/commands/whoami.js.map +1 -1
  141. package/dist/src/platforms/teams/token-extractor.d.ts +6 -18
  142. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  143. package/dist/src/platforms/teams/token-extractor.js +71 -324
  144. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  145. package/dist/src/platforms/telegram/cli.d.ts.map +1 -1
  146. package/dist/src/platforms/telegram/cli.js +1 -4
  147. package/dist/src/platforms/telegram/cli.js.map +1 -1
  148. package/dist/src/platforms/telegram/client.d.ts.map +1 -1
  149. package/dist/src/platforms/telegram/client.js.map +1 -1
  150. package/dist/src/platforms/telegram/commands/auth.d.ts.map +1 -1
  151. package/dist/src/platforms/telegram/commands/auth.js +1 -1
  152. package/dist/src/platforms/telegram/commands/auth.js.map +1 -1
  153. package/dist/src/platforms/telegram/commands/chat.d.ts.map +1 -1
  154. package/dist/src/platforms/telegram/commands/chat.js.map +1 -1
  155. package/dist/src/platforms/telegram/commands/message.d.ts.map +1 -1
  156. package/dist/src/platforms/telegram/commands/message.js.map +1 -1
  157. package/dist/src/platforms/telegram/commands/whoami.js +1 -1
  158. package/dist/src/platforms/telegram/commands/whoami.js.map +1 -1
  159. package/dist/src/platforms/telegram/credential-manager.d.ts.map +1 -1
  160. package/dist/src/platforms/telegram/credential-manager.js +6 -2
  161. package/dist/src/platforms/telegram/credential-manager.js.map +1 -1
  162. package/dist/src/platforms/telegram/my-telegram-org.js.map +1 -1
  163. package/dist/src/platforms/webex/cli.d.ts.map +1 -1
  164. package/dist/src/platforms/webex/cli.js +1 -4
  165. package/dist/src/platforms/webex/cli.js.map +1 -1
  166. package/dist/src/platforms/webex/client.d.ts.map +1 -1
  167. package/dist/src/platforms/webex/client.js +3 -7
  168. package/dist/src/platforms/webex/client.js.map +1 -1
  169. package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
  170. package/dist/src/platforms/webex/commands/auth.js +1 -3
  171. package/dist/src/platforms/webex/commands/auth.js.map +1 -1
  172. package/dist/src/platforms/webex/commands/member.d.ts.map +1 -1
  173. package/dist/src/platforms/webex/commands/member.js +1 -3
  174. package/dist/src/platforms/webex/commands/member.js.map +1 -1
  175. package/dist/src/platforms/webex/commands/message.d.ts.map +1 -1
  176. package/dist/src/platforms/webex/commands/message.js.map +1 -1
  177. package/dist/src/platforms/webex/commands/snapshot.d.ts.map +1 -1
  178. package/dist/src/platforms/webex/commands/snapshot.js.map +1 -1
  179. package/dist/src/platforms/webex/commands/space.d.ts.map +1 -1
  180. package/dist/src/platforms/webex/commands/space.js.map +1 -1
  181. package/dist/src/platforms/webex/commands/whoami.d.ts.map +1 -1
  182. package/dist/src/platforms/webex/commands/whoami.js.map +1 -1
  183. package/dist/src/platforms/webex/credential-manager.d.ts.map +1 -1
  184. package/dist/src/platforms/webex/credential-manager.js.map +1 -1
  185. package/dist/src/platforms/webex/ensure-auth.d.ts.map +1 -1
  186. package/dist/src/platforms/webex/ensure-auth.js +1 -3
  187. package/dist/src/platforms/webex/ensure-auth.js.map +1 -1
  188. package/dist/src/platforms/webex/index.d.ts +1 -1
  189. package/dist/src/platforms/webex/index.d.ts.map +1 -1
  190. package/dist/src/platforms/webex/index.js.map +1 -1
  191. package/dist/src/platforms/webex/markdown-to-html.js.map +1 -1
  192. package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
  193. package/dist/src/platforms/webex/token-extractor.js +5 -14
  194. package/dist/src/platforms/webex/token-extractor.js.map +1 -1
  195. package/dist/src/platforms/wechatbot/client.d.ts.map +1 -1
  196. package/dist/src/platforms/wechatbot/client.js.map +1 -1
  197. package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
  198. package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
  199. package/dist/src/platforms/whatsapp/cli.d.ts.map +1 -1
  200. package/dist/src/platforms/whatsapp/cli.js +1 -4
  201. package/dist/src/platforms/whatsapp/cli.js.map +1 -1
  202. package/dist/src/platforms/whatsapp/commands/chat.d.ts.map +1 -1
  203. package/dist/src/platforms/whatsapp/commands/chat.js.map +1 -1
  204. package/dist/src/platforms/whatsapp/commands/message.d.ts.map +1 -1
  205. package/dist/src/platforms/whatsapp/commands/message.js.map +1 -1
  206. package/dist/src/platforms/whatsapp/commands/shared.d.ts.map +1 -1
  207. package/dist/src/platforms/whatsapp/commands/shared.js.map +1 -1
  208. package/dist/src/platforms/whatsapp/credential-manager.d.ts.map +1 -1
  209. package/dist/src/platforms/whatsapp/credential-manager.js +1 -1
  210. package/dist/src/platforms/whatsapp/credential-manager.js.map +1 -1
  211. package/dist/src/platforms/whatsapp/ensure-auth.d.ts.map +1 -1
  212. package/dist/src/platforms/whatsapp/ensure-auth.js.map +1 -1
  213. package/dist/src/platforms/whatsappbot/client.d.ts.map +1 -1
  214. package/dist/src/platforms/whatsappbot/client.js +2 -2
  215. package/dist/src/platforms/whatsappbot/client.js.map +1 -1
  216. package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
  217. package/dist/src/platforms/whatsappbot/commands/auth.js +4 -1
  218. package/dist/src/platforms/whatsappbot/commands/auth.js.map +1 -1
  219. package/dist/src/platforms/whatsappbot/commands/message.d.ts.map +1 -1
  220. package/dist/src/platforms/whatsappbot/commands/message.js.map +1 -1
  221. package/dist/src/platforms/whatsappbot/commands/shared.d.ts.map +1 -1
  222. package/dist/src/platforms/whatsappbot/commands/shared.js.map +1 -1
  223. package/dist/src/shared/chromium/browsers.d.ts +7 -0
  224. package/dist/src/shared/chromium/browsers.d.ts.map +1 -0
  225. package/dist/src/shared/chromium/browsers.js +89 -0
  226. package/dist/src/shared/chromium/browsers.js.map +1 -0
  227. package/dist/src/shared/chromium/cookie-reader.d.ts +20 -0
  228. package/dist/src/shared/chromium/cookie-reader.d.ts.map +1 -0
  229. package/dist/src/shared/chromium/cookie-reader.js +99 -0
  230. package/dist/src/shared/chromium/cookie-reader.js.map +1 -0
  231. package/dist/src/shared/chromium/decryptor.d.ts +42 -0
  232. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -0
  233. package/dist/src/shared/chromium/decryptor.js +205 -0
  234. package/dist/src/shared/chromium/decryptor.js.map +1 -0
  235. package/dist/src/shared/chromium/index.d.ts +6 -0
  236. package/dist/src/shared/chromium/index.d.ts.map +1 -0
  237. package/dist/src/shared/chromium/index.js +4 -0
  238. package/dist/src/shared/chromium/index.js.map +1 -0
  239. package/dist/src/shared/chromium/types.d.ts +11 -0
  240. package/dist/src/shared/chromium/types.d.ts.map +1 -0
  241. package/dist/src/shared/chromium/types.js +2 -0
  242. package/dist/src/shared/chromium/types.js.map +1 -0
  243. package/dist/src/shared/utils/derived-key-cache.d.ts +1 -1
  244. package/dist/src/shared/utils/derived-key-cache.d.ts.map +1 -1
  245. package/dist/src/shared/utils/linux-keyring.js +4 -1
  246. package/dist/src/shared/utils/linux-keyring.js.map +1 -1
  247. package/dist/src/tui/adapters/kakaotalk-adapter.d.ts.map +1 -1
  248. package/dist/src/tui/adapters/kakaotalk-adapter.js +6 -1
  249. package/dist/src/tui/adapters/kakaotalk-adapter.js.map +1 -1
  250. package/dist/src/tui/adapters/telegram-adapter.js +1 -1
  251. package/dist/src/tui/adapters/telegram-adapter.js.map +1 -1
  252. package/dist/src/tui/adapters/webex-adapter.js +1 -1
  253. package/dist/src/tui/adapters/webex-adapter.js.map +1 -1
  254. package/dist/src/tui/app.d.ts.map +1 -1
  255. package/dist/src/tui/app.js +112 -23
  256. package/dist/src/tui/app.js.map +1 -1
  257. package/dist/src/tui/utils.d.ts.map +1 -1
  258. package/dist/src/tui/utils.js +11 -13
  259. package/dist/src/tui/utils.js.map +1 -1
  260. package/dist/src/tui/views/channel-picker.d.ts.map +1 -1
  261. package/dist/src/tui/views/channel-picker.js.map +1 -1
  262. package/dist/src/tui/views/workspace-picker.d.ts.map +1 -1
  263. package/dist/src/tui/views/workspace-picker.js.map +1 -1
  264. package/docs/content/docs/cli/channeltalk.mdx +24 -22
  265. package/docs/content/docs/cli/channeltalkbot.mdx +7 -7
  266. package/docs/content/docs/cli/instagram.mdx +4 -4
  267. package/docs/content/docs/cli/kakaotalk.mdx +9 -8
  268. package/docs/content/docs/cli/line.mdx +14 -14
  269. package/docs/content/docs/cli/webex.mdx +19 -19
  270. package/docs/content/docs/cli/wechatbot.mdx +12 -11
  271. package/docs/content/docs/cli/whatsapp.mdx +5 -4
  272. package/docs/content/docs/cli/whatsappbot.mdx +11 -11
  273. package/docs/content/docs/index.mdx +7 -7
  274. package/docs/content/docs/meta.json +1 -9
  275. package/docs/content/docs/sdk/channeltalk.mdx +5 -6
  276. package/docs/content/docs/sdk/channeltalkbot.mdx +6 -12
  277. package/docs/content/docs/sdk/discord.mdx +36 -43
  278. package/docs/content/docs/sdk/instagram.mdx +18 -18
  279. package/docs/content/docs/sdk/kakaotalk.mdx +27 -18
  280. package/docs/content/docs/sdk/line.mdx +8 -13
  281. package/docs/content/docs/sdk/meta.json +14 -1
  282. package/docs/content/docs/sdk/slack.mdx +36 -42
  283. package/docs/content/docs/sdk/teams.mdx +2 -8
  284. package/docs/content/docs/sdk/webex.mdx +2 -12
  285. package/docs/content/docs/sdk/wechatbot.mdx +1 -5
  286. package/docs/content/docs/sdk/whatsapp.mdx +10 -19
  287. package/docs/content/docs/sdk/whatsappbot.mdx +2 -10
  288. package/docs/content/docs/tui.mdx +23 -23
  289. package/docs/src/app/page.tsx +353 -108
  290. package/e2e/channeltalkbot.e2e.test.ts +1 -5
  291. package/e2e/config.ts +6 -2
  292. package/package.json +59 -58
  293. package/scripts/prepublish.ts +1 -3
  294. package/skills/agent-channeltalk/SKILL.md +1 -1
  295. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  296. package/skills/agent-discord/SKILL.md +1 -1
  297. package/skills/agent-discordbot/SKILL.md +1 -1
  298. package/skills/agent-instagram/SKILL.md +1 -1
  299. package/skills/agent-kakaotalk/SKILL.md +1 -1
  300. package/skills/agent-line/SKILL.md +1 -1
  301. package/skills/agent-slack/SKILL.md +1 -1
  302. package/skills/agent-slackbot/SKILL.md +1 -1
  303. package/skills/agent-teams/SKILL.md +1 -1
  304. package/skills/agent-telegram/SKILL.md +1 -1
  305. package/skills/agent-webex/SKILL.md +1 -1
  306. package/skills/agent-wechatbot/SKILL.md +1 -1
  307. package/skills/agent-whatsapp/SKILL.md +1 -1
  308. package/skills/agent-whatsappbot/SKILL.md +1 -1
  309. package/src/platforms/channeltalk/client.test.ts +116 -29
  310. package/src/platforms/channeltalk/client.ts +26 -6
  311. package/src/platforms/channeltalk/commands/auth.test.ts +5 -5
  312. package/src/platforms/channeltalk/commands/auth.ts +19 -5
  313. package/src/platforms/channeltalk/commands/message.test.ts +2 -6
  314. package/src/platforms/channeltalk/commands/message.ts +5 -1
  315. package/src/platforms/channeltalk/commands/snapshot.test.ts +19 -4
  316. package/src/platforms/channeltalk/commands/snapshot.ts +5 -1
  317. package/src/platforms/channeltalk/ensure-auth.test.ts +20 -17
  318. package/src/platforms/channeltalk/ensure-auth.ts +6 -7
  319. package/src/platforms/channeltalk/index.ts +0 -1
  320. package/src/platforms/channeltalk/token-extractor.test.ts +33 -25
  321. package/src/platforms/channeltalk/token-extractor.ts +120 -372
  322. package/src/platforms/channeltalkbot/client.test.ts +1 -3
  323. package/src/platforms/channeltalkbot/client.ts +39 -13
  324. package/src/platforms/channeltalkbot/commands/auth.test.ts +3 -1
  325. package/src/platforms/channeltalkbot/commands/auth.ts +4 -1
  326. package/src/platforms/channeltalkbot/commands/bot.test.ts +13 -5
  327. package/src/platforms/channeltalkbot/commands/message.test.ts +12 -6
  328. package/src/platforms/channeltalkbot/commands/shared.ts +6 -2
  329. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +17 -5
  330. package/src/platforms/channeltalkbot/credential-manager.test.ts +1 -1
  331. package/src/platforms/channeltalkbot/index.test.ts +0 -2
  332. package/src/platforms/channeltalkbot/index.ts +0 -1
  333. package/src/platforms/discord/commands/auth.test.ts +6 -4
  334. package/src/platforms/discord/commands/auth.ts +14 -14
  335. package/src/platforms/discord/commands/whoami.test.ts +2 -4
  336. package/src/platforms/discord/commands/whoami.ts +2 -0
  337. package/src/platforms/discord/ensure-auth.test.ts +5 -3
  338. package/src/platforms/discord/index.ts +0 -1
  339. package/src/platforms/discord/listener.test.ts +7 -1
  340. package/src/platforms/discord/token-extractor.test.ts +18 -12
  341. package/src/platforms/discord/token-extractor.ts +46 -190
  342. package/src/platforms/discordbot/client.ts +1 -4
  343. package/src/platforms/discordbot/commands/auth.test.ts +3 -1
  344. package/src/platforms/discordbot/commands/channel.test.ts +3 -1
  345. package/src/platforms/discordbot/commands/message.test.ts +3 -1
  346. package/src/platforms/discordbot/commands/server.test.ts +3 -1
  347. package/src/platforms/discordbot/commands/snapshot.test.ts +3 -1
  348. package/src/platforms/discordbot/commands/thread.test.ts +3 -1
  349. package/src/platforms/discordbot/commands/user.test.ts +3 -1
  350. package/src/platforms/instagram/cli.ts +1 -4
  351. package/src/platforms/instagram/client.test.ts +3 -8
  352. package/src/platforms/instagram/client.ts +39 -34
  353. package/src/platforms/instagram/commands/auth.test.ts +13 -12
  354. package/src/platforms/instagram/commands/auth.ts +136 -71
  355. package/src/platforms/instagram/commands/chat.test.ts +21 -24
  356. package/src/platforms/instagram/commands/chat.ts +2 -0
  357. package/src/platforms/instagram/commands/message.test.ts +29 -24
  358. package/src/platforms/instagram/commands/message.ts +3 -4
  359. package/src/platforms/instagram/commands/shared.ts +2 -5
  360. package/src/platforms/instagram/commands/whoami.test.ts +4 -6
  361. package/src/platforms/instagram/credential-manager.ts +2 -6
  362. package/src/platforms/instagram/ensure-auth.test.ts +1 -4
  363. package/src/platforms/instagram/ensure-auth.ts +6 -3
  364. package/src/platforms/instagram/listener.test.ts +7 -3
  365. package/src/platforms/instagram/token-extractor.test.ts +4 -16
  366. package/src/platforms/instagram/token-extractor.ts +55 -309
  367. package/src/platforms/instagram/types.test.ts +2 -6
  368. package/src/platforms/instagram/types.ts +4 -2
  369. package/src/platforms/kakaotalk/auth/kakao-login.ts +30 -8
  370. package/src/platforms/kakaotalk/client.test.ts +37 -25
  371. package/src/platforms/kakaotalk/client.ts +23 -12
  372. package/src/platforms/kakaotalk/commands/auth.test.ts +6 -18
  373. package/src/platforms/kakaotalk/commands/auth.ts +101 -47
  374. package/src/platforms/kakaotalk/commands/chat.test.ts +8 -11
  375. package/src/platforms/kakaotalk/commands/message.test.ts +15 -24
  376. package/src/platforms/kakaotalk/commands/shared.ts +1 -0
  377. package/src/platforms/kakaotalk/commands/whoami.test.ts +6 -10
  378. package/src/platforms/kakaotalk/credential-manager.test.ts +1 -4
  379. package/src/platforms/kakaotalk/index.test.ts +1 -0
  380. package/src/platforms/kakaotalk/index.ts +0 -2
  381. package/src/platforms/kakaotalk/listener.test.ts +7 -1
  382. package/src/platforms/kakaotalk/protocol/connection.ts +4 -1
  383. package/src/platforms/kakaotalk/protocol/crypto.ts +1 -1
  384. package/src/platforms/kakaotalk/protocol/session.ts +12 -6
  385. package/src/platforms/kakaotalk/token-extractor.ts +5 -5
  386. package/src/platforms/kakaotalk/types.ts +8 -7
  387. package/src/platforms/line/cli.ts +1 -4
  388. package/src/platforms/line/client.ts +12 -20
  389. package/src/platforms/line/commands/auth.test.ts +2 -1
  390. package/src/platforms/line/commands/chat.test.ts +2 -1
  391. package/src/platforms/line/commands/chat.ts +1 -4
  392. package/src/platforms/line/commands/friend.test.ts +2 -1
  393. package/src/platforms/line/commands/message.test.ts +2 -1
  394. package/src/platforms/line/commands/message.ts +2 -9
  395. package/src/platforms/line/commands/whoami.test.ts +2 -1
  396. package/src/platforms/line/credential-manager.test.ts +1 -2
  397. package/src/platforms/line/index.test.ts +1 -0
  398. package/src/platforms/line/listener.ts +1 -1
  399. package/src/platforms/line/types.test.ts +1 -0
  400. package/src/platforms/slack/cli.ts +3 -1
  401. package/src/platforms/slack/client-mappers.ts +297 -0
  402. package/src/platforms/slack/client.test.ts +532 -17
  403. package/src/platforms/slack/client.ts +69 -458
  404. package/src/platforms/slack/commands/channel.ts +1 -4
  405. package/src/platforms/slack/commands/emoji.test.ts +6 -4
  406. package/src/platforms/slack/commands/emoji.ts +20 -22
  407. package/src/platforms/slack/commands/message.ts +6 -1
  408. package/src/platforms/slack/commands/pin.test.ts +14 -12
  409. package/src/platforms/slack/commands/reminder.ts +7 -6
  410. package/src/platforms/slack/commands/user.ts +6 -1
  411. package/src/platforms/slack/commands/usergroup.test.ts +3 -3
  412. package/src/platforms/slack/commands/usergroup.ts +10 -7
  413. package/src/platforms/slack/commands/whoami.test.ts +1 -1
  414. package/src/platforms/slack/commands/whoami.ts +2 -0
  415. package/src/platforms/slack/index.ts +0 -2
  416. package/src/platforms/slack/listener.test.ts +1 -0
  417. package/src/platforms/slack/token-extractor.test.ts +7 -12
  418. package/src/platforms/slack/token-extractor.ts +47 -255
  419. package/src/platforms/slackbot/cli.ts +8 -1
  420. package/src/platforms/slackbot/commands/auth.test.ts +3 -1
  421. package/src/platforms/teams/client.ts +1 -1
  422. package/src/platforms/teams/commands/auth.test.ts +1 -1
  423. package/src/platforms/teams/commands/auth.ts +4 -1
  424. package/src/platforms/teams/commands/whoami.test.ts +2 -4
  425. package/src/platforms/teams/commands/whoami.ts +2 -0
  426. package/src/platforms/teams/index.ts +0 -1
  427. package/src/platforms/teams/token-extractor.ts +82 -350
  428. package/src/platforms/telegram/app-config.test.ts +1 -0
  429. package/src/platforms/telegram/chat-utils.test.ts +5 -1
  430. package/src/platforms/telegram/cli.ts +2 -4
  431. package/src/platforms/telegram/client.test.ts +16 -3
  432. package/src/platforms/telegram/client.ts +14 -4
  433. package/src/platforms/telegram/commands/auth.test.ts +1 -0
  434. package/src/platforms/telegram/commands/auth.ts +3 -4
  435. package/src/platforms/telegram/commands/chat.test.ts +2 -5
  436. package/src/platforms/telegram/commands/chat.ts +1 -0
  437. package/src/platforms/telegram/commands/message.test.ts +2 -5
  438. package/src/platforms/telegram/commands/message.ts +1 -0
  439. package/src/platforms/telegram/commands/shared.test.ts +1 -0
  440. package/src/platforms/telegram/commands/whoami.test.ts +5 -7
  441. package/src/platforms/telegram/commands/whoami.ts +1 -1
  442. package/src/platforms/telegram/credential-manager.test.ts +1 -0
  443. package/src/platforms/telegram/credential-manager.ts +11 -2
  444. package/src/platforms/telegram/my-telegram-org.ts +6 -2
  445. package/src/platforms/telegram/types.test.ts +1 -0
  446. package/src/platforms/webex/app-config.test.ts +1 -0
  447. package/src/platforms/webex/cli.ts +1 -4
  448. package/src/platforms/webex/client.test.ts +4 -12
  449. package/src/platforms/webex/client.ts +14 -52
  450. package/src/platforms/webex/commands/auth.test.ts +7 -1
  451. package/src/platforms/webex/commands/auth.ts +12 -15
  452. package/src/platforms/webex/commands/member.test.ts +1 -3
  453. package/src/platforms/webex/commands/member.ts +14 -19
  454. package/src/platforms/webex/commands/message.ts +4 -15
  455. package/src/platforms/webex/commands/snapshot.test.ts +28 -3
  456. package/src/platforms/webex/commands/snapshot.ts +3 -3
  457. package/src/platforms/webex/commands/space.test.ts +3 -3
  458. package/src/platforms/webex/commands/space.ts +2 -9
  459. package/src/platforms/webex/commands/whoami.test.ts +12 -5
  460. package/src/platforms/webex/commands/whoami.ts +2 -0
  461. package/src/platforms/webex/credential-manager.ts +11 -2
  462. package/src/platforms/webex/ensure-auth.ts +1 -3
  463. package/src/platforms/webex/index.ts +1 -7
  464. package/src/platforms/webex/markdown-to-html.test.ts +6 -18
  465. package/src/platforms/webex/markdown-to-html.ts +8 -8
  466. package/src/platforms/webex/token-extractor.ts +6 -29
  467. package/src/platforms/wechatbot/client.test.ts +6 -2
  468. package/src/platforms/wechatbot/client.ts +6 -1
  469. package/src/platforms/wechatbot/commands/auth.test.ts +3 -7
  470. package/src/platforms/wechatbot/commands/message.test.ts +1 -4
  471. package/src/platforms/wechatbot/commands/message.ts +5 -1
  472. package/src/platforms/wechatbot/commands/template.test.ts +1 -4
  473. package/src/platforms/wechatbot/commands/user.test.ts +2 -7
  474. package/src/platforms/whatsapp/cli.ts +1 -4
  475. package/src/platforms/whatsapp/commands/auth.test.ts +19 -22
  476. package/src/platforms/whatsapp/commands/chat.test.ts +21 -24
  477. package/src/platforms/whatsapp/commands/chat.ts +2 -0
  478. package/src/platforms/whatsapp/commands/message.test.ts +22 -24
  479. package/src/platforms/whatsapp/commands/message.ts +3 -5
  480. package/src/platforms/whatsapp/commands/shared.ts +2 -5
  481. package/src/platforms/whatsapp/commands/whoami.test.ts +2 -2
  482. package/src/platforms/whatsapp/credential-manager.ts +2 -6
  483. package/src/platforms/whatsapp/ensure-auth.test.ts +1 -4
  484. package/src/platforms/whatsapp/ensure-auth.ts +14 -6
  485. package/src/platforms/whatsapp/index.ts +0 -2
  486. package/src/platforms/whatsappbot/client.test.ts +13 -7
  487. package/src/platforms/whatsappbot/client.ts +18 -4
  488. package/src/platforms/whatsappbot/commands/auth.ts +4 -1
  489. package/src/platforms/whatsappbot/commands/message.test.ts +12 -2
  490. package/src/platforms/whatsappbot/commands/message.ts +16 -3
  491. package/src/platforms/whatsappbot/commands/shared.ts +3 -1
  492. package/src/platforms/whatsappbot/commands/whoami.test.ts +1 -3
  493. package/src/platforms/whatsappbot/index.ts +0 -2
  494. package/src/shared/chromium/browsers.test.ts +274 -0
  495. package/src/shared/chromium/browsers.ts +86 -0
  496. package/src/shared/chromium/cookie-reader.test.ts +274 -0
  497. package/src/shared/chromium/cookie-reader.ts +111 -0
  498. package/src/shared/chromium/decryptor.test.ts +449 -0
  499. package/src/shared/chromium/decryptor.ts +227 -0
  500. package/src/shared/chromium/index.ts +11 -0
  501. package/src/shared/chromium/types.ts +11 -0
  502. package/src/shared/utils/derived-key-cache.ts +1 -1
  503. package/src/shared/utils/linux-keyring.ts +4 -4
  504. package/src/tui/adapters/kakaotalk-adapter.ts +6 -1
  505. package/src/tui/adapters/telegram-adapter.ts +1 -1
  506. package/src/tui/adapters/webex-adapter.ts +1 -1
  507. package/src/tui/app.ts +149 -59
  508. package/src/tui/utils.test.ts +144 -145
  509. package/src/tui/utils.ts +27 -29
  510. package/src/tui/views/channel-picker.ts +1 -1
  511. package/src/tui/views/workspace-picker.ts +1 -1
@@ -3,7 +3,9 @@ import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:
3
3
  const originalConsoleLog = console.log
4
4
 
5
5
  mock.module('@/shared/utils/error-handler', () => ({
6
- handleError: (err: Error) => { throw err },
6
+ handleError: (err: Error) => {
7
+ throw err
8
+ },
7
9
  }))
8
10
 
9
11
  const mockGetAccount = mock(() => Promise.resolve(null))
@@ -27,7 +29,9 @@ mock.module('../credential-manager', () => ({
27
29
  const mockConnect = mock(() => Promise.resolve())
28
30
  const mockClose = mock(() => Promise.resolve())
29
31
  const mockGetSocket = mock(() => null)
30
- const mockLogin = mock(function (this: unknown) { return Promise.resolve(this) })
32
+ const mockLogin = mock(function (this: unknown) {
33
+ return Promise.resolve(this)
34
+ })
31
35
 
32
36
  mock.module('../client', () => ({
33
37
  WhatsAppClient: class {
@@ -63,9 +67,12 @@ describe('auth commands', () => {
63
67
  mockConnect.mockImplementation(() => Promise.resolve())
64
68
  mockClose.mockImplementation(() => Promise.resolve())
65
69
  mockGetSocket.mockImplementation(() => null)
66
- mockLogin.mockImplementation(function (this: unknown) { return Promise.resolve(this) })
70
+ mockLogin.mockImplementation(function (this: unknown) {
71
+ return Promise.resolve(this)
72
+ })
67
73
 
68
- consoleLogSpy = mock((..._args: unknown[]) => {}); console.log = consoleLogSpy
74
+ consoleLogSpy = mock((..._args: unknown[]) => {})
75
+ console.log = consoleLogSpy
69
76
  processExitSpy = spyOn(process, 'exit').mockImplementation((_code?: number) => {
70
77
  throw new Error(`process.exit(${_code})`)
71
78
  })
@@ -146,9 +153,7 @@ describe('auth commands', () => {
146
153
  test('outputs error and exits when account not found', async () => {
147
154
  mockSetCurrent.mockImplementation(() => Promise.resolve(false))
148
155
 
149
- await expect(
150
- authCommand.parseAsync(['use', 'nonexistent'], { from: 'user' }),
151
- ).rejects.toThrow('process.exit(1)')
156
+ await expect(authCommand.parseAsync(['use', 'nonexistent'], { from: 'user' })).rejects.toThrow('process.exit(1)')
152
157
 
153
158
  expect(processExitSpy).toHaveBeenCalledWith(1)
154
159
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -180,9 +185,7 @@ describe('auth commands', () => {
180
185
  test('outputs error and exits when no account configured', async () => {
181
186
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
182
187
 
183
- await expect(
184
- authCommand.parseAsync(['status'], { from: 'user' }),
185
- ).rejects.toThrow('process.exit(1)')
188
+ await expect(authCommand.parseAsync(['status'], { from: 'user' })).rejects.toThrow('process.exit(1)')
186
189
 
187
190
  expect(processExitSpy).toHaveBeenCalledWith(1)
188
191
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -214,9 +217,9 @@ describe('auth commands', () => {
214
217
  test('outputs error for specific missing account', async () => {
215
218
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
216
219
 
217
- await expect(
218
- authCommand.parseAsync(['status', '--account', 'missing-id'], { from: 'user' }),
219
- ).rejects.toThrow('process.exit(1)')
220
+ await expect(authCommand.parseAsync(['status', '--account', 'missing-id'], { from: 'user' })).rejects.toThrow(
221
+ 'process.exit(1)',
222
+ )
220
223
 
221
224
  expect(processExitSpy).toHaveBeenCalledWith(1)
222
225
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -238,9 +241,7 @@ describe('auth commands', () => {
238
241
  )
239
242
  mockRemoveAccount.mockImplementation(() => Promise.resolve(true))
240
243
 
241
- await expect(
242
- authCommand.parseAsync(['logout'], { from: 'user' }),
243
- ).rejects.toThrow('process.exit(0)')
244
+ await expect(authCommand.parseAsync(['logout'], { from: 'user' })).rejects.toThrow('process.exit(0)')
244
245
 
245
246
  expect(mockRemoveAccount).toHaveBeenCalledWith('plus-12025551234')
246
247
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -252,9 +253,7 @@ describe('auth commands', () => {
252
253
  test('outputs error and exits when no account configured', async () => {
253
254
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
254
255
 
255
- await expect(
256
- authCommand.parseAsync(['logout'], { from: 'user' }),
257
- ).rejects.toThrow('process.exit(1)')
256
+ await expect(authCommand.parseAsync(['logout'], { from: 'user' })).rejects.toThrow('process.exit(1)')
258
257
 
259
258
  expect(processExitSpy).toHaveBeenCalledWith(1)
260
259
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -274,9 +273,7 @@ describe('auth commands', () => {
274
273
  mockConnect.mockImplementation(() => Promise.reject(new Error('Connection failed')))
275
274
  mockRemoveAccount.mockImplementation(() => Promise.resolve(true))
276
275
 
277
- await expect(
278
- authCommand.parseAsync(['logout'], { from: 'user' }),
279
- ).rejects.toThrow('process.exit(0)')
276
+ await expect(authCommand.parseAsync(['logout'], { from: 'user' })).rejects.toThrow('process.exit(0)')
280
277
 
281
278
  expect(mockRemoveAccount).toHaveBeenCalledWith('plus-12025551234')
282
279
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -3,7 +3,9 @@ import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:
3
3
  const originalConsoleLog = console.log
4
4
 
5
5
  mock.module('@/shared/utils/error-handler', () => ({
6
- handleError: (err: Error) => { throw err },
6
+ handleError: (err: Error) => {
7
+ throw err
8
+ },
7
9
  }))
8
10
 
9
11
  const mockGetAccount = mock(() =>
@@ -15,9 +17,7 @@ const mockGetAccount = mock(() =>
15
17
  updated_at: '2024-01-01T00:00:00.000Z',
16
18
  }),
17
19
  )
18
- const mockEnsureAccountPaths = mock(() =>
19
- Promise.resolve({ account_dir: '/tmp/test', auth_dir: '/tmp/test/auth' }),
20
- )
20
+ const mockEnsureAccountPaths = mock(() => Promise.resolve({ account_dir: '/tmp/test', auth_dir: '/tmp/test/auth' }))
21
21
 
22
22
  mock.module('../credential-manager', () => ({
23
23
  WhatsAppCredentialManager: class {
@@ -55,7 +55,9 @@ const mockClose = mock(() => Promise.resolve())
55
55
 
56
56
  mock.module('../client', () => ({
57
57
  WhatsAppClient: class {
58
- login = mock(function (this: unknown) { return Promise.resolve(this) })
58
+ login = mock(function (this: unknown) {
59
+ return Promise.resolve(this)
60
+ })
59
61
  connect = mockConnect
60
62
  close = mockClose
61
63
  listChats = mockListChats
@@ -114,7 +116,8 @@ describe('chat commands', () => {
114
116
  mockConnect.mockImplementation(() => Promise.resolve())
115
117
  mockClose.mockImplementation(() => Promise.resolve())
116
118
 
117
- consoleLogSpy = mock((..._args: unknown[]) => {}); console.log = consoleLogSpy
119
+ consoleLogSpy = mock((..._args: unknown[]) => {})
120
+ console.log = consoleLogSpy
118
121
  processExitSpy = spyOn(process, 'exit').mockImplementation((_code?: number) => {
119
122
  throw new Error(`process.exit(${_code})`)
120
123
  })
@@ -128,9 +131,7 @@ describe('chat commands', () => {
128
131
 
129
132
  describe('list', () => {
130
133
  test('lists chats with default limit', async () => {
131
- await expect(
132
- chatCommand.parseAsync(['list'], { from: 'user' }),
133
- ).rejects.toThrow('process.exit(0)')
134
+ await expect(chatCommand.parseAsync(['list'], { from: 'user' })).rejects.toThrow('process.exit(0)')
134
135
 
135
136
  expect(mockListChats).toHaveBeenCalledWith(20)
136
137
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -140,17 +141,17 @@ describe('chat commands', () => {
140
141
  })
141
142
 
142
143
  test('respects --limit option', async () => {
143
- await expect(
144
- chatCommand.parseAsync(['list', '--limit', '5'], { from: 'user' }),
145
- ).rejects.toThrow('process.exit(0)')
144
+ await expect(chatCommand.parseAsync(['list', '--limit', '5'], { from: 'user' })).rejects.toThrow(
145
+ 'process.exit(0)',
146
+ )
146
147
 
147
148
  expect(mockListChats).toHaveBeenCalledWith(5)
148
149
  })
149
150
 
150
151
  test('passes account option to credential manager', async () => {
151
- await expect(
152
- chatCommand.parseAsync(['list', '--account', 'my-account'], { from: 'user' }),
153
- ).rejects.toThrow('process.exit(0)')
152
+ await expect(chatCommand.parseAsync(['list', '--account', 'my-account'], { from: 'user' })).rejects.toThrow(
153
+ 'process.exit(0)',
154
+ )
154
155
 
155
156
  expect(mockGetAccount).toHaveBeenCalledWith('my-account')
156
157
  })
@@ -158,9 +159,7 @@ describe('chat commands', () => {
158
159
  test('exits with error when no account configured', async () => {
159
160
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
160
161
 
161
- await expect(
162
- chatCommand.parseAsync(['list'], { from: 'user' }),
163
- ).rejects.toThrow('process.exit(1)')
162
+ await expect(chatCommand.parseAsync(['list'], { from: 'user' })).rejects.toThrow('process.exit(1)')
164
163
 
165
164
  expect(processExitSpy).toHaveBeenCalledWith(1)
166
165
  })
@@ -168,9 +167,7 @@ describe('chat commands', () => {
168
167
 
169
168
  describe('search', () => {
170
169
  test('searches chats by query', async () => {
171
- await expect(
172
- chatCommand.parseAsync(['search', 'Bob'], { from: 'user' }),
173
- ).rejects.toThrow('process.exit(0)')
170
+ await expect(chatCommand.parseAsync(['search', 'Bob'], { from: 'user' })).rejects.toThrow('process.exit(0)')
174
171
 
175
172
  expect(mockSearchChats).toHaveBeenCalledWith('Bob', 20)
176
173
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -180,9 +177,9 @@ describe('chat commands', () => {
180
177
  })
181
178
 
182
179
  test('respects --limit option', async () => {
183
- await expect(
184
- chatCommand.parseAsync(['search', 'Alice', '--limit', '3'], { from: 'user' }),
185
- ).rejects.toThrow('process.exit(0)')
180
+ await expect(chatCommand.parseAsync(['search', 'Alice', '--limit', '3'], { from: 'user' })).rejects.toThrow(
181
+ 'process.exit(0)',
182
+ )
186
183
 
187
184
  expect(mockSearchChats).toHaveBeenCalledWith('Alice', 3)
188
185
  })
@@ -1,6 +1,8 @@
1
1
  import { Command } from 'commander'
2
+
2
3
  import { handleError } from '@/shared/utils/error-handler'
3
4
  import { formatOutput } from '@/shared/utils/output'
5
+
4
6
  import { parseLimitOption, withWhatsAppClient } from './shared'
5
7
 
6
8
  async function listAction(options: { account?: string; pretty?: boolean; limit?: string }): Promise<void> {
@@ -3,7 +3,9 @@ import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:
3
3
  const originalConsoleLog = console.log
4
4
 
5
5
  mock.module('@/shared/utils/error-handler', () => ({
6
- handleError: (err: Error) => { throw err },
6
+ handleError: (err: Error) => {
7
+ throw err
8
+ },
7
9
  }))
8
10
 
9
11
  const mockGetAccount = mock(() =>
@@ -15,9 +17,7 @@ const mockGetAccount = mock(() =>
15
17
  updated_at: '2024-01-01T00:00:00.000Z',
16
18
  }),
17
19
  )
18
- const mockEnsureAccountPaths = mock(() =>
19
- Promise.resolve({ account_dir: '/tmp/test', auth_dir: '/tmp/test/auth' }),
20
- )
20
+ const mockEnsureAccountPaths = mock(() => Promise.resolve({ account_dir: '/tmp/test', auth_dir: '/tmp/test/auth' }))
21
21
 
22
22
  mock.module('../credential-manager', () => ({
23
23
  WhatsAppCredentialManager: class {
@@ -54,7 +54,9 @@ const mockClose = mock(() => Promise.resolve())
54
54
 
55
55
  mock.module('../client', () => ({
56
56
  WhatsAppClient: class {
57
- login = mock(function (this: unknown) { return Promise.resolve(this) })
57
+ login = mock(function (this: unknown) {
58
+ return Promise.resolve(this)
59
+ })
58
60
  connect = mockConnect
59
61
  close = mockClose
60
62
  getMessages = mockGetMessages
@@ -114,7 +116,8 @@ describe('message commands', () => {
114
116
  mockConnect.mockImplementation(() => Promise.resolve())
115
117
  mockClose.mockImplementation(() => Promise.resolve())
116
118
 
117
- consoleLogSpy = mock((..._args: unknown[]) => {}); console.log = consoleLogSpy
119
+ consoleLogSpy = mock((..._args: unknown[]) => {})
120
+ console.log = consoleLogSpy
118
121
  processExitSpy = spyOn(process, 'exit').mockImplementation((_code?: number) => {
119
122
  throw new Error(`process.exit(${_code})`)
120
123
  })
@@ -128,9 +131,9 @@ describe('message commands', () => {
128
131
 
129
132
  describe('list', () => {
130
133
  test('fetches messages for a chat', async () => {
131
- await expect(
132
- messageCommand.parseAsync(['list', '12025551234@s.whatsapp.net'], { from: 'user' }),
133
- ).rejects.toThrow('process.exit(0)')
134
+ await expect(messageCommand.parseAsync(['list', '12025551234@s.whatsapp.net'], { from: 'user' })).rejects.toThrow(
135
+ 'process.exit(0)',
136
+ )
134
137
 
135
138
  expect(mockGetMessages).toHaveBeenCalledWith('12025551234@s.whatsapp.net', 25)
136
139
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -158,9 +161,9 @@ describe('message commands', () => {
158
161
  test('exits with error when no account configured', async () => {
159
162
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
160
163
 
161
- await expect(
162
- messageCommand.parseAsync(['list', '12025551234@s.whatsapp.net'], { from: 'user' }),
163
- ).rejects.toThrow('process.exit(1)')
164
+ await expect(messageCommand.parseAsync(['list', '12025551234@s.whatsapp.net'], { from: 'user' })).rejects.toThrow(
165
+ 'process.exit(1)',
166
+ )
164
167
 
165
168
  expect(processExitSpy).toHaveBeenCalledWith(1)
166
169
  })
@@ -192,10 +195,7 @@ describe('message commands', () => {
192
195
  describe('react', () => {
193
196
  test('sends a reaction to a message', async () => {
194
197
  await expect(
195
- messageCommand.parseAsync(
196
- ['react', '12025551234@s.whatsapp.net', 'msg-1', '👍'],
197
- { from: 'user' },
198
- ),
198
+ messageCommand.parseAsync(['react', '12025551234@s.whatsapp.net', 'msg-1', '👍'], { from: 'user' }),
199
199
  ).rejects.toThrow('process.exit(0)')
200
200
 
201
201
  expect(mockSendReaction).toHaveBeenCalledWith('12025551234@s.whatsapp.net', 'msg-1', '👍', undefined)
@@ -208,10 +208,9 @@ describe('message commands', () => {
208
208
 
209
209
  test('passes --from-me flag to sendReaction', async () => {
210
210
  await expect(
211
- messageCommand.parseAsync(
212
- ['react', '12025551234@s.whatsapp.net', 'msg-1', '❤️', '--from-me'],
213
- { from: 'user' },
214
- ),
211
+ messageCommand.parseAsync(['react', '12025551234@s.whatsapp.net', 'msg-1', '❤️', '--from-me'], {
212
+ from: 'user',
213
+ }),
215
214
  ).rejects.toThrow('process.exit(0)')
216
215
 
217
216
  expect(mockSendReaction).toHaveBeenCalledWith('12025551234@s.whatsapp.net', 'msg-1', '❤️', true)
@@ -219,10 +218,9 @@ describe('message commands', () => {
219
218
 
220
219
  test('passes account option to credential manager', async () => {
221
220
  await expect(
222
- messageCommand.parseAsync(
223
- ['react', '12025551234@s.whatsapp.net', 'msg-1', '👍', '--account', 'my-account'],
224
- { from: 'user' },
225
- ),
221
+ messageCommand.parseAsync(['react', '12025551234@s.whatsapp.net', 'msg-1', '👍', '--account', 'my-account'], {
222
+ from: 'user',
223
+ }),
226
224
  ).rejects.toThrow('process.exit(0)')
227
225
 
228
226
  expect(mockGetAccount).toHaveBeenCalledWith('my-account')
@@ -1,6 +1,8 @@
1
1
  import { Command } from 'commander'
2
+
2
3
  import { handleError } from '@/shared/utils/error-handler'
3
4
  import { formatOutput } from '@/shared/utils/output'
5
+
4
6
  import { parseLimitOption, withWhatsAppClient } from './shared'
5
7
 
6
8
  async function listAction(
@@ -17,11 +19,7 @@ async function listAction(
17
19
  }
18
20
  }
19
21
 
20
- async function sendAction(
21
- chat: string,
22
- text: string,
23
- options: { account?: string; pretty?: boolean },
24
- ): Promise<void> {
22
+ async function sendAction(chat: string, text: string, options: { account?: string; pretty?: boolean }): Promise<void> {
25
23
  try {
26
24
  const message = await withWhatsAppClient(options, (client) => client.sendMessage(chat, text))
27
25
  console.log(formatOutput(message, options.pretty))
@@ -1,4 +1,5 @@
1
1
  import { formatOutput } from '@/shared/utils/output'
2
+
2
3
  import { WhatsAppClient } from '../client'
3
4
  import { WhatsAppCredentialManager } from '../credential-manager'
4
5
  import { WhatsAppError } from '../types'
@@ -8,11 +9,7 @@ export interface AccountOption {
8
9
  pretty?: boolean
9
10
  }
10
11
 
11
- export function parseLimitOption(
12
- rawLimit: string | undefined,
13
- defaultValue: number,
14
- maxValue = 100,
15
- ): number {
12
+ export function parseLimitOption(rawLimit: string | undefined, defaultValue: number, maxValue = 100): number {
16
13
  const trimmed = (rawLimit ?? `${defaultValue}`).trim()
17
14
 
18
15
  if (!/^\d+$/.test(trimmed)) {
@@ -21,8 +21,8 @@ describe('whoami command', () => {
21
21
  phone_number: '12025551234',
22
22
  }
23
23
 
24
- withWhatsAppClientSpy = spyOn(sharedModule, 'withWhatsAppClient').mockImplementation(
25
- async (_opts, fn) => fn({ getProfile: () => Promise.resolve(mockProfileData) } as unknown as WhatsAppClient),
24
+ withWhatsAppClientSpy = spyOn(sharedModule, 'withWhatsAppClient').mockImplementation(async (_opts, fn) =>
25
+ fn({ getProfile: () => Promise.resolve(mockProfileData) } as unknown as WhatsAppClient),
26
26
  )
27
27
  consoleLogSpy = spyOn(console, 'log').mockImplementation(() => {})
28
28
  })
@@ -2,12 +2,8 @@ import { existsSync } from 'node:fs'
2
2
  import { mkdir, readFile, rm, writeFile } from 'node:fs/promises'
3
3
  import { homedir } from 'node:os'
4
4
  import { join } from 'node:path'
5
- import {
6
- createAccountId,
7
- type WhatsAppAccount,
8
- type WhatsAppAccountPaths,
9
- type WhatsAppConfig,
10
- } from './types'
5
+
6
+ import { createAccountId, type WhatsAppAccount, type WhatsAppAccountPaths, type WhatsAppConfig } from './types'
11
7
 
12
8
  export class WhatsAppCredentialManager {
13
9
  private configDir: string
@@ -27,10 +27,7 @@ const validPaths = {
27
27
  beforeEach(() => {
28
28
  getAccountSpy = spyOn(WhatsAppCredentialManager.prototype, 'getAccount').mockResolvedValue(null)
29
29
 
30
- getAccountPathsSpy = spyOn(
31
- WhatsAppCredentialManager.prototype,
32
- 'getAccountPaths',
33
- ).mockReturnValue(validPaths)
30
+ getAccountPathsSpy = spyOn(WhatsAppCredentialManager.prototype, 'getAccountPaths').mockReturnValue(validPaths)
34
31
 
35
32
  existsSyncSpy = spyOn(fs, 'existsSync').mockReturnValue(false)
36
33
 
@@ -1,6 +1,8 @@
1
1
  import { existsSync } from 'node:fs'
2
2
  import { join } from 'node:path'
3
+
3
4
  import { formatOutput } from '@/shared/utils/output'
5
+
4
6
  import { WhatsAppCredentialManager } from './credential-manager'
5
7
 
6
8
  export async function ensureWhatsAppAuth(): Promise<void> {
@@ -8,9 +10,12 @@ export async function ensureWhatsAppAuth(): Promise<void> {
8
10
  const account = await manager.getAccount()
9
11
 
10
12
  if (!account) {
11
- console.log(formatOutput({
12
- error: 'Not authenticated. Run "agent-whatsapp auth login --qr" or "agent-whatsapp auth login --phone <phone-number>" first.',
13
- }))
13
+ console.log(
14
+ formatOutput({
15
+ error:
16
+ 'Not authenticated. Run "agent-whatsapp auth login --qr" or "agent-whatsapp auth login --phone <phone-number>" first.',
17
+ }),
18
+ )
14
19
  process.exit(1)
15
20
  }
16
21
 
@@ -18,9 +23,12 @@ export async function ensureWhatsAppAuth(): Promise<void> {
18
23
  const credsPath = join(paths.auth_dir, 'creds.json')
19
24
 
20
25
  if (!existsSync(credsPath)) {
21
- console.log(formatOutput({
22
- error: 'Auth credentials missing. Run "agent-whatsapp auth login --qr" or "agent-whatsapp auth login --phone <phone-number>" to re-authenticate.',
23
- }))
26
+ console.log(
27
+ formatOutput({
28
+ error:
29
+ 'Auth credentials missing. Run "agent-whatsapp auth login --qr" or "agent-whatsapp auth login --phone <phone-number>" to re-authenticate.',
30
+ }),
31
+ )
24
32
  process.exit(1)
25
33
  }
26
34
  }
@@ -12,5 +12,3 @@ export {
12
12
  type WhatsAppConfig,
13
13
  type WhatsAppMessageSummary,
14
14
  } from './types'
15
-
16
-
@@ -51,13 +51,21 @@ describe('WhatsAppBotClient', () => {
51
51
 
52
52
  describe('login', () => {
53
53
  test('throws on empty phoneNumberId', async () => {
54
- await expect(new WhatsAppBotClient().login({ phoneNumberId: '', accessToken: 'access-token' })).rejects.toThrow(WhatsAppBotError)
55
- await expect(new WhatsAppBotClient().login({ phoneNumberId: '', accessToken: 'access-token' })).rejects.toThrow('Phone number ID is required')
54
+ await expect(new WhatsAppBotClient().login({ phoneNumberId: '', accessToken: 'access-token' })).rejects.toThrow(
55
+ WhatsAppBotError,
56
+ )
57
+ await expect(new WhatsAppBotClient().login({ phoneNumberId: '', accessToken: 'access-token' })).rejects.toThrow(
58
+ 'Phone number ID is required',
59
+ )
56
60
  })
57
61
 
58
62
  test('throws on empty accessToken', async () => {
59
- await expect(new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: '' })).rejects.toThrow(WhatsAppBotError)
60
- await expect(new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: '' })).rejects.toThrow('Access token is required')
63
+ await expect(new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: '' })).rejects.toThrow(
64
+ WhatsAppBotError,
65
+ )
66
+ await expect(new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: '' })).rejects.toThrow(
67
+ 'Access token is required',
68
+ )
61
69
  })
62
70
 
63
71
  test('accepts valid phoneNumberId and accessToken', async () => {
@@ -275,9 +283,7 @@ describe('WhatsAppBotClient', () => {
275
283
  describe('getTemplate', () => {
276
284
  test('sends GET with name filter and returns first match', async () => {
277
285
  mockResponse({
278
- data: [
279
- { name: 'hello_world', status: 'APPROVED', category: 'UTILITY', language: 'en_US', components: [] },
280
- ],
286
+ data: [{ name: 'hello_world', status: 'APPROVED', category: 'UTILITY', language: 'en_US', components: [] }],
281
287
  })
282
288
 
283
289
  const client = await new WhatsAppBotClient().login({ phoneNumberId: 'phone-123', accessToken: 'my-token' })
@@ -101,7 +101,12 @@ export class WhatsAppBotClient {
101
101
  }
102
102
 
103
103
  async listTemplates(params?: { limit?: number }): Promise<WhatsAppBotTemplate[]> {
104
- return this.request<WhatsAppBotTemplate[]>('GET', this.buildPath(`/${this.phoneNumberId}/message_templates`, params), undefined, 'data')
104
+ return this.request<WhatsAppBotTemplate[]>(
105
+ 'GET',
106
+ this.buildPath(`/${this.phoneNumberId}/message_templates`, params),
107
+ undefined,
108
+ 'data',
109
+ )
105
110
  }
106
111
 
107
112
  async getTemplate(templateName: string): Promise<WhatsAppBotTemplate> {
@@ -136,7 +141,16 @@ export class WhatsAppBotClient {
136
141
  const usageHeader = response.headers.get('x-business-use-case-usage')
137
142
  if (usageHeader) {
138
143
  try {
139
- const usage = JSON.parse(usageHeader) as Record<string, Array<{ call_count: number; total_cputime: number; total_time: number; type: string; estimated_time_to_regain_access: number }>>
144
+ const usage = JSON.parse(usageHeader) as Record<
145
+ string,
146
+ Array<{
147
+ call_count: number
148
+ total_cputime: number
149
+ total_time: number
150
+ type: string
151
+ estimated_time_to_regain_access: number
152
+ }>
153
+ >
140
154
  for (const entries of Object.values(usage)) {
141
155
  for (const entry of entries) {
142
156
  if (entry.call_count >= 100) {
@@ -199,7 +213,7 @@ export class WhatsAppBotClient {
199
213
  continue
200
214
  }
201
215
 
202
- const errorBody = await response.json().catch(() => ({})) as {
216
+ const errorBody = (await response.json().catch(() => ({}))) as {
203
217
  error?: { message?: string; code?: number }
204
218
  }
205
219
  const msg = errorBody.error?.message || `HTTP ${response.status}`
@@ -208,7 +222,7 @@ export class WhatsAppBotClient {
208
222
  }
209
223
 
210
224
  if (!response.ok) {
211
- const errorBody = await response.json().catch(() => ({})) as {
225
+ const errorBody = (await response.json().catch(() => ({}))) as {
212
226
  error?: { message?: string; code?: number }
213
227
  }
214
228
  const msg = errorBody.error?.message || `HTTP ${response.status}`
@@ -63,7 +63,10 @@ export async function statusAction(options: ActionOptions): Promise<ActionResult
63
63
  let accountName: string | undefined
64
64
 
65
65
  try {
66
- const client = await new WhatsAppBotClient().login({ phoneNumberId: creds.phone_number_id, accessToken: creds.access_token })
66
+ const client = await new WhatsAppBotClient().login({
67
+ phoneNumberId: creds.phone_number_id,
68
+ accessToken: creds.access_token,
69
+ })
67
70
  const result = await client.verifyToken()
68
71
  valid = true
69
72
  phoneNumberId = creds.phone_number_id
@@ -174,7 +174,12 @@ describe('message commands', () => {
174
174
 
175
175
  expect(result.messaging_product).toBe('whatsapp')
176
176
  expect(result.messages?.[0].id).toBe('wamid.doc123')
177
- expect(mockSendDocumentMessage).toHaveBeenCalledWith('+1234567890', 'https://example.com/doc.pdf', undefined, undefined)
177
+ expect(mockSendDocumentMessage).toHaveBeenCalledWith(
178
+ '+1234567890',
179
+ 'https://example.com/doc.pdf',
180
+ undefined,
181
+ undefined,
182
+ )
178
183
  })
179
184
 
180
185
  test('passes filename and caption when provided', async () => {
@@ -183,7 +188,12 @@ describe('message commands', () => {
183
188
  caption: 'Monthly report',
184
189
  })
185
190
 
186
- expect(mockSendDocumentMessage).toHaveBeenCalledWith('+1234567890', 'https://example.com/doc.pdf', 'report.pdf', 'Monthly report')
191
+ expect(mockSendDocumentMessage).toHaveBeenCalledWith(
192
+ '+1234567890',
193
+ 'https://example.com/doc.pdf',
194
+ 'report.pdf',
195
+ 'Monthly report',
196
+ )
187
197
  expect(result.error).toBeUndefined()
188
198
  })
189
199
 
@@ -29,7 +29,11 @@ export async function sendAction(to: string, text: string, options: MessageOptio
29
29
  }
30
30
  }
31
31
 
32
- export async function sendTemplateAction(to: string, templateName: string, options: MessageOptions): Promise<MessageResult> {
32
+ export async function sendTemplateAction(
33
+ to: string,
34
+ templateName: string,
35
+ options: MessageOptions,
36
+ ): Promise<MessageResult> {
33
37
  try {
34
38
  const client = await getClient(options)
35
39
  const languageCode = options.language ?? 'en_US'
@@ -48,7 +52,12 @@ export async function sendTemplateAction(to: string, templateName: string, optio
48
52
  }
49
53
  }
50
54
 
51
- export async function sendReactionAction(to: string, messageId: string, emoji: string, options: MessageOptions): Promise<MessageResult> {
55
+ export async function sendReactionAction(
56
+ to: string,
57
+ messageId: string,
58
+ emoji: string,
59
+ options: MessageOptions,
60
+ ): Promise<MessageResult> {
52
61
  try {
53
62
  const client = await getClient(options)
54
63
  const response = await client.sendReaction(to, messageId, emoji)
@@ -68,7 +77,11 @@ export async function sendImageAction(to: string, imageUrl: string, options: Mes
68
77
  }
69
78
  }
70
79
 
71
- export async function sendDocumentAction(to: string, documentUrl: string, options: MessageOptions): Promise<MessageResult> {
80
+ export async function sendDocumentAction(
81
+ to: string,
82
+ documentUrl: string,
83
+ options: MessageOptions,
84
+ ): Promise<MessageResult> {
72
85
  try {
73
86
  const client = await getClient(options)
74
87
  const response = await client.sendDocumentMessage(to, documentUrl, options.filename, options.caption)
@@ -14,7 +14,9 @@ export async function getClient(options: AccountOption): Promise<WhatsAppBotClie
14
14
  const creds = await credManager.getCredentials(options.account)
15
15
 
16
16
  if (!creds) {
17
- console.log(formatOutput({ error: 'No credentials. Run "auth set <phone-number-id> <access-token>" first.' }, options.pretty))
17
+ console.log(
18
+ formatOutput({ error: 'No credentials. Run "auth set <phone-number-id> <access-token>" first.' }, options.pretty),
19
+ )
18
20
  process.exit(1)
19
21
  }
20
22
 
@@ -4,9 +4,7 @@ import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
5
5
  import { join } from 'node:path'
6
6
 
7
- const mockVerifyToken = mock(() =>
8
- Promise.resolve({ verified_name: 'Test Business' }),
9
- )
7
+ const mockVerifyToken = mock(() => Promise.resolve({ verified_name: 'Test Business' }))
10
8
 
11
9
  mock.module('../client', () => ({
12
10
  WhatsAppBotClient: class MockWhatsAppBotClient {