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
@@ -173,10 +173,7 @@ async function usersAction(channel: string, options: { includeBots?: boolean; pr
173
173
  }
174
174
  }
175
175
 
176
- async function createAction(
177
- name: string,
178
- options: { private?: boolean; pretty?: boolean },
179
- ): Promise<void> {
176
+ async function createAction(name: string, options: { private?: boolean; pretty?: boolean }): Promise<void> {
180
177
  try {
181
178
  const credManager = new CredentialManager()
182
179
  const workspace = await credManager.getWorkspace()
@@ -7,10 +7,12 @@ describe('Emoji Commands', () => {
7
7
 
8
8
  beforeEach(() => {
9
9
  mockClient = {
10
- listEmoji: mock(async (): Promise<Record<string, string>> => ({
11
- party_blob: 'https://example.com/party_blob.gif',
12
- cool_sunglasses: 'https://example.com/cool_sunglasses.png',
13
- })),
10
+ listEmoji: mock(
11
+ async (): Promise<Record<string, string>> => ({
12
+ party_blob: 'https://example.com/party_blob.gif',
13
+ cool_sunglasses: 'https://example.com/cool_sunglasses.png',
14
+ }),
15
+ ),
14
16
  }
15
17
  })
16
18
 
@@ -6,28 +6,26 @@ import { formatOutput } from '@/shared/utils/output'
6
6
  import { SlackClient } from '../client'
7
7
  import { CredentialManager } from '../credential-manager'
8
8
 
9
- export const emojiCommand = new Command('emoji')
10
- .description('Emoji commands')
11
- .addCommand(
12
- new Command('list')
13
- .description('List all custom emoji in workspace')
14
- .option('--pretty', 'Pretty print JSON output')
15
- .action(async (options) => {
16
- try {
17
- const credManager = new CredentialManager()
18
- const ws = await credManager.getWorkspace()
9
+ export const emojiCommand = new Command('emoji').description('Emoji commands').addCommand(
10
+ new Command('list')
11
+ .description('List all custom emoji in workspace')
12
+ .option('--pretty', 'Pretty print JSON output')
13
+ .action(async (options) => {
14
+ try {
15
+ const credManager = new CredentialManager()
16
+ const ws = await credManager.getWorkspace()
19
17
 
20
- if (!ws) {
21
- console.log(formatOutput({ error: 'No current workspace set. Run "auth extract" first.' }, options.pretty))
22
- process.exit(1)
23
- }
18
+ if (!ws) {
19
+ console.log(formatOutput({ error: 'No current workspace set. Run "auth extract" first.' }, options.pretty))
20
+ process.exit(1)
21
+ }
24
22
 
25
- const client = await new SlackClient().login({ token: ws.token, cookie: ws.cookie })
26
- const emoji = await client.listEmoji()
23
+ const client = await new SlackClient().login({ token: ws.token, cookie: ws.cookie })
24
+ const emoji = await client.listEmoji()
27
25
 
28
- console.log(formatOutput(emoji, options.pretty))
29
- } catch (error) {
30
- handleError(error as Error)
31
- }
32
- }),
33
- )
26
+ console.log(formatOutput(emoji, options.pretty))
27
+ } catch (error) {
28
+ handleError(error as Error)
29
+ }
30
+ }),
31
+ )
@@ -270,7 +270,12 @@ async function scheduleAction(
270
270
 
271
271
  const postAtTimestamp = Number(postAt)
272
272
  if (!Number.isInteger(postAtTimestamp) || postAtTimestamp <= 0) {
273
- console.log(formatOutput({ error: 'Invalid post-at value. Use a Unix timestamp in seconds (e.g. 1700000000).' }, options.pretty))
273
+ console.log(
274
+ formatOutput(
275
+ { error: 'Invalid post-at value. Use a Unix timestamp in seconds (e.g. 1700000000).' },
276
+ options.pretty,
277
+ ),
278
+ )
274
279
  process.exit(1)
275
280
  }
276
281
 
@@ -10,19 +10,21 @@ describe('Pin Commands', () => {
10
10
  mockClient = {
11
11
  pinMessage: mock(async () => {}),
12
12
  unpinMessage: mock(async () => {}),
13
- listPins: mock(async (): Promise<SlackPin[]> => [
14
- {
15
- channel: 'C001',
16
- message: {
17
- ts: '1234567890.123456',
18
- text: 'Pinned message',
19
- user: 'U001',
20
- type: 'message',
13
+ listPins: mock(
14
+ async (): Promise<SlackPin[]> => [
15
+ {
16
+ channel: 'C001',
17
+ message: {
18
+ ts: '1234567890.123456',
19
+ text: 'Pinned message',
20
+ user: 'U001',
21
+ type: 'message',
22
+ },
23
+ date_created: 1234567890,
24
+ created_by: 'U001',
21
25
  },
22
- date_created: 1234567890,
23
- created_by: 'U001',
24
- },
25
- ]),
26
+ ],
27
+ ),
26
28
  }
27
29
  })
28
30
 
@@ -6,11 +6,7 @@ import { formatOutput } from '@/shared/utils/output'
6
6
  import { SlackClient } from '../client'
7
7
  import { CredentialManager } from '../credential-manager'
8
8
 
9
- async function addAction(
10
- text: string,
11
- time: string,
12
- options: { user?: string; pretty?: boolean },
13
- ): Promise<void> {
9
+ async function addAction(text: string, time: string, options: { user?: string; pretty?: boolean }): Promise<void> {
14
10
  try {
15
11
  const credManager = new CredentialManager()
16
12
  const ws = await credManager.getWorkspace()
@@ -22,7 +18,12 @@ async function addAction(
22
18
 
23
19
  const timeValue = Number(time)
24
20
  if (!Number.isInteger(timeValue) || timeValue <= 0) {
25
- console.log(formatOutput({ error: 'Invalid time value. Use a Unix timestamp in seconds (e.g. 1700000000).' }, options.pretty))
21
+ console.log(
22
+ formatOutput(
23
+ { error: 'Invalid time value. Use a Unix timestamp in seconds (e.g. 1700000000).' },
24
+ options.pretty,
25
+ ),
26
+ )
26
27
  process.exit(1)
27
28
  }
28
29
 
@@ -34,6 +34,12 @@ test('snapshot command has --limit option', () => {
34
34
  expect(hasLimit).toBe(true)
35
35
  })
36
36
 
37
+ test('snapshot command has --full option', () => {
38
+ const options = snapshotCommand.options
39
+ const hasFull = options.some((opt: any) => opt.long === '--full')
40
+ expect(hasFull).toBe(true)
41
+ })
42
+
37
43
  // Test snapshot logic using spyOn (no global mock pollution)
38
44
  let credManagerSpy: ReturnType<typeof spyOn>
39
45
  let clientTestAuthSpy: ReturnType<typeof spyOn>
@@ -147,11 +153,66 @@ afterEach(() => {
147
153
  clientGetMessagesSpy?.mockRestore()
148
154
  })
149
155
 
156
+ test('brief snapshot (default) returns workspace, channels as {id, name}, and hint', async () => {
157
+ const client = await new SlackClient().login({ token: 'xoxc-test', cookie: 'test-cookie' })
158
+
159
+ const auth = await client.testAuth()
160
+ const channels = await client.listChannels()
161
+ const active = channels.filter((ch) => !ch.is_archived)
162
+
163
+ const snapshot = {
164
+ workspace: {
165
+ id: auth.team_id,
166
+ name: auth.team,
167
+ },
168
+ channels: active.map((ch) => ({ id: ch.id, name: ch.name })),
169
+ hint: "Use 'message list <channel>' for messages, 'channel info <channel>' for channel details, 'user list' for users, 'usergroup list' for groups.",
170
+ }
171
+
172
+ expect(snapshot.workspace).toBeDefined()
173
+ expect(snapshot.workspace.id).toBe('T123')
174
+ expect(snapshot.workspace.name).toBe('Test Workspace')
175
+
176
+ expect(snapshot.channels).toBeDefined()
177
+ expect(snapshot.channels.length).toBe(2)
178
+ expect(snapshot.channels[0]).toEqual({ id: 'C123', name: 'general' })
179
+ expect(snapshot.channels[1]).toEqual({ id: 'C456', name: 'random' })
180
+
181
+ expect((snapshot as any).recent_messages).toBeUndefined()
182
+ expect((snapshot as any).users).toBeUndefined()
183
+ expect((snapshot as any).usergroups).toBeUndefined()
184
+
185
+ expect(snapshot.hint).toContain('message list')
186
+ })
187
+
188
+ test('brief snapshot excludes archived channels', async () => {
189
+ const channelsWithArchived: SlackChannel[] = [
190
+ ...mockChannels,
191
+ {
192
+ id: 'C789',
193
+ name: 'old-channel',
194
+ is_private: false,
195
+ is_archived: true,
196
+ created: 1234567800,
197
+ creator: 'U123',
198
+ topic: { value: 'Archived', creator: 'U123', last_set: 1234567800 },
199
+ purpose: { value: 'Old channel', creator: 'U123', last_set: 1234567800 },
200
+ },
201
+ ]
202
+
203
+ clientListChannelsSpy.mockResolvedValue(channelsWithArchived)
204
+
205
+ const client = await new SlackClient().login({ token: 'xoxc-test', cookie: 'test-cookie' })
206
+ const channels = await client.listChannels()
207
+ const active = channels.filter((ch) => !ch.is_archived)
208
+
209
+ expect(active.length).toBe(2)
210
+ expect(active.every((ch) => !ch.is_archived)).toBe(true)
211
+ })
212
+
150
213
  test('full snapshot returns workspace, channels, messages, and users', async () => {
151
- const credManager = new CredentialManager()
152
214
  const client = await new SlackClient().login({ token: 'xoxc-test', cookie: 'test-cookie' })
153
215
 
154
- const _workspace = await credManager.getWorkspace()
155
216
  const auth = await client.testAuth()
156
217
  const channels = await client.listChannels()
157
218
  const users = await client.listUsers()
@@ -218,10 +279,8 @@ test('full snapshot returns workspace, channels, messages, and users', async ()
218
279
  })
219
280
 
220
281
  test('snapshot with --channels-only excludes messages and users', async () => {
221
- const credManager = new CredentialManager()
222
282
  const client = await new SlackClient().login({ token: 'xoxc-test', cookie: 'test-cookie' })
223
283
 
224
- const _workspace = await credManager.getWorkspace()
225
284
  const auth = await client.testAuth()
226
285
  const channels = await client.listChannels()
227
286
 
@@ -249,10 +308,8 @@ test('snapshot with --channels-only excludes messages and users', async () => {
249
308
  })
250
309
 
251
310
  test('snapshot with --users-only excludes channels and messages', async () => {
252
- const credManager = new CredentialManager()
253
311
  const client = await new SlackClient().login({ token: 'xoxc-test', cookie: 'test-cookie' })
254
312
 
255
- const _workspace = await credManager.getWorkspace()
256
313
  const auth = await client.testAuth()
257
314
  const users = await client.listUsers()
258
315
 
@@ -279,10 +336,8 @@ test('snapshot with --users-only excludes channels and messages', async () => {
279
336
  })
280
337
 
281
338
  test('snapshot respects --limit option for messages', async () => {
282
- const credManager = new CredentialManager()
283
339
  const client = await new SlackClient().login({ token: 'xoxc-test', cookie: 'test-cookie' })
284
340
 
285
- const _workspace = await credManager.getWorkspace()
286
341
  const auth = await client.testAuth()
287
342
  const channels = await client.listChannels()
288
343
 
@@ -11,6 +11,7 @@ import type { SlackChannel } from '../types'
11
11
  async function snapshotAction(options: {
12
12
  channelsOnly?: boolean
13
13
  usersOnly?: boolean
14
+ full?: boolean
14
15
  limit?: number
15
16
  pretty?: boolean
16
17
  }): Promise<void> {
@@ -26,7 +27,6 @@ async function snapshotAction(options: {
26
27
  const client = await new SlackClient().login({ token: workspace.token, cookie: workspace.cookie })
27
28
 
28
29
  const auth = await client.testAuth()
29
- const messageLimit = options.limit || 20
30
30
 
31
31
  const snapshot: Record<string, any> = {
32
32
  workspace: {
@@ -35,88 +35,120 @@ async function snapshotAction(options: {
35
35
  },
36
36
  }
37
37
 
38
- if (!options.usersOnly) {
39
- const channels = await client.listChannels()
40
-
41
- snapshot.channels = channels.map((ch) => ({
42
- id: ch.id,
43
- name: ch.name,
44
- is_private: ch.is_private,
45
- is_archived: ch.is_archived,
46
- created: ch.created,
47
- topic: ch.topic?.value,
48
- purpose: ch.purpose?.value,
49
- }))
50
-
51
- if (!options.channelsOnly) {
52
- const activeChannels = channels.filter((ch) => !ch.is_archived)
53
-
54
- const channelMessages = await parallelMap(
55
- activeChannels,
56
- async (channel: SlackChannel) => {
57
- const messages = await client.getMessages(channel.id, messageLimit)
58
- return messages.map((msg) => ({
59
- ...msg,
60
- channel_id: channel.id,
61
- channel_name: channel.name,
62
- }))
63
- },
64
- 5,
65
- )
66
-
67
- snapshot.recent_messages = channelMessages.flat().map((msg) => ({
68
- channel_id: msg.channel_id,
69
- channel_name: msg.channel_name,
70
- ts: msg.ts,
71
- text: msg.text,
72
- user: msg.user,
73
- username: msg.username,
74
- thread_ts: msg.thread_ts,
75
- }))
76
- }
38
+ const isFull = options.full || options.channelsOnly || options.usersOnly
39
+ if (isFull) {
40
+ await buildFullSnapshot(client, snapshot, options)
41
+ } else {
42
+ await buildBriefSnapshot(client, snapshot, options)
77
43
  }
78
44
 
79
- if (!options.channelsOnly) {
80
- const users = await client.listUsers()
81
-
82
- snapshot.users = users.map((u) => ({
83
- id: u.id,
84
- name: u.name,
85
- real_name: u.real_name,
86
- is_admin: u.is_admin,
87
- is_bot: u.is_bot,
88
- profile: u.profile,
89
- }))
90
- }
45
+ console.log(formatOutput(snapshot, options.pretty))
46
+ } catch (error) {
47
+ handleError(error as Error)
48
+ }
49
+ }
91
50
 
92
- if (!options.channelsOnly && !options.usersOnly) {
93
- const usergroups = await client.listUsergroups({ includeUsers: true, includeCount: true })
51
+ async function buildBriefSnapshot(
52
+ client: SlackClient,
53
+ snapshot: Record<string, any>,
54
+ options: { channelsOnly?: boolean; usersOnly?: boolean },
55
+ ): Promise<void> {
56
+ if (!options.usersOnly) {
57
+ const channels = await client.listChannels()
58
+ const active = channels.filter((ch) => !ch.is_archived)
59
+ snapshot.channels = active.map((ch) => ({ id: ch.id, name: ch.name }))
60
+ }
94
61
 
95
- snapshot.usergroups = usergroups.map((ug) => ({
96
- id: ug.id,
97
- name: ug.name,
98
- handle: ug.handle,
99
- description: ug.description,
100
- user_count: ug.user_count,
101
- users: ug.users,
62
+ snapshot.hint =
63
+ "Use 'message list <channel>' for messages, 'channel info <channel>' for channel details, 'user list' for users, 'usergroup list' for groups."
64
+ }
65
+
66
+ async function buildFullSnapshot(
67
+ client: SlackClient,
68
+ snapshot: Record<string, any>,
69
+ options: { channelsOnly?: boolean; usersOnly?: boolean; limit?: number },
70
+ ): Promise<void> {
71
+ const messageLimit = options.limit || 20
72
+
73
+ if (!options.usersOnly) {
74
+ const channels = await client.listChannels()
75
+
76
+ snapshot.channels = channels.map((ch) => ({
77
+ id: ch.id,
78
+ name: ch.name,
79
+ is_private: ch.is_private,
80
+ is_archived: ch.is_archived,
81
+ created: ch.created,
82
+ topic: ch.topic?.value,
83
+ purpose: ch.purpose?.value,
84
+ }))
85
+
86
+ if (!options.channelsOnly) {
87
+ const activeChannels = channels.filter((ch) => !ch.is_archived)
88
+
89
+ const channelMessages = await parallelMap(
90
+ activeChannels,
91
+ async (channel: SlackChannel) => {
92
+ const messages = await client.getMessages(channel.id, messageLimit)
93
+ return messages.map((msg) => ({
94
+ ...msg,
95
+ channel_id: channel.id,
96
+ channel_name: channel.name,
97
+ }))
98
+ },
99
+ 5,
100
+ )
101
+
102
+ snapshot.recent_messages = channelMessages.flat().map((msg) => ({
103
+ channel_id: msg.channel_id,
104
+ channel_name: msg.channel_name,
105
+ ts: msg.ts,
106
+ text: msg.text,
107
+ user: msg.user,
108
+ username: msg.username,
109
+ thread_ts: msg.thread_ts,
102
110
  }))
103
111
  }
112
+ }
104
113
 
105
- console.log(formatOutput(snapshot, options.pretty))
106
- } catch (error) {
107
- handleError(error as Error)
114
+ if (!options.channelsOnly) {
115
+ const users = await client.listUsers()
116
+
117
+ snapshot.users = users.map((u) => ({
118
+ id: u.id,
119
+ name: u.name,
120
+ real_name: u.real_name,
121
+ is_admin: u.is_admin,
122
+ is_bot: u.is_bot,
123
+ profile: u.profile,
124
+ }))
125
+ }
126
+
127
+ if (!options.channelsOnly && !options.usersOnly) {
128
+ const usergroups = await client.listUsergroups({ includeUsers: true, includeCount: true })
129
+
130
+ snapshot.usergroups = usergroups.map((ug) => ({
131
+ id: ug.id,
132
+ name: ug.name,
133
+ handle: ug.handle,
134
+ description: ug.description,
135
+ user_count: ug.user_count,
136
+ users: ug.users,
137
+ }))
108
138
  }
109
139
  }
110
140
 
111
141
  export const snapshotCommand = new Command('snapshot')
112
- .description('Get comprehensive workspace state for AI agents')
142
+ .description('Get workspace overview for AI agents (brief by default, use --full for comprehensive data)')
143
+ .option('--full', 'Include messages, users, and user groups (verbose)')
113
144
  .option('--channels-only', 'Include only channels (exclude messages and users)')
114
145
  .option('--users-only', 'Include only users (exclude channels and messages)')
115
- .option('--limit <n>', 'Number of recent messages per channel (default: 20)', '20')
146
+ .option('--limit <n>', 'Number of recent messages per channel with --full (default: 20)', '20')
116
147
  .action(async (options) => {
117
148
  await snapshotAction({
118
149
  channelsOnly: options.channelsOnly,
119
150
  usersOnly: options.usersOnly,
151
+ full: options.full,
120
152
  limit: parseInt(options.limit, 10),
121
153
  pretty: options.pretty,
122
154
  })
@@ -174,7 +174,12 @@ export const userCommand = new Command('user')
174
174
  ? (() => {
175
175
  const ts = Number(options.expiration)
176
176
  if (!Number.isInteger(ts) || ts <= 0) {
177
- console.log(formatOutput({ error: 'Invalid --expiration value. Use a Unix timestamp in seconds.' }, options.pretty))
177
+ console.log(
178
+ formatOutput(
179
+ { error: 'Invalid --expiration value. Use a Unix timestamp in seconds.' },
180
+ options.pretty,
181
+ ),
182
+ )
178
183
  process.exit(1)
179
184
  }
180
185
  return ts
@@ -86,9 +86,9 @@ describe('Usergroup Commands', () => {
86
86
  mockClient.updateUsergroup = mock(async () => {
87
87
  throw new Error('no_such_subteam')
88
88
  })
89
- await expect(
90
- (mockClient as SlackClient).updateUsergroup('S999', { name: 'Nope' }),
91
- ).rejects.toThrow('no_such_subteam')
89
+ await expect((mockClient as SlackClient).updateUsergroup('S999', { name: 'Nope' })).rejects.toThrow(
90
+ 'no_such_subteam',
91
+ )
92
92
  })
93
93
  })
94
94
 
@@ -18,7 +18,11 @@ async function getClient(pretty?: boolean): Promise<SlackClient | null> {
18
18
  return await new SlackClient().login({ token: ws.token, cookie: ws.cookie })
19
19
  }
20
20
 
21
- async function listAction(options: { includeDisabled?: boolean; includeUsers?: boolean; pretty?: boolean }): Promise<void> {
21
+ async function listAction(options: {
22
+ includeDisabled?: boolean
23
+ includeUsers?: boolean
24
+ pretty?: boolean
25
+ }): Promise<void> {
22
26
  try {
23
27
  const client = await getClient(options.pretty)
24
28
  if (!client) return process.exit(1)
@@ -136,7 +140,10 @@ async function disableAction(usergroupId: string, options: { pretty?: boolean })
136
140
  }
137
141
  }
138
142
 
139
- async function membersAction(usergroupId: string, options: { includeDisabled?: boolean; pretty?: boolean }): Promise<void> {
143
+ async function membersAction(
144
+ usergroupId: string,
145
+ options: { includeDisabled?: boolean; pretty?: boolean },
146
+ ): Promise<void> {
140
147
  try {
141
148
  const client = await getClient(options.pretty)
142
149
  if (!client) return process.exit(1)
@@ -151,11 +158,7 @@ async function membersAction(usergroupId: string, options: { includeDisabled?: b
151
158
  }
152
159
  }
153
160
 
154
- async function membersUpdateAction(
155
- usergroupId: string,
156
- users: string,
157
- options: { pretty?: boolean },
158
- ): Promise<void> {
161
+ async function membersUpdateAction(usergroupId: string, users: string, options: { pretty?: boolean }): Promise<void> {
159
162
  try {
160
163
  const client = await getClient(options.pretty)
161
164
  if (!client) return process.exit(1)
@@ -1,8 +1,8 @@
1
1
  import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
2
2
 
3
3
  import { SlackClient } from '@/platforms/slack/client'
4
- import { CredentialManager } from '@/platforms/slack/credential-manager'
5
4
  import { whoamiAction, whoamiCommand } from '@/platforms/slack/commands/whoami'
5
+ import { CredentialManager } from '@/platforms/slack/credential-manager'
6
6
 
7
7
  let credManagerSpy: ReturnType<typeof spyOn>
8
8
  let clientTestAuthSpy: ReturnType<typeof spyOn>
@@ -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 { SlackClient } from '../client'
5
7
  import { CredentialManager } from '../credential-manager'
6
8
 
@@ -43,5 +43,3 @@ export {
43
43
  WorkspaceCredentialsSchema,
44
44
  ConfigSchema,
45
45
  } from './types'
46
-
47
-
@@ -16,6 +16,7 @@ class MockWs {
16
16
  sent: string[] = []
17
17
 
18
18
  constructor(_url: string, _options?: any) {
19
+ // oxlint-disable-next-line typescript-eslint/no-this-alias
19
20
  mockWsInstance = this
20
21
  }
21
22
 
@@ -813,10 +813,7 @@ describe('TokenExtractor browser fallback', () => {
813
813
  mkdirSync(leveldbDir, { recursive: true })
814
814
  writeFileSync(join(leveldbDir, '000001.log'), `"${token}"T12345678"name":"desktop-workspace"`)
815
815
 
816
- const extractFromBrowsersSpy = spyOn(
817
- TokenExtractor.prototype as any,
818
- 'extractFromBrowsers',
819
- ).mockResolvedValue([])
816
+ const extractFromBrowsersSpy = spyOn(TokenExtractor.prototype as any, 'extractFromBrowsers').mockResolvedValue([])
820
817
 
821
818
  // when
822
819
  const extractor = new TokenExtractor('darwin', slackDir)
@@ -843,10 +840,9 @@ describe('TokenExtractor browser fallback', () => {
843
840
  cookie: '',
844
841
  }
845
842
 
846
- const extractFromBrowsersSpy = spyOn(
847
- TokenExtractor.prototype as any,
848
- 'extractFromBrowsers',
849
- ).mockResolvedValue([browserWorkspace])
843
+ const extractFromBrowsersSpy = spyOn(TokenExtractor.prototype as any, 'extractFromBrowsers').mockResolvedValue([
844
+ browserWorkspace,
845
+ ])
850
846
 
851
847
  // when
852
848
  const extractor = new TokenExtractor('darwin', slackDir)
@@ -871,10 +867,9 @@ describe('TokenExtractor browser fallback', () => {
871
867
  cookie: 'xoxd-browser-cookie',
872
868
  }
873
869
 
874
- const extractFromBrowsersSpy = spyOn(
875
- TokenExtractor.prototype as any,
876
- 'extractFromBrowsers',
877
- ).mockResolvedValue([browserWorkspace])
870
+ const extractFromBrowsersSpy = spyOn(TokenExtractor.prototype as any, 'extractFromBrowsers').mockResolvedValue([
871
+ browserWorkspace,
872
+ ])
878
873
 
879
874
  // when
880
875
  const extractor = new TokenExtractor('darwin', slackDir)