agent-messenger 2.7.0 → 2.9.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 (553) 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 -12
  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 +4 -2
  15. package/dist/src/platforms/channeltalk/commands/snapshot.d.ts.map +1 -1
  16. package/dist/src/platforms/channeltalk/commands/snapshot.js +86 -31
  17. package/dist/src/platforms/channeltalk/commands/snapshot.js.map +1 -1
  18. package/dist/src/platforms/channeltalk/ensure-auth.d.ts.map +1 -1
  19. package/dist/src/platforms/channeltalk/ensure-auth.js.map +1 -1
  20. package/dist/src/platforms/channeltalk/token-extractor.d.ts +9 -23
  21. package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
  22. package/dist/src/platforms/channeltalk/token-extractor.js +109 -341
  23. package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
  24. package/dist/src/platforms/channeltalkbot/client.d.ts +1 -1
  25. package/dist/src/platforms/channeltalkbot/client.d.ts.map +1 -1
  26. package/dist/src/platforms/channeltalkbot/client.js +4 -4
  27. package/dist/src/platforms/channeltalkbot/client.js.map +1 -1
  28. package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
  29. package/dist/src/platforms/channeltalkbot/commands/auth.js +4 -1
  30. package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
  31. package/dist/src/platforms/channeltalkbot/commands/shared.d.ts.map +1 -1
  32. package/dist/src/platforms/channeltalkbot/commands/shared.js.map +1 -1
  33. package/dist/src/platforms/channeltalkbot/commands/snapshot.d.ts +3 -1
  34. package/dist/src/platforms/channeltalkbot/commands/snapshot.d.ts.map +1 -1
  35. package/dist/src/platforms/channeltalkbot/commands/snapshot.js +110 -60
  36. package/dist/src/platforms/channeltalkbot/commands/snapshot.js.map +1 -1
  37. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  38. package/dist/src/platforms/discord/commands/snapshot.d.ts +1 -0
  39. package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -1
  40. package/dist/src/platforms/discord/commands/snapshot.js +48 -34
  41. package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
  42. package/dist/src/platforms/discord/commands/whoami.d.ts.map +1 -1
  43. package/dist/src/platforms/discord/commands/whoami.js.map +1 -1
  44. package/dist/src/platforms/discord/token-extractor.d.ts +2 -10
  45. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  46. package/dist/src/platforms/discord/token-extractor.js +38 -172
  47. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  48. package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
  49. package/dist/src/platforms/discordbot/client.js.map +1 -1
  50. package/dist/src/platforms/discordbot/commands/snapshot.d.ts +2 -0
  51. package/dist/src/platforms/discordbot/commands/snapshot.d.ts.map +1 -1
  52. package/dist/src/platforms/discordbot/commands/snapshot.js +46 -34
  53. package/dist/src/platforms/discordbot/commands/snapshot.js.map +1 -1
  54. package/dist/src/platforms/instagram/cli.d.ts.map +1 -1
  55. package/dist/src/platforms/instagram/cli.js +1 -4
  56. package/dist/src/platforms/instagram/cli.js.map +1 -1
  57. package/dist/src/platforms/instagram/client.d.ts.map +1 -1
  58. package/dist/src/platforms/instagram/client.js +8 -7
  59. package/dist/src/platforms/instagram/client.js.map +1 -1
  60. package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
  61. package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
  62. package/dist/src/platforms/instagram/commands/chat.d.ts.map +1 -1
  63. package/dist/src/platforms/instagram/commands/chat.js.map +1 -1
  64. package/dist/src/platforms/instagram/commands/message.d.ts.map +1 -1
  65. package/dist/src/platforms/instagram/commands/message.js.map +1 -1
  66. package/dist/src/platforms/instagram/commands/shared.d.ts.map +1 -1
  67. package/dist/src/platforms/instagram/commands/shared.js.map +1 -1
  68. package/dist/src/platforms/instagram/credential-manager.d.ts.map +1 -1
  69. package/dist/src/platforms/instagram/credential-manager.js +1 -1
  70. package/dist/src/platforms/instagram/credential-manager.js.map +1 -1
  71. package/dist/src/platforms/instagram/ensure-auth.d.ts.map +1 -1
  72. package/dist/src/platforms/instagram/ensure-auth.js.map +1 -1
  73. package/dist/src/platforms/instagram/token-extractor.d.ts +7 -19
  74. package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
  75. package/dist/src/platforms/instagram/token-extractor.js +44 -270
  76. package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
  77. package/dist/src/platforms/instagram/types.d.ts.map +1 -1
  78. package/dist/src/platforms/instagram/types.js +4 -2
  79. package/dist/src/platforms/instagram/types.js.map +1 -1
  80. package/dist/src/platforms/kakaotalk/auth/kakao-login.d.ts.map +1 -1
  81. package/dist/src/platforms/kakaotalk/auth/kakao-login.js +18 -4
  82. package/dist/src/platforms/kakaotalk/auth/kakao-login.js.map +1 -1
  83. package/dist/src/platforms/kakaotalk/client.d.ts.map +1 -1
  84. package/dist/src/platforms/kakaotalk/client.js +3 -3
  85. package/dist/src/platforms/kakaotalk/client.js.map +1 -1
  86. package/dist/src/platforms/kakaotalk/commands/auth.d.ts.map +1 -1
  87. package/dist/src/platforms/kakaotalk/commands/auth.js +15 -9
  88. package/dist/src/platforms/kakaotalk/commands/auth.js.map +1 -1
  89. package/dist/src/platforms/kakaotalk/commands/shared.d.ts.map +1 -1
  90. package/dist/src/platforms/kakaotalk/commands/shared.js.map +1 -1
  91. package/dist/src/platforms/kakaotalk/protocol/connection.d.ts.map +1 -1
  92. package/dist/src/platforms/kakaotalk/protocol/connection.js.map +1 -1
  93. package/dist/src/platforms/kakaotalk/protocol/crypto.js +1 -1
  94. package/dist/src/platforms/kakaotalk/protocol/crypto.js.map +1 -1
  95. package/dist/src/platforms/kakaotalk/protocol/session.d.ts.map +1 -1
  96. package/dist/src/platforms/kakaotalk/protocol/session.js +1 -3
  97. package/dist/src/platforms/kakaotalk/protocol/session.js.map +1 -1
  98. package/dist/src/platforms/kakaotalk/token-extractor.js +5 -2
  99. package/dist/src/platforms/kakaotalk/token-extractor.js.map +1 -1
  100. package/dist/src/platforms/kakaotalk/types.d.ts.map +1 -1
  101. package/dist/src/platforms/kakaotalk/types.js +4 -2
  102. package/dist/src/platforms/kakaotalk/types.js.map +1 -1
  103. package/dist/src/platforms/line/cli.d.ts.map +1 -1
  104. package/dist/src/platforms/line/cli.js +1 -4
  105. package/dist/src/platforms/line/cli.js.map +1 -1
  106. package/dist/src/platforms/line/client.d.ts.map +1 -1
  107. package/dist/src/platforms/line/client.js +5 -13
  108. package/dist/src/platforms/line/client.js.map +1 -1
  109. package/dist/src/platforms/line/commands/chat.d.ts.map +1 -1
  110. package/dist/src/platforms/line/commands/chat.js.map +1 -1
  111. package/dist/src/platforms/line/commands/message.d.ts.map +1 -1
  112. package/dist/src/platforms/line/commands/message.js.map +1 -1
  113. package/dist/src/platforms/line/listener.js +1 -1
  114. package/dist/src/platforms/line/listener.js.map +1 -1
  115. package/dist/src/platforms/slack/cli.d.ts.map +1 -1
  116. package/dist/src/platforms/slack/cli.js.map +1 -1
  117. package/dist/src/platforms/slack/client-mappers.d.ts +14 -0
  118. package/dist/src/platforms/slack/client-mappers.d.ts.map +1 -0
  119. package/dist/src/platforms/slack/client-mappers.js +245 -0
  120. package/dist/src/platforms/slack/client-mappers.js.map +1 -0
  121. package/dist/src/platforms/slack/client.d.ts +0 -1
  122. package/dist/src/platforms/slack/client.d.ts.map +1 -1
  123. package/dist/src/platforms/slack/client.js +41 -455
  124. package/dist/src/platforms/slack/client.js.map +1 -1
  125. package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -1
  126. package/dist/src/platforms/slack/commands/channel.js.map +1 -1
  127. package/dist/src/platforms/slack/commands/emoji.d.ts.map +1 -1
  128. package/dist/src/platforms/slack/commands/emoji.js +1 -3
  129. package/dist/src/platforms/slack/commands/emoji.js.map +1 -1
  130. package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
  131. package/dist/src/platforms/slack/commands/message.js.map +1 -1
  132. package/dist/src/platforms/slack/commands/reminder.d.ts.map +1 -1
  133. package/dist/src/platforms/slack/commands/reminder.js.map +1 -1
  134. package/dist/src/platforms/slack/commands/snapshot.d.ts.map +1 -1
  135. package/dist/src/platforms/slack/commands/snapshot.js +75 -55
  136. package/dist/src/platforms/slack/commands/snapshot.js.map +1 -1
  137. package/dist/src/platforms/slack/commands/user.d.ts.map +1 -1
  138. package/dist/src/platforms/slack/commands/user.js.map +1 -1
  139. package/dist/src/platforms/slack/commands/usergroup.d.ts.map +1 -1
  140. package/dist/src/platforms/slack/commands/usergroup.js.map +1 -1
  141. package/dist/src/platforms/slack/commands/whoami.d.ts.map +1 -1
  142. package/dist/src/platforms/slack/commands/whoami.js.map +1 -1
  143. package/dist/src/platforms/slack/token-extractor.d.ts +2 -6
  144. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  145. package/dist/src/platforms/slack/token-extractor.js +35 -229
  146. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  147. package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
  148. package/dist/src/platforms/slackbot/cli.js +1 -1
  149. package/dist/src/platforms/slackbot/cli.js.map +1 -1
  150. package/dist/src/platforms/teams/client.d.ts.map +1 -1
  151. package/dist/src/platforms/teams/client.js +1 -1
  152. package/dist/src/platforms/teams/client.js.map +1 -1
  153. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  154. package/dist/src/platforms/teams/commands/auth.js +4 -1
  155. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  156. package/dist/src/platforms/teams/commands/snapshot.d.ts +1 -0
  157. package/dist/src/platforms/teams/commands/snapshot.d.ts.map +1 -1
  158. package/dist/src/platforms/teams/commands/snapshot.js +44 -31
  159. package/dist/src/platforms/teams/commands/snapshot.js.map +1 -1
  160. package/dist/src/platforms/teams/commands/whoami.d.ts.map +1 -1
  161. package/dist/src/platforms/teams/commands/whoami.js.map +1 -1
  162. package/dist/src/platforms/teams/token-extractor.d.ts +6 -18
  163. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  164. package/dist/src/platforms/teams/token-extractor.js +71 -324
  165. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  166. package/dist/src/platforms/telegram/cli.d.ts.map +1 -1
  167. package/dist/src/platforms/telegram/cli.js +1 -4
  168. package/dist/src/platforms/telegram/cli.js.map +1 -1
  169. package/dist/src/platforms/telegram/client.d.ts.map +1 -1
  170. package/dist/src/platforms/telegram/client.js.map +1 -1
  171. package/dist/src/platforms/telegram/commands/auth.d.ts.map +1 -1
  172. package/dist/src/platforms/telegram/commands/auth.js +1 -1
  173. package/dist/src/platforms/telegram/commands/auth.js.map +1 -1
  174. package/dist/src/platforms/telegram/commands/chat.d.ts.map +1 -1
  175. package/dist/src/platforms/telegram/commands/chat.js.map +1 -1
  176. package/dist/src/platforms/telegram/commands/message.d.ts.map +1 -1
  177. package/dist/src/platforms/telegram/commands/message.js.map +1 -1
  178. package/dist/src/platforms/telegram/commands/whoami.js +1 -1
  179. package/dist/src/platforms/telegram/commands/whoami.js.map +1 -1
  180. package/dist/src/platforms/telegram/credential-manager.d.ts.map +1 -1
  181. package/dist/src/platforms/telegram/credential-manager.js +6 -2
  182. package/dist/src/platforms/telegram/credential-manager.js.map +1 -1
  183. package/dist/src/platforms/telegram/my-telegram-org.js.map +1 -1
  184. package/dist/src/platforms/webex/cli.d.ts.map +1 -1
  185. package/dist/src/platforms/webex/cli.js +1 -4
  186. package/dist/src/platforms/webex/cli.js.map +1 -1
  187. package/dist/src/platforms/webex/client.d.ts.map +1 -1
  188. package/dist/src/platforms/webex/client.js +3 -7
  189. package/dist/src/platforms/webex/client.js.map +1 -1
  190. package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
  191. package/dist/src/platforms/webex/commands/auth.js +1 -3
  192. package/dist/src/platforms/webex/commands/auth.js.map +1 -1
  193. package/dist/src/platforms/webex/commands/member.d.ts.map +1 -1
  194. package/dist/src/platforms/webex/commands/member.js +1 -3
  195. package/dist/src/platforms/webex/commands/member.js.map +1 -1
  196. package/dist/src/platforms/webex/commands/message.d.ts.map +1 -1
  197. package/dist/src/platforms/webex/commands/message.js.map +1 -1
  198. package/dist/src/platforms/webex/commands/snapshot.d.ts +1 -0
  199. package/dist/src/platforms/webex/commands/snapshot.d.ts.map +1 -1
  200. package/dist/src/platforms/webex/commands/snapshot.js +14 -7
  201. package/dist/src/platforms/webex/commands/snapshot.js.map +1 -1
  202. package/dist/src/platforms/webex/commands/space.d.ts.map +1 -1
  203. package/dist/src/platforms/webex/commands/space.js.map +1 -1
  204. package/dist/src/platforms/webex/commands/whoami.d.ts.map +1 -1
  205. package/dist/src/platforms/webex/commands/whoami.js.map +1 -1
  206. package/dist/src/platforms/webex/credential-manager.d.ts.map +1 -1
  207. package/dist/src/platforms/webex/credential-manager.js.map +1 -1
  208. package/dist/src/platforms/webex/ensure-auth.d.ts.map +1 -1
  209. package/dist/src/platforms/webex/ensure-auth.js +1 -3
  210. package/dist/src/platforms/webex/ensure-auth.js.map +1 -1
  211. package/dist/src/platforms/webex/index.d.ts +1 -1
  212. package/dist/src/platforms/webex/index.d.ts.map +1 -1
  213. package/dist/src/platforms/webex/index.js.map +1 -1
  214. package/dist/src/platforms/webex/markdown-to-html.js.map +1 -1
  215. package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
  216. package/dist/src/platforms/webex/token-extractor.js +5 -14
  217. package/dist/src/platforms/webex/token-extractor.js.map +1 -1
  218. package/dist/src/platforms/wechatbot/client.d.ts.map +1 -1
  219. package/dist/src/platforms/wechatbot/client.js.map +1 -1
  220. package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
  221. package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
  222. package/dist/src/platforms/whatsapp/cli.d.ts.map +1 -1
  223. package/dist/src/platforms/whatsapp/cli.js +1 -4
  224. package/dist/src/platforms/whatsapp/cli.js.map +1 -1
  225. package/dist/src/platforms/whatsapp/commands/chat.d.ts.map +1 -1
  226. package/dist/src/platforms/whatsapp/commands/chat.js.map +1 -1
  227. package/dist/src/platforms/whatsapp/commands/message.d.ts.map +1 -1
  228. package/dist/src/platforms/whatsapp/commands/message.js.map +1 -1
  229. package/dist/src/platforms/whatsapp/commands/shared.d.ts.map +1 -1
  230. package/dist/src/platforms/whatsapp/commands/shared.js.map +1 -1
  231. package/dist/src/platforms/whatsapp/credential-manager.d.ts.map +1 -1
  232. package/dist/src/platforms/whatsapp/credential-manager.js +1 -1
  233. package/dist/src/platforms/whatsapp/credential-manager.js.map +1 -1
  234. package/dist/src/platforms/whatsapp/ensure-auth.d.ts.map +1 -1
  235. package/dist/src/platforms/whatsapp/ensure-auth.js.map +1 -1
  236. package/dist/src/platforms/whatsappbot/client.d.ts.map +1 -1
  237. package/dist/src/platforms/whatsappbot/client.js +2 -2
  238. package/dist/src/platforms/whatsappbot/client.js.map +1 -1
  239. package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
  240. package/dist/src/platforms/whatsappbot/commands/auth.js +4 -1
  241. package/dist/src/platforms/whatsappbot/commands/auth.js.map +1 -1
  242. package/dist/src/platforms/whatsappbot/commands/message.d.ts.map +1 -1
  243. package/dist/src/platforms/whatsappbot/commands/message.js.map +1 -1
  244. package/dist/src/platforms/whatsappbot/commands/shared.d.ts.map +1 -1
  245. package/dist/src/platforms/whatsappbot/commands/shared.js.map +1 -1
  246. package/dist/src/shared/chromium/browsers.d.ts +7 -0
  247. package/dist/src/shared/chromium/browsers.d.ts.map +1 -0
  248. package/dist/src/shared/chromium/browsers.js +89 -0
  249. package/dist/src/shared/chromium/browsers.js.map +1 -0
  250. package/dist/src/shared/chromium/cookie-reader.d.ts +20 -0
  251. package/dist/src/shared/chromium/cookie-reader.d.ts.map +1 -0
  252. package/dist/src/shared/chromium/cookie-reader.js +99 -0
  253. package/dist/src/shared/chromium/cookie-reader.js.map +1 -0
  254. package/dist/src/shared/chromium/decryptor.d.ts +42 -0
  255. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -0
  256. package/dist/src/shared/chromium/decryptor.js +205 -0
  257. package/dist/src/shared/chromium/decryptor.js.map +1 -0
  258. package/dist/src/shared/chromium/index.d.ts +6 -0
  259. package/dist/src/shared/chromium/index.d.ts.map +1 -0
  260. package/dist/src/shared/chromium/index.js +4 -0
  261. package/dist/src/shared/chromium/index.js.map +1 -0
  262. package/dist/src/shared/chromium/types.d.ts +11 -0
  263. package/dist/src/shared/chromium/types.d.ts.map +1 -0
  264. package/dist/src/shared/chromium/types.js +2 -0
  265. package/dist/src/shared/chromium/types.js.map +1 -0
  266. package/dist/src/shared/utils/derived-key-cache.d.ts +1 -1
  267. package/dist/src/shared/utils/derived-key-cache.d.ts.map +1 -1
  268. package/dist/src/shared/utils/linux-keyring.js +4 -1
  269. package/dist/src/shared/utils/linux-keyring.js.map +1 -1
  270. package/dist/src/tui/adapters/kakaotalk-adapter.d.ts.map +1 -1
  271. package/dist/src/tui/adapters/kakaotalk-adapter.js +6 -1
  272. package/dist/src/tui/adapters/kakaotalk-adapter.js.map +1 -1
  273. package/dist/src/tui/adapters/telegram-adapter.js +1 -1
  274. package/dist/src/tui/adapters/telegram-adapter.js.map +1 -1
  275. package/dist/src/tui/adapters/webex-adapter.js +1 -1
  276. package/dist/src/tui/adapters/webex-adapter.js.map +1 -1
  277. package/dist/src/tui/app.d.ts.map +1 -1
  278. package/dist/src/tui/app.js +112 -23
  279. package/dist/src/tui/app.js.map +1 -1
  280. package/dist/src/tui/utils.d.ts.map +1 -1
  281. package/dist/src/tui/utils.js +11 -13
  282. package/dist/src/tui/utils.js.map +1 -1
  283. package/dist/src/tui/views/channel-picker.d.ts.map +1 -1
  284. package/dist/src/tui/views/channel-picker.js.map +1 -1
  285. package/dist/src/tui/views/workspace-picker.d.ts.map +1 -1
  286. package/dist/src/tui/views/workspace-picker.js.map +1 -1
  287. package/docs/content/docs/agent-skills.mdx +0 -10
  288. package/docs/content/docs/cli/channeltalk.mdx +42 -30
  289. package/docs/content/docs/cli/channeltalkbot.mdx +23 -13
  290. package/docs/content/docs/cli/discord.mdx +23 -7
  291. package/docs/content/docs/cli/discordbot.mdx +23 -7
  292. package/docs/content/docs/cli/instagram.mdx +4 -4
  293. package/docs/content/docs/cli/kakaotalk.mdx +9 -8
  294. package/docs/content/docs/cli/line.mdx +14 -14
  295. package/docs/content/docs/cli/slack.mdx +24 -7
  296. package/docs/content/docs/cli/teams.mdx +24 -8
  297. package/docs/content/docs/cli/webex.mdx +34 -21
  298. package/docs/content/docs/cli/wechatbot.mdx +12 -11
  299. package/docs/content/docs/cli/whatsapp.mdx +5 -4
  300. package/docs/content/docs/cli/whatsappbot.mdx +11 -11
  301. package/docs/content/docs/index.mdx +7 -7
  302. package/docs/content/docs/meta.json +1 -9
  303. package/docs/content/docs/sdk/channeltalk.mdx +5 -6
  304. package/docs/content/docs/sdk/channeltalkbot.mdx +6 -12
  305. package/docs/content/docs/sdk/discord.mdx +36 -43
  306. package/docs/content/docs/sdk/instagram.mdx +18 -18
  307. package/docs/content/docs/sdk/kakaotalk.mdx +27 -18
  308. package/docs/content/docs/sdk/line.mdx +8 -13
  309. package/docs/content/docs/sdk/meta.json +14 -1
  310. package/docs/content/docs/sdk/slack.mdx +36 -42
  311. package/docs/content/docs/sdk/teams.mdx +2 -8
  312. package/docs/content/docs/sdk/webex.mdx +2 -12
  313. package/docs/content/docs/sdk/wechatbot.mdx +1 -5
  314. package/docs/content/docs/sdk/whatsapp.mdx +10 -19
  315. package/docs/content/docs/sdk/whatsappbot.mdx +2 -10
  316. package/docs/content/docs/tui.mdx +23 -23
  317. package/docs/src/app/page.tsx +353 -108
  318. package/e2e/channeltalkbot.e2e.test.ts +1 -5
  319. package/e2e/config.ts +6 -2
  320. package/package.json +59 -58
  321. package/scripts/prepublish.ts +1 -3
  322. package/skills/agent-channeltalk/SKILL.md +19 -9
  323. package/skills/agent-channeltalk/references/common-patterns.md +10 -9
  324. package/skills/agent-channeltalkbot/SKILL.md +19 -9
  325. package/skills/agent-channeltalkbot/references/common-patterns.md +10 -9
  326. package/skills/agent-discord/SKILL.md +18 -9
  327. package/skills/agent-discord/references/common-patterns.md +8 -7
  328. package/skills/agent-discordbot/SKILL.md +18 -9
  329. package/skills/agent-instagram/SKILL.md +1 -1
  330. package/skills/agent-kakaotalk/SKILL.md +1 -1
  331. package/skills/agent-line/SKILL.md +1 -1
  332. package/skills/agent-slack/SKILL.md +19 -10
  333. package/skills/agent-slack/references/common-patterns.md +4 -7
  334. package/skills/agent-slackbot/SKILL.md +1 -1
  335. package/skills/agent-teams/SKILL.md +18 -9
  336. package/skills/agent-teams/references/common-patterns.md +9 -7
  337. package/skills/agent-telegram/SKILL.md +1 -1
  338. package/skills/agent-webex/SKILL.md +13 -4
  339. package/skills/agent-webex/references/common-patterns.md +8 -2
  340. package/skills/agent-wechatbot/SKILL.md +1 -1
  341. package/skills/agent-whatsapp/SKILL.md +1 -1
  342. package/skills/agent-whatsappbot/SKILL.md +1 -1
  343. package/src/platforms/channeltalk/client.test.ts +116 -29
  344. package/src/platforms/channeltalk/client.ts +26 -6
  345. package/src/platforms/channeltalk/commands/auth.test.ts +5 -5
  346. package/src/platforms/channeltalk/commands/auth.ts +19 -5
  347. package/src/platforms/channeltalk/commands/message.test.ts +2 -6
  348. package/src/platforms/channeltalk/commands/message.ts +5 -1
  349. package/src/platforms/channeltalk/commands/snapshot.test.ts +77 -30
  350. package/src/platforms/channeltalk/commands/snapshot.ts +112 -34
  351. package/src/platforms/channeltalk/ensure-auth.test.ts +20 -17
  352. package/src/platforms/channeltalk/ensure-auth.ts +6 -7
  353. package/src/platforms/channeltalk/index.ts +0 -1
  354. package/src/platforms/channeltalk/token-extractor.test.ts +33 -25
  355. package/src/platforms/channeltalk/token-extractor.ts +120 -372
  356. package/src/platforms/channeltalkbot/client.test.ts +1 -3
  357. package/src/platforms/channeltalkbot/client.ts +39 -13
  358. package/src/platforms/channeltalkbot/commands/auth.test.ts +3 -1
  359. package/src/platforms/channeltalkbot/commands/auth.ts +4 -1
  360. package/src/platforms/channeltalkbot/commands/bot.test.ts +13 -5
  361. package/src/platforms/channeltalkbot/commands/message.test.ts +12 -6
  362. package/src/platforms/channeltalkbot/commands/shared.ts +6 -2
  363. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +43 -13
  364. package/src/platforms/channeltalkbot/commands/snapshot.ts +131 -64
  365. package/src/platforms/channeltalkbot/credential-manager.test.ts +1 -1
  366. package/src/platforms/channeltalkbot/index.test.ts +0 -2
  367. package/src/platforms/channeltalkbot/index.ts +0 -1
  368. package/src/platforms/discord/commands/auth.test.ts +6 -4
  369. package/src/platforms/discord/commands/auth.ts +14 -14
  370. package/src/platforms/discord/commands/snapshot.test.ts +1 -1
  371. package/src/platforms/discord/commands/snapshot.ts +58 -42
  372. package/src/platforms/discord/commands/whoami.test.ts +2 -4
  373. package/src/platforms/discord/commands/whoami.ts +2 -0
  374. package/src/platforms/discord/ensure-auth.test.ts +5 -3
  375. package/src/platforms/discord/index.ts +0 -1
  376. package/src/platforms/discord/listener.test.ts +7 -1
  377. package/src/platforms/discord/token-extractor.test.ts +18 -12
  378. package/src/platforms/discord/token-extractor.ts +46 -190
  379. package/src/platforms/discordbot/client.ts +1 -4
  380. package/src/platforms/discordbot/commands/auth.test.ts +3 -1
  381. package/src/platforms/discordbot/commands/channel.test.ts +3 -1
  382. package/src/platforms/discordbot/commands/message.test.ts +3 -1
  383. package/src/platforms/discordbot/commands/server.test.ts +3 -1
  384. package/src/platforms/discordbot/commands/snapshot.test.ts +43 -19
  385. package/src/platforms/discordbot/commands/snapshot.ts +54 -37
  386. package/src/platforms/discordbot/commands/thread.test.ts +3 -1
  387. package/src/platforms/discordbot/commands/user.test.ts +3 -1
  388. package/src/platforms/instagram/cli.ts +1 -4
  389. package/src/platforms/instagram/client.test.ts +3 -8
  390. package/src/platforms/instagram/client.ts +39 -34
  391. package/src/platforms/instagram/commands/auth.test.ts +13 -12
  392. package/src/platforms/instagram/commands/auth.ts +136 -71
  393. package/src/platforms/instagram/commands/chat.test.ts +21 -24
  394. package/src/platforms/instagram/commands/chat.ts +2 -0
  395. package/src/platforms/instagram/commands/message.test.ts +29 -24
  396. package/src/platforms/instagram/commands/message.ts +3 -4
  397. package/src/platforms/instagram/commands/shared.ts +2 -5
  398. package/src/platforms/instagram/commands/whoami.test.ts +4 -6
  399. package/src/platforms/instagram/credential-manager.ts +2 -6
  400. package/src/platforms/instagram/ensure-auth.test.ts +1 -4
  401. package/src/platforms/instagram/ensure-auth.ts +6 -3
  402. package/src/platforms/instagram/listener.test.ts +7 -3
  403. package/src/platforms/instagram/token-extractor.test.ts +4 -16
  404. package/src/platforms/instagram/token-extractor.ts +55 -309
  405. package/src/platforms/instagram/types.test.ts +2 -6
  406. package/src/platforms/instagram/types.ts +4 -2
  407. package/src/platforms/kakaotalk/auth/kakao-login.ts +30 -8
  408. package/src/platforms/kakaotalk/client.test.ts +37 -25
  409. package/src/platforms/kakaotalk/client.ts +23 -12
  410. package/src/platforms/kakaotalk/commands/auth.test.ts +6 -18
  411. package/src/platforms/kakaotalk/commands/auth.ts +101 -47
  412. package/src/platforms/kakaotalk/commands/chat.test.ts +8 -11
  413. package/src/platforms/kakaotalk/commands/message.test.ts +15 -24
  414. package/src/platforms/kakaotalk/commands/shared.ts +1 -0
  415. package/src/platforms/kakaotalk/commands/whoami.test.ts +6 -10
  416. package/src/platforms/kakaotalk/credential-manager.test.ts +1 -4
  417. package/src/platforms/kakaotalk/index.test.ts +1 -0
  418. package/src/platforms/kakaotalk/index.ts +0 -2
  419. package/src/platforms/kakaotalk/listener.test.ts +7 -1
  420. package/src/platforms/kakaotalk/protocol/connection.ts +4 -1
  421. package/src/platforms/kakaotalk/protocol/crypto.ts +1 -1
  422. package/src/platforms/kakaotalk/protocol/session.ts +12 -6
  423. package/src/platforms/kakaotalk/token-extractor.ts +5 -5
  424. package/src/platforms/kakaotalk/types.ts +8 -7
  425. package/src/platforms/line/cli.ts +1 -4
  426. package/src/platforms/line/client.ts +12 -20
  427. package/src/platforms/line/commands/auth.test.ts +2 -1
  428. package/src/platforms/line/commands/chat.test.ts +2 -1
  429. package/src/platforms/line/commands/chat.ts +1 -4
  430. package/src/platforms/line/commands/friend.test.ts +2 -1
  431. package/src/platforms/line/commands/message.test.ts +2 -1
  432. package/src/platforms/line/commands/message.ts +2 -9
  433. package/src/platforms/line/commands/whoami.test.ts +2 -1
  434. package/src/platforms/line/credential-manager.test.ts +1 -2
  435. package/src/platforms/line/index.test.ts +1 -0
  436. package/src/platforms/line/listener.ts +1 -1
  437. package/src/platforms/line/types.test.ts +1 -0
  438. package/src/platforms/slack/cli.ts +3 -1
  439. package/src/platforms/slack/client-mappers.ts +297 -0
  440. package/src/platforms/slack/client.test.ts +532 -17
  441. package/src/platforms/slack/client.ts +69 -458
  442. package/src/platforms/slack/commands/channel.ts +1 -4
  443. package/src/platforms/slack/commands/emoji.test.ts +6 -4
  444. package/src/platforms/slack/commands/emoji.ts +20 -22
  445. package/src/platforms/slack/commands/message.ts +6 -1
  446. package/src/platforms/slack/commands/pin.test.ts +14 -12
  447. package/src/platforms/slack/commands/reminder.ts +7 -6
  448. package/src/platforms/slack/commands/snapshot.test.ts +63 -8
  449. package/src/platforms/slack/commands/snapshot.ts +98 -66
  450. package/src/platforms/slack/commands/user.ts +6 -1
  451. package/src/platforms/slack/commands/usergroup.test.ts +3 -3
  452. package/src/platforms/slack/commands/usergroup.ts +10 -7
  453. package/src/platforms/slack/commands/whoami.test.ts +1 -1
  454. package/src/platforms/slack/commands/whoami.ts +2 -0
  455. package/src/platforms/slack/index.ts +0 -2
  456. package/src/platforms/slack/listener.test.ts +1 -0
  457. package/src/platforms/slack/token-extractor.test.ts +7 -12
  458. package/src/platforms/slack/token-extractor.ts +47 -255
  459. package/src/platforms/slackbot/cli.ts +8 -1
  460. package/src/platforms/slackbot/commands/auth.test.ts +3 -1
  461. package/src/platforms/teams/client.ts +1 -1
  462. package/src/platforms/teams/commands/auth.test.ts +1 -1
  463. package/src/platforms/teams/commands/auth.ts +4 -1
  464. package/src/platforms/teams/commands/snapshot.test.ts +1 -1
  465. package/src/platforms/teams/commands/snapshot.ts +53 -38
  466. package/src/platforms/teams/commands/whoami.test.ts +2 -4
  467. package/src/platforms/teams/commands/whoami.ts +2 -0
  468. package/src/platforms/teams/index.ts +0 -1
  469. package/src/platforms/teams/token-extractor.ts +82 -350
  470. package/src/platforms/telegram/app-config.test.ts +1 -0
  471. package/src/platforms/telegram/chat-utils.test.ts +5 -1
  472. package/src/platforms/telegram/cli.ts +2 -4
  473. package/src/platforms/telegram/client.test.ts +16 -3
  474. package/src/platforms/telegram/client.ts +14 -4
  475. package/src/platforms/telegram/commands/auth.test.ts +1 -0
  476. package/src/platforms/telegram/commands/auth.ts +3 -4
  477. package/src/platforms/telegram/commands/chat.test.ts +2 -5
  478. package/src/platforms/telegram/commands/chat.ts +1 -0
  479. package/src/platforms/telegram/commands/message.test.ts +2 -5
  480. package/src/platforms/telegram/commands/message.ts +1 -0
  481. package/src/platforms/telegram/commands/shared.test.ts +1 -0
  482. package/src/platforms/telegram/commands/whoami.test.ts +5 -7
  483. package/src/platforms/telegram/commands/whoami.ts +1 -1
  484. package/src/platforms/telegram/credential-manager.test.ts +1 -0
  485. package/src/platforms/telegram/credential-manager.ts +11 -2
  486. package/src/platforms/telegram/my-telegram-org.ts +6 -2
  487. package/src/platforms/telegram/types.test.ts +1 -0
  488. package/src/platforms/webex/app-config.test.ts +1 -0
  489. package/src/platforms/webex/cli.ts +1 -4
  490. package/src/platforms/webex/client.test.ts +4 -12
  491. package/src/platforms/webex/client.ts +14 -52
  492. package/src/platforms/webex/commands/auth.test.ts +7 -1
  493. package/src/platforms/webex/commands/auth.ts +12 -15
  494. package/src/platforms/webex/commands/member.test.ts +1 -3
  495. package/src/platforms/webex/commands/member.ts +14 -19
  496. package/src/platforms/webex/commands/message.ts +4 -15
  497. package/src/platforms/webex/commands/snapshot.test.ts +42 -4
  498. package/src/platforms/webex/commands/snapshot.ts +19 -11
  499. package/src/platforms/webex/commands/space.test.ts +3 -3
  500. package/src/platforms/webex/commands/space.ts +2 -9
  501. package/src/platforms/webex/commands/whoami.test.ts +12 -5
  502. package/src/platforms/webex/commands/whoami.ts +2 -0
  503. package/src/platforms/webex/credential-manager.ts +11 -2
  504. package/src/platforms/webex/ensure-auth.ts +1 -3
  505. package/src/platforms/webex/index.ts +1 -7
  506. package/src/platforms/webex/markdown-to-html.test.ts +6 -18
  507. package/src/platforms/webex/markdown-to-html.ts +8 -8
  508. package/src/platforms/webex/token-extractor.ts +6 -29
  509. package/src/platforms/wechatbot/client.test.ts +6 -2
  510. package/src/platforms/wechatbot/client.ts +6 -1
  511. package/src/platforms/wechatbot/commands/auth.test.ts +3 -7
  512. package/src/platforms/wechatbot/commands/message.test.ts +1 -4
  513. package/src/platforms/wechatbot/commands/message.ts +5 -1
  514. package/src/platforms/wechatbot/commands/template.test.ts +1 -4
  515. package/src/platforms/wechatbot/commands/user.test.ts +2 -7
  516. package/src/platforms/whatsapp/cli.ts +1 -4
  517. package/src/platforms/whatsapp/commands/auth.test.ts +19 -22
  518. package/src/platforms/whatsapp/commands/chat.test.ts +21 -24
  519. package/src/platforms/whatsapp/commands/chat.ts +2 -0
  520. package/src/platforms/whatsapp/commands/message.test.ts +22 -24
  521. package/src/platforms/whatsapp/commands/message.ts +3 -5
  522. package/src/platforms/whatsapp/commands/shared.ts +2 -5
  523. package/src/platforms/whatsapp/commands/whoami.test.ts +2 -2
  524. package/src/platforms/whatsapp/credential-manager.ts +2 -6
  525. package/src/platforms/whatsapp/ensure-auth.test.ts +1 -4
  526. package/src/platforms/whatsapp/ensure-auth.ts +14 -6
  527. package/src/platforms/whatsapp/index.ts +0 -2
  528. package/src/platforms/whatsappbot/client.test.ts +13 -7
  529. package/src/platforms/whatsappbot/client.ts +18 -4
  530. package/src/platforms/whatsappbot/commands/auth.ts +4 -1
  531. package/src/platforms/whatsappbot/commands/message.test.ts +12 -2
  532. package/src/platforms/whatsappbot/commands/message.ts +16 -3
  533. package/src/platforms/whatsappbot/commands/shared.ts +3 -1
  534. package/src/platforms/whatsappbot/commands/whoami.test.ts +1 -3
  535. package/src/platforms/whatsappbot/index.ts +0 -2
  536. package/src/shared/chromium/browsers.test.ts +274 -0
  537. package/src/shared/chromium/browsers.ts +86 -0
  538. package/src/shared/chromium/cookie-reader.test.ts +274 -0
  539. package/src/shared/chromium/cookie-reader.ts +111 -0
  540. package/src/shared/chromium/decryptor.test.ts +449 -0
  541. package/src/shared/chromium/decryptor.ts +227 -0
  542. package/src/shared/chromium/index.ts +11 -0
  543. package/src/shared/chromium/types.ts +11 -0
  544. package/src/shared/utils/derived-key-cache.ts +1 -1
  545. package/src/shared/utils/linux-keyring.ts +4 -4
  546. package/src/tui/adapters/kakaotalk-adapter.ts +6 -1
  547. package/src/tui/adapters/telegram-adapter.ts +1 -1
  548. package/src/tui/adapters/webex-adapter.ts +1 -1
  549. package/src/tui/app.ts +149 -59
  550. package/src/tui/utils.test.ts +144 -145
  551. package/src/tui/utils.ts +27 -29
  552. package/src/tui/views/channel-picker.ts +1 -1
  553. package/src/tui/views/workspace-picker.ts +1 -1
@@ -1,4 +1,5 @@
1
1
  import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:test'
2
+
2
3
  import { WebexError } from '../types'
3
4
 
4
5
  const mockHandleError = mock((err: Error) => {
@@ -10,12 +11,36 @@ mock.module('@/shared/utils/error-handler', () => ({
10
11
  }))
11
12
 
12
13
  const mockSpaces = [
13
- { id: 'space-1', title: 'General', type: 'group', isLocked: false, lastActivity: '2024-01-15T00:00:00.000Z', created: '2024-01-01T00:00:00.000Z', creatorId: 'person-1' },
14
- { id: 'space-2', title: 'Random', type: 'group', isLocked: false, lastActivity: '2024-01-14T00:00:00.000Z', created: '2024-01-01T00:00:00.000Z', creatorId: 'person-1' },
14
+ {
15
+ id: 'space-1',
16
+ title: 'General',
17
+ type: 'group',
18
+ isLocked: false,
19
+ lastActivity: '2024-01-15T00:00:00.000Z',
20
+ created: '2024-01-01T00:00:00.000Z',
21
+ creatorId: 'person-1',
22
+ },
23
+ {
24
+ id: 'space-2',
25
+ title: 'Random',
26
+ type: 'group',
27
+ isLocked: false,
28
+ lastActivity: '2024-01-14T00:00:00.000Z',
29
+ created: '2024-01-01T00:00:00.000Z',
30
+ creatorId: 'person-1',
31
+ },
15
32
  ]
16
33
 
17
34
  const mockMyMemberships = [
18
- { id: 'mem-1', roomId: 'space-1', personId: 'person-1', personEmail: 'alice@example.com', personDisplayName: 'Alice', isModerator: true, created: '2024-01-01T00:00:00.000Z' },
35
+ {
36
+ id: 'mem-1',
37
+ roomId: 'space-1',
38
+ personId: 'person-1',
39
+ personEmail: 'alice@example.com',
40
+ personDisplayName: 'Alice',
41
+ isModerator: true,
42
+ created: '2024-01-01T00:00:00.000Z',
43
+ },
19
44
  ]
20
45
 
21
46
  const mockListSpaces = mock(() => Promise.resolve(mockSpaces as any))
@@ -54,9 +79,21 @@ describe('snapshot command', () => {
54
79
  consoleSpy.mockRestore()
55
80
  })
56
81
 
57
- test('returns spaces with id, title, type, lastActivity', async () => {
82
+ test('brief snapshot returns spaces with id and title only', async () => {
58
83
  await snapshotAction({})
59
84
 
85
+ expect(consoleSpy).toHaveBeenCalled()
86
+ const output = JSON.parse(consoleSpy.mock.calls[consoleSpy.mock.calls.length - 1][0])
87
+ expect(output.spaces).toHaveLength(1)
88
+ expect(output.spaces[0].id).toBe('space-1')
89
+ expect(output.spaces[0].title).toBe('General')
90
+ expect(output.spaces[0].type).toBeUndefined()
91
+ expect(output.hint).toBeDefined()
92
+ })
93
+
94
+ test('full snapshot returns spaces with id, title, type, lastActivity', async () => {
95
+ await snapshotAction({ full: true })
96
+
60
97
  expect(consoleSpy).toHaveBeenCalled()
61
98
  const output = JSON.parse(consoleSpy.mock.calls[consoleSpy.mock.calls.length - 1][0])
62
99
  expect(output.spaces).toHaveLength(1)
@@ -64,6 +101,7 @@ describe('snapshot command', () => {
64
101
  expect(output.spaces[0].title).toBe('General')
65
102
  expect(output.spaces[0].type).toBe('group')
66
103
  expect(output.spaces[0].lastActivity).toBe('2024-01-15T00:00:00.000Z')
104
+ expect(output.hint).toBeUndefined()
67
105
  })
68
106
 
69
107
  test('filters spaces to only those in my memberships', async () => {
@@ -1,11 +1,11 @@
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 { WebexClient } from '../client'
5
7
 
6
- export async function snapshotAction(options: {
7
- pretty?: boolean
8
- }): Promise<void> {
8
+ export async function snapshotAction(options: { full?: boolean; pretty?: boolean }): Promise<void> {
9
9
  try {
10
10
  const client = await new WebexClient().login()
11
11
 
@@ -15,13 +15,19 @@ export async function snapshotAction(options: {
15
15
  const allSpaces = await client.listSpaces({ max: 100 })
16
16
  const spaces = allSpaces.filter((s) => myRoomIds.has(s.id))
17
17
 
18
- const snapshot = {
19
- spaces: spaces.map((s) => ({
20
- id: s.id,
21
- title: s.title,
22
- type: s.type,
23
- lastActivity: s.lastActivity,
24
- })),
18
+ const snapshot: Record<string, any> = {
19
+ spaces: options.full
20
+ ? spaces.map((s) => ({
21
+ id: s.id,
22
+ title: s.title,
23
+ type: s.type,
24
+ lastActivity: s.lastActivity,
25
+ }))
26
+ : spaces.map((s) => ({ id: s.id, title: s.title })),
27
+ }
28
+
29
+ if (!options.full) {
30
+ snapshot.hint = "Use 'message list <space>' for messages, 'space info <space>' for space details."
25
31
  }
26
32
 
27
33
  console.log(formatOutput(snapshot, options.pretty))
@@ -31,10 +37,12 @@ export async function snapshotAction(options: {
31
37
  }
32
38
 
33
39
  export const snapshotCommand = new Command('snapshot')
34
- .description('Get workspace spaces overview for AI agents')
40
+ .description('Get workspace overview for AI agents (brief by default, use --full for comprehensive data)')
41
+ .option('--full', 'Include full space details (verbose)')
35
42
  .option('--pretty', 'Pretty print JSON output')
36
43
  .action(async (options) => {
37
44
  await snapshotAction({
45
+ full: options.full,
38
46
  pretty: options.pretty,
39
47
  })
40
48
  })
@@ -59,9 +59,9 @@ let consoleLogSpy: ReturnType<typeof spyOn>
59
59
  beforeEach(() => {
60
60
  mockListSpaces.mockReset().mockImplementation(() => Promise.resolve(mockSpaces))
61
61
  mockGetSpace.mockReset().mockImplementation(() => Promise.resolve(mockSpace))
62
- mockLogin.mockReset().mockImplementation(() =>
63
- Promise.resolve({ listSpaces: mockListSpaces, getSpace: mockGetSpace }),
64
- )
62
+ mockLogin
63
+ .mockReset()
64
+ .mockImplementation(() => Promise.resolve({ listSpaces: mockListSpaces, getSpace: mockGetSpace }))
65
65
  mockHandleError.mockReset().mockImplementation((err: Error) => {
66
66
  throw err
67
67
  })
@@ -5,11 +5,7 @@ import { formatOutput } from '@/shared/utils/output'
5
5
 
6
6
  import { WebexClient } from '../client'
7
7
 
8
- export async function listAction(options: {
9
- type?: string
10
- limit?: number
11
- pretty?: boolean
12
- }): Promise<void> {
8
+ export async function listAction(options: { type?: string; limit?: number; pretty?: boolean }): Promise<void> {
13
9
  try {
14
10
  const client = await new WebexClient().login()
15
11
  const spaces = await client.listSpaces({ type: options.type, max: options.limit })
@@ -26,10 +22,7 @@ export async function listAction(options: {
26
22
  }
27
23
  }
28
24
 
29
- export async function infoAction(
30
- spaceId: string,
31
- options: { pretty?: boolean },
32
- ): Promise<void> {
25
+ export async function infoAction(spaceId: string, options: { pretty?: boolean }): Promise<void> {
33
26
  try {
34
27
  const client = await new WebexClient().login()
35
28
  const space = await client.getSpace(spaceId)
@@ -18,7 +18,9 @@ const mockUser = {
18
18
  }
19
19
 
20
20
  const makeFakeClient = () => ({
21
- login: async function (this: unknown) { return this },
21
+ login: async function (this: unknown) {
22
+ return this
23
+ },
22
24
  testAuth: async () => mockUser,
23
25
  })
24
26
 
@@ -100,10 +102,15 @@ test('whoami outputs pretty-printed JSON when --pretty flag is passed', async ()
100
102
 
101
103
  test('whoami exits with code 1 when not authenticated', async () => {
102
104
  // given: no credentials
103
- webexClientSpy.mockImplementation(() => ({
104
- login: async () => { throw new WebexError('No Webex credentials found.', 'no_credentials') },
105
- testAuth: async () => mockUser,
106
- }) as unknown as clientModule.WebexClient)
105
+ webexClientSpy.mockImplementation(
106
+ () =>
107
+ ({
108
+ login: async () => {
109
+ throw new WebexError('No Webex credentials found.', 'no_credentials')
110
+ },
111
+ testAuth: async () => mockUser,
112
+ }) as unknown as clientModule.WebexClient,
113
+ )
107
114
 
108
115
  // when: running whoami
109
116
  await whoamiCommand.parseAsync([], { from: 'user' })
@@ -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 { WebexClient } from '../client'
5
7
 
6
8
  export async function whoamiAction(options: { pretty?: boolean }): Promise<void> {
@@ -95,7 +95,10 @@ export class WebexCredentialManager {
95
95
  }
96
96
  }
97
97
 
98
- async requestDeviceCode(clientId: string, scopes?: string): Promise<{
98
+ async requestDeviceCode(
99
+ clientId: string,
100
+ scopes?: string,
101
+ ): Promise<{
99
102
  deviceCode: string
100
103
  userCode: string
101
104
  verificationUri: string
@@ -136,7 +139,13 @@ export class WebexCredentialManager {
136
139
  }
137
140
  }
138
141
 
139
- async pollDeviceToken(deviceCode: string, interval: number, expiresIn: number, clientId: string, clientSecret?: string): Promise<WebexConfig> {
142
+ async pollDeviceToken(
143
+ deviceCode: string,
144
+ interval: number,
145
+ expiresIn: number,
146
+ clientId: string,
147
+ clientSecret?: string,
148
+ ): Promise<WebexConfig> {
140
149
  const basicAuth = btoa(`${clientId}:${clientSecret ?? ''}`)
141
150
  const deadline = Date.now() + expiresIn * 1000
142
151
 
@@ -32,9 +32,7 @@ export async function ensureWebexAuth(): Promise<void> {
32
32
  tokenType: 'extracted',
33
33
  deviceUrl: extracted.deviceUrl,
34
34
  userId: extracted.userId,
35
- encryptionKeys: extracted.encryptionKeys
36
- ? Object.fromEntries(extracted.encryptionKeys)
37
- : undefined,
35
+ encryptionKeys: extracted.encryptionKeys ? Object.fromEntries(extracted.encryptionKeys) : undefined,
38
36
  })
39
37
  } catch {
40
38
  // Intentionally silent — best-effort preflight that should not block commands
@@ -3,13 +3,7 @@ export { WebexCredentialManager } from './credential-manager'
3
3
  export { WebexTokenExtractor } from './token-extractor'
4
4
  export type { ExtractedWebexToken } from './token-extractor'
5
5
  export { WebexError } from './types'
6
- export type {
7
- WebexConfig,
8
- WebexMembership,
9
- WebexMessage,
10
- WebexPerson,
11
- WebexSpace,
12
- } from './types'
6
+ export type { WebexConfig, WebexMembership, WebexMessage, WebexPerson, WebexSpace } from './types'
13
7
  export {
14
8
  WebexConfigSchema,
15
9
  WebexMembershipSchema,
@@ -30,15 +30,11 @@ describe('markdownToHtml', () => {
30
30
  })
31
31
 
32
32
  test('converts code blocks without language', () => {
33
- expect(markdownToHtml('```\nconst x = 1 & 2\n```')).toBe(
34
- '<pre><code>const x = 1 &amp; 2</code></pre>',
35
- )
33
+ expect(markdownToHtml('```\nconst x = 1 & 2\n```')).toBe('<pre><code>const x = 1 &amp; 2</code></pre>')
36
34
  })
37
35
 
38
36
  test('does not process markdown inside code blocks', () => {
39
- expect(markdownToHtml('```\n**bold** _italic_\n```')).toBe(
40
- '<pre><code>**bold** _italic_</code></pre>',
41
- )
37
+ expect(markdownToHtml('```\n**bold** _italic_\n```')).toBe('<pre><code>**bold** _italic_</code></pre>')
42
38
  })
43
39
 
44
40
  test('converts links', () => {
@@ -56,15 +52,11 @@ describe('markdownToHtml', () => {
56
52
  })
57
53
 
58
54
  test('allows mailto: links', () => {
59
- expect(markdownToHtml('[email](mailto:a@b.com)')).toBe(
60
- '<a href="mailto:a@b.com">email</a>',
61
- )
55
+ expect(markdownToHtml('[email](mailto:a@b.com)')).toBe('<a href="mailto:a@b.com">email</a>')
62
56
  })
63
57
 
64
58
  test('escapes quotes in URLs to prevent attribute breakout', () => {
65
- expect(markdownToHtml('[x](https://a.com?q="test")')).toBe(
66
- '<a href="https://a.com?q=&quot;test&quot;">x</a>',
67
- )
59
+ expect(markdownToHtml('[x](https://a.com?q="test")')).toBe('<a href="https://a.com?q=&quot;test&quot;">x</a>')
68
60
  })
69
61
 
70
62
  test('converts unordered lists', () => {
@@ -92,9 +84,7 @@ describe('markdownToHtml', () => {
92
84
  })
93
85
 
94
86
  test('supports nested formatting', () => {
95
- expect(markdownToHtml('**bold _and italic_**')).toBe(
96
- '<strong>bold <em>and italic</em></strong>',
97
- )
87
+ expect(markdownToHtml('**bold _and italic_**')).toBe('<strong>bold <em>and italic</em></strong>')
98
88
  })
99
89
 
100
90
  test('escapes html special characters in text', () => {
@@ -134,9 +124,7 @@ describe('stripMarkdown', () => {
134
124
  })
135
125
 
136
126
  test('strips block markdown syntax', () => {
137
- expect(stripMarkdown('# Title\n> quote\n- item\n1. first\n---')).toBe(
138
- 'Title\nquote\nitem\nfirst\n',
139
- )
127
+ expect(stripMarkdown('# Title\n> quote\n- item\n1. first\n---')).toBe('Title\nquote\nitem\nfirst\n')
140
128
  })
141
129
 
142
130
  test('keeps code block content', () => {
@@ -129,10 +129,7 @@ function processInline(markdown: string): string {
129
129
  if (!isSafeUrl(url)) {
130
130
  return processInline(label)
131
131
  }
132
- return createInlinePlaceholder(
133
- placeholders,
134
- `<a href="${escapeHtml(url)}">${processInline(label)}</a>`,
135
- )
132
+ return createInlinePlaceholder(placeholders, `<a href="${escapeHtml(url)}">${processInline(label)}</a>`)
136
133
  })
137
134
 
138
135
  text = escapeHtml(text)
@@ -145,10 +142,13 @@ function processInline(markdown: string): string {
145
142
 
146
143
  function extractCodeBlocks(markdown: string): { text: string; blocks: string[] } {
147
144
  const blocks: string[] = []
148
- const text = markdown.replace(/```([a-zA-Z0-9_-]+)?\n([\s\S]*?)\n```/g, (_, language: string | undefined, code: string) => {
149
- const className = language ? ` class="language-${escapeHtml(language)}"` : ''
150
- return createBlockPlaceholder(blocks, `<pre><code${className}>${escapeHtml(code)}</code></pre>`)
151
- })
145
+ const text = markdown.replace(
146
+ /```([a-zA-Z0-9_-]+)?\n([\s\S]*?)\n```/g,
147
+ (_, language: string | undefined, code: string) => {
148
+ const className = language ? ` class="language-${escapeHtml(language)}"` : ''
149
+ return createBlockPlaceholder(blocks, `<pre><code${className}>${escapeHtml(code)}</code></pre>`)
150
+ },
151
+ )
152
152
 
153
153
  return { text, blocks }
154
154
  }
@@ -1,12 +1,4 @@
1
- import {
2
- copyFileSync,
3
- existsSync,
4
- mkdirSync,
5
- readdirSync,
6
- readFileSync,
7
- rmSync,
8
- statSync,
9
- } from 'node:fs'
1
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync } from 'node:fs'
10
2
  import { homedir, tmpdir } from 'node:os'
11
3
  import { join } from 'node:path'
12
4
 
@@ -73,8 +65,6 @@ const BROWSERS: BrowserConfig[] = [
73
65
  },
74
66
  ]
75
67
 
76
- const WEBEX_STORAGE_KEY = '_https://web.webex.com\x00\x01webex-web-client-bounded'
77
-
78
68
  interface ScanResult {
79
69
  token: ExtractedWebexToken | null
80
70
  encryptionKeys: Map<string, string>
@@ -128,10 +118,7 @@ export class WebexTokenExtractor {
128
118
  case 'win32':
129
119
  relative = browser.win32
130
120
  if (!relative) return null
131
- return join(
132
- process.env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local'),
133
- relative,
134
- )
121
+ return join(process.env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local'), relative)
135
122
  default:
136
123
  return null
137
124
  }
@@ -176,8 +163,7 @@ export class WebexTokenExtractor {
176
163
  for (const leveldbDir of profileDirs) {
177
164
  this.debug(`Scanning: ${leveldbDir}`)
178
165
 
179
- const result = await this.scanViaClassicLevelCopy(leveldbDir)
180
- ?? this.scanRawFiles(leveldbDir)
166
+ const result = (await this.scanViaClassicLevelCopy(leveldbDir)) ?? this.scanRawFiles(leveldbDir)
181
167
 
182
168
  if (result?.token) {
183
169
  this.debug(`Found token in: ${leveldbDir}`)
@@ -339,9 +325,7 @@ export class WebexTokenExtractor {
339
325
  const innermostMarkerIdx = content.indexOf('"supertoken"')
340
326
 
341
327
  const markerIdx =
342
- outerObjectMarkerIdx !== -1 ? outerObjectMarkerIdx
343
- : innermostMarkerIdx !== -1 ? innermostMarkerIdx
344
- : -1
328
+ outerObjectMarkerIdx !== -1 ? outerObjectMarkerIdx : innermostMarkerIdx !== -1 ? innermostMarkerIdx : -1
345
329
 
346
330
  if (markerIdx === -1) return null
347
331
 
@@ -387,11 +371,7 @@ export class WebexTokenExtractor {
387
371
  try {
388
372
  const data = JSON.parse(jsonStr)
389
373
 
390
- const supertoken =
391
- data?.Credentials?.['@']?.supertoken ??
392
- data?.['@']?.supertoken ??
393
- data?.supertoken ??
394
- null
374
+ const supertoken = data?.Credentials?.['@']?.supertoken ?? data?.['@']?.supertoken ?? data?.supertoken ?? null
395
375
 
396
376
  if (!supertoken?.access_token) return null
397
377
 
@@ -410,10 +390,7 @@ export class WebexTokenExtractor {
410
390
  result.expiresAt = Date.now() + supertoken.expires_in * 1000
411
391
  }
412
392
 
413
- const deviceUrl =
414
- data?.Device?.['@']?.url ??
415
- data?.['@']?.deviceUrl ??
416
- null
393
+ const deviceUrl = data?.Device?.['@']?.url ?? data?.['@']?.deviceUrl ?? null
417
394
  if (deviceUrl && typeof deviceUrl === 'string') {
418
395
  result.deviceUrl = deviceUrl
419
396
  }
@@ -50,12 +50,16 @@ describe('WeChatBotClient', () => {
50
50
  describe('login', () => {
51
51
  test('throws on empty appId', async () => {
52
52
  await expect(new WeChatBotClient().login({ appId: '', appSecret: 'secret' })).rejects.toThrow(WeChatBotError)
53
- await expect(new WeChatBotClient().login({ appId: '', appSecret: 'secret' })).rejects.toThrow('App ID is required')
53
+ await expect(new WeChatBotClient().login({ appId: '', appSecret: 'secret' })).rejects.toThrow(
54
+ 'App ID is required',
55
+ )
54
56
  })
55
57
 
56
58
  test('throws on empty appSecret', async () => {
57
59
  await expect(new WeChatBotClient().login({ appId: 'wx123', appSecret: '' })).rejects.toThrow(WeChatBotError)
58
- await expect(new WeChatBotClient().login({ appId: 'wx123', appSecret: '' })).rejects.toThrow('App Secret is required')
60
+ await expect(new WeChatBotClient().login({ appId: 'wx123', appSecret: '' })).rejects.toThrow(
61
+ 'App Secret is required',
62
+ )
59
63
  })
60
64
 
61
65
  test('accepts valid credentials and returns client', async () => {
@@ -62,7 +62,12 @@ export class WeChatBotClient {
62
62
  throw new WeChatBotError(`Network error fetching access token: ${msg}`, 'network_error')
63
63
  }
64
64
 
65
- const data = (await response.json()) as { access_token?: string; expires_in?: number; errcode?: number; errmsg?: string }
65
+ const data = (await response.json()) as {
66
+ access_token?: string
67
+ expires_in?: number
68
+ errcode?: number
69
+ errmsg?: string
70
+ }
66
71
 
67
72
  if (data.errcode) {
68
73
  throw new WeChatBotError(data.errmsg ?? `Error ${data.errcode}`, String(data.errcode))
@@ -13,17 +13,13 @@ mock.module('../client', () => ({
13
13
  },
14
14
  }))
15
15
 
16
- const { setAction, statusAction, clearAction, listAction, useAction, removeAction } = await import(
17
- '@/platforms/wechatbot/commands/auth'
18
- )
16
+ const { setAction, statusAction, clearAction, listAction, useAction, removeAction } =
17
+ await import('@/platforms/wechatbot/commands/auth')
19
18
 
20
19
  const testDirs: string[] = []
21
20
 
22
21
  function makeCredManager(): WeChatBotCredentialManager {
23
- const dir = join(
24
- import.meta.dir,
25
- `.test-auth-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
26
- )
22
+ const dir = join(import.meta.dir, `.test-auth-config-${Date.now()}-${Math.random().toString(36).slice(2)}`)
27
23
  testDirs.push(dir)
28
24
  return new WeChatBotCredentialManager(dir)
29
25
  }
@@ -24,10 +24,7 @@ const { sendAction, sendNewsAction } = await import('@/platforms/wechatbot/comma
24
24
  const testDirs: string[] = []
25
25
 
26
26
  function makeCredManager(): WeChatBotCredentialManager {
27
- const dir = join(
28
- import.meta.dir,
29
- `.test-message-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
30
- )
27
+ const dir = join(import.meta.dir, `.test-message-config-${Date.now()}-${Math.random().toString(36).slice(2)}`)
31
28
  testDirs.push(dir)
32
29
  const manager = new WeChatBotCredentialManager(dir)
33
30
  return manager
@@ -28,7 +28,11 @@ export async function sendAction(openId: string, text: string, options: MessageO
28
28
  }
29
29
  }
30
30
 
31
- export async function sendImageAction(openId: string, mediaId: string, options: MessageOptions): Promise<MessageResult> {
31
+ export async function sendImageAction(
32
+ openId: string,
33
+ mediaId: string,
34
+ options: MessageOptions,
35
+ ): Promise<MessageResult> {
32
36
  try {
33
37
  const client = await getClient(options)
34
38
  await client.sendImageMessage(openId, mediaId)
@@ -31,10 +31,7 @@ const { listAction } = await import('@/platforms/wechatbot/commands/template')
31
31
  const testDirs: string[] = []
32
32
 
33
33
  function makeCredManager(): WeChatBotCredentialManager {
34
- const dir = join(
35
- import.meta.dir,
36
- `.test-template-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
37
- )
34
+ const dir = join(import.meta.dir, `.test-template-config-${Date.now()}-${Math.random().toString(36).slice(2)}`)
38
35
  testDirs.push(dir)
39
36
  return new WeChatBotCredentialManager(dir)
40
37
  }
@@ -38,10 +38,7 @@ const { listAction } = await import('@/platforms/wechatbot/commands/user')
38
38
  const testDirs: string[] = []
39
39
 
40
40
  function makeCredManager(): WeChatBotCredentialManager {
41
- const dir = join(
42
- import.meta.dir,
43
- `.test-user-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
44
- )
41
+ const dir = join(import.meta.dir, `.test-user-config-${Date.now()}-${Math.random().toString(36).slice(2)}`)
45
42
  testDirs.push(dir)
46
43
  return new WeChatBotCredentialManager(dir)
47
44
  }
@@ -88,9 +85,7 @@ describe('listAction (user)', () => {
88
85
  })
89
86
 
90
87
  test('passes nextOpenid option to client', async () => {
91
- const getFollowersMock = mock(() =>
92
- Promise.resolve({ total: 1, count: 1, openids: ['openid-3'], next_openid: '' }),
93
- )
88
+ const getFollowersMock = mock(() => Promise.resolve({ total: 1, count: 1, openids: ['openid-3'], next_openid: '' }))
94
89
  mock.module('../client', () => ({
95
90
  WeChatBotClient: class MockWeChatBotClient {
96
91
  async login() {
@@ -19,10 +19,7 @@ function isAuthCommand(command: CommandType): boolean {
19
19
 
20
20
  const program = new Command()
21
21
 
22
- program
23
- .name('agent-whatsapp')
24
- .description('CLI tool for WhatsApp via Baileys (linked device)')
25
- .version(pkg.version)
22
+ program.name('agent-whatsapp').description('CLI tool for WhatsApp via Baileys (linked device)').version(pkg.version)
26
23
 
27
24
  program.hook('preAction', async (_thisCommand, actionCommand) => {
28
25
  if (isAuthCommand(actionCommand)) return