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,3 +1,5 @@
1
+ import { ChannelBotCredentialManager } from './credential-manager'
2
+ import { wrapTextInBlocks } from './message-utils'
1
3
  import type {
2
4
  ChannelBotBot,
3
5
  ChannelBotChannel,
@@ -9,8 +11,6 @@ import type {
9
11
  MessageBlock,
10
12
  } from './types'
11
13
  import { ChannelBotError as ChannelBotErrorClass } from './types'
12
- import { wrapTextInBlocks } from './message-utils'
13
- import { ChannelBotCredentialManager } from './credential-manager'
14
14
 
15
15
  const BASE_URL = 'https://api.channel.io/open/v5'
16
16
  const MAX_RETRIES = 3
@@ -82,7 +82,12 @@ export class ChannelBotClient {
82
82
  limit?: number
83
83
  },
84
84
  ): Promise<ChannelBotMessage[]> {
85
- return this.request<ChannelBotMessage[]>('GET', this.buildPath(`/user-chats/${chatId}/messages`, params), undefined, 'messages')
85
+ return this.request<ChannelBotMessage[]>(
86
+ 'GET',
87
+ this.buildPath(`/user-chats/${chatId}/messages`, params),
88
+ undefined,
89
+ 'messages',
90
+ )
86
91
  }
87
92
 
88
93
  async sendUserChatMessage(chatId: string, blocks: MessageBlock[], botName?: string): Promise<ChannelBotMessage> {
@@ -95,7 +100,12 @@ export class ChannelBotClient {
95
100
  }
96
101
 
97
102
  async closeUserChat(chatId: string, botName: string): Promise<ChannelBotUserChat> {
98
- return this.request<ChannelBotUserChat>('PATCH', this.buildPath(`/user-chats/${chatId}/close`, { botName }), undefined, 'userChat')
103
+ return this.request<ChannelBotUserChat>(
104
+ 'PATCH',
105
+ this.buildPath(`/user-chats/${chatId}/close`, { botName }),
106
+ undefined,
107
+ 'userChat',
108
+ )
99
109
  }
100
110
 
101
111
  async deleteUserChat(chatId: string): Promise<void> {
@@ -129,7 +139,12 @@ export class ChannelBotClient {
129
139
  limit?: number
130
140
  },
131
141
  ): Promise<ChannelBotMessage[]> {
132
- return this.request<ChannelBotMessage[]>('GET', this.buildPath(`/groups/${groupId}/messages`, params), undefined, 'messages')
142
+ return this.request<ChannelBotMessage[]>(
143
+ 'GET',
144
+ this.buildPath(`/groups/${groupId}/messages`, params),
145
+ undefined,
146
+ 'messages',
147
+ )
133
148
  }
134
149
 
135
150
  async sendGroupMessage(groupId: string, blocks: MessageBlock[], botName?: string): Promise<ChannelBotMessage> {
@@ -165,10 +180,15 @@ export class ChannelBotClient {
165
180
  }
166
181
 
167
182
  async createBot(name: string, options?: { color?: string; avatarUrl?: string }): Promise<ChannelBotBot> {
168
- return this.request<ChannelBotBot>('POST', '/bots', {
169
- name,
170
- ...options,
171
- }, 'bot')
183
+ return this.request<ChannelBotBot>(
184
+ 'POST',
185
+ '/bots',
186
+ {
187
+ name,
188
+ ...options,
189
+ },
190
+ 'bot',
191
+ )
172
192
  }
173
193
 
174
194
  async deleteBot(botId: string): Promise<void> {
@@ -265,19 +285,25 @@ export class ChannelBotClient {
265
285
  continue
266
286
  }
267
287
 
268
- const errorBody = await response.json().catch(() => ({})) as {
288
+ const errorBody = (await response.json().catch(() => ({}))) as {
269
289
  message?: string
270
290
  code?: string
271
291
  }
272
- throw new ChannelBotErrorClass(errorBody.message || `HTTP ${response.status}`, errorBody.code || `http_${response.status}`)
292
+ throw new ChannelBotErrorClass(
293
+ errorBody.message || `HTTP ${response.status}`,
294
+ errorBody.code || `http_${response.status}`,
295
+ )
273
296
  }
274
297
 
275
298
  if (!response.ok) {
276
- const errorBody = await response.json().catch(() => ({})) as {
299
+ const errorBody = (await response.json().catch(() => ({}))) as {
277
300
  message?: string
278
301
  code?: string
279
302
  }
280
- throw new ChannelBotErrorClass(errorBody.message || `HTTP ${response.status}`, errorBody.code || `http_${response.status}`)
303
+ throw new ChannelBotErrorClass(
304
+ errorBody.message || `HTTP ${response.status}`,
305
+ errorBody.code || `http_${response.status}`,
306
+ )
281
307
  }
282
308
 
283
309
  if (response.status === 204) {
@@ -13,7 +13,9 @@ const mockGetChannel = mock(() =>
13
13
 
14
14
  mock.module('../client', () => ({
15
15
  ChannelBotClient: class MockChannelBotClient {
16
- async login(_credentials?: any) { return this }
16
+ async login(_credentials?: any) {
17
+ return this
18
+ }
17
19
  getChannel = mockGetChannel
18
20
  },
19
21
  }))
@@ -66,7 +66,10 @@ export async function statusAction(options: ActionOptions): Promise<ActionResult
66
66
  let workspaceName: string | undefined
67
67
 
68
68
  try {
69
- const client = await new ChannelBotClient().login({ accessKey: creds.access_key, accessSecret: creds.access_secret })
69
+ const client = await new ChannelBotClient().login({
70
+ accessKey: creds.access_key,
71
+ accessSecret: creds.access_secret,
72
+ })
70
73
  const channel = await client.getChannel()
71
74
  valid = true
72
75
  workspaceId = channel.id
@@ -6,14 +6,18 @@ import { join } from 'node:path'
6
6
 
7
7
  const mockListBots = mock(() =>
8
8
  Promise.resolve([
9
- { id: 'bot1', channelId: 'ch1', name: 'Support Bot', avatarUrl: 'https://example.com/avatar.png', color: '#FF0000' },
9
+ {
10
+ id: 'bot1',
11
+ channelId: 'ch1',
12
+ name: 'Support Bot',
13
+ avatarUrl: 'https://example.com/avatar.png',
14
+ color: '#FF0000',
15
+ },
10
16
  { id: 'bot2', channelId: 'ch1', name: 'Sales Bot' },
11
17
  ]),
12
18
  )
13
19
 
14
- const mockCreateBot = mock(() =>
15
- Promise.resolve({ id: 'bot3', channelId: 'ch1', name: 'New Bot', color: '#00FF00' }),
16
- )
20
+ const mockCreateBot = mock(() => Promise.resolve({ id: 'bot3', channelId: 'ch1', name: 'New Bot', color: '#00FF00' }))
17
21
 
18
22
  const mockDeleteBot = mock(() => Promise.resolve(undefined))
19
23
 
@@ -86,7 +90,11 @@ describe('bot commands', () => {
86
90
 
87
91
  test('creates bot with optional color and avatar', async () => {
88
92
  const manager = new ChannelBotCredentialManager(tempDir)
89
- await createAction('New Bot', { color: '#00FF00', avatarUrl: 'https://example.com/avatar.png', _credManager: manager })
93
+ await createAction('New Bot', {
94
+ color: '#00FF00',
95
+ avatarUrl: 'https://example.com/avatar.png',
96
+ _credManager: manager,
97
+ })
90
98
 
91
99
  expect(capturedCreateArgs[1]).toMatchObject({ color: '#00FF00', avatarUrl: 'https://example.com/avatar.png' })
92
100
  })
@@ -115,12 +115,12 @@ describe('message commands', () => {
115
115
  describe('sendAction', () => {
116
116
  test('sends to userchat and wraps text in blocks', async () => {
117
117
  const manager = new ChannelBotCredentialManager(tempDir)
118
- const result = await sendAction('chat1', 'Hello world', { type: 'userchat', _credManager: manager })
118
+ const result = await sendAction('chat1', 'Hello world', { type: 'userchat', _credManager: manager })
119
119
 
120
- expect(result.error).toBeUndefined()
121
- expect(result.id).toBe('msg1')
122
- expect(capturedSendUserChatArgs[1]).toEqual([{ type: 'text', value: 'Hello world' }])
123
- })
120
+ expect(result.error).toBeUndefined()
121
+ expect(result.id).toBe('msg1')
122
+ expect(capturedSendUserChatArgs[1]).toEqual([{ type: 'text', value: 'Hello world' }])
123
+ })
124
124
 
125
125
  test('sends to group when type=group', async () => {
126
126
  const manager = new ChannelBotCredentialManager(tempDir)
@@ -167,7 +167,13 @@ describe('message commands', () => {
167
167
 
168
168
  test('passes pagination params', async () => {
169
169
  const manager = new ChannelBotCredentialManager(tempDir)
170
- await listAction('chat1', { type: 'userchat', limit: '10', sort: 'asc', since: 'cursor123', _credManager: manager })
170
+ await listAction('chat1', {
171
+ type: 'userchat',
172
+ limit: '10',
173
+ sort: 'asc',
174
+ since: 'cursor123',
175
+ _credManager: manager,
176
+ })
171
177
 
172
178
  expect(capturedGetUserChatMsgArgs[0]).toBe('chat1')
173
179
  expect(capturedGetUserChatMsgArgs[1]).toMatchObject({ limit: 10, sortOrder: 'asc', since: 'cursor123' })
@@ -15,7 +15,9 @@ export async function getClient(options: WorkspaceOption): Promise<ChannelBotCli
15
15
  const creds = await credManager.getCredentials(options.workspace)
16
16
 
17
17
  if (!creds) {
18
- console.log(formatOutput({ error: 'No credentials. Run "auth set <access-key> <access-secret>" first.' }, options.pretty))
18
+ console.log(
19
+ formatOutput({ error: 'No credentials. Run "auth set <access-key> <access-secret>" first.' }, options.pretty),
20
+ )
19
21
  process.exit(1)
20
22
  }
21
23
 
@@ -29,7 +31,9 @@ export async function getCurrentWorkspace(options: WorkspaceOption): Promise<str
29
31
  const creds = await credManager.getCredentials()
30
32
 
31
33
  if (!creds) {
32
- console.log(formatOutput({ error: 'No workspace set. Run "auth set <access-key> <access-secret>" first.' }, options.pretty))
34
+ console.log(
35
+ formatOutput({ error: 'No workspace set. Run "auth set <access-key> <access-secret>" first.' }, options.pretty),
36
+ )
33
37
  process.exit(1)
34
38
  }
35
39
 
@@ -4,12 +4,24 @@ import { mkdir } from 'node:fs/promises'
4
4
  import { tmpdir } from 'node:os'
5
5
  import { join } from 'node:path'
6
6
 
7
- const mockGetChannel = mock(() => Promise.resolve({ id: 'ch1', name: 'Test Workspace', homepageUrl: 'https://example.com' }))
7
+ const mockGetChannel = mock(() =>
8
+ Promise.resolve({ id: 'ch1', name: 'Test Workspace', homepageUrl: 'https://example.com' }),
9
+ )
8
10
  const mockListGroups = mock(() => Promise.resolve([{ id: 'grp1', channelId: 'ch1', name: 'Team Alpha' }]))
9
- const mockGetGroupMessages = mock(() => Promise.resolve([{ id: 'msg1', chatId: 'grp1', personType: 'manager' as const, plainText: 'Hello', createdAt: 1234567890 }]))
10
- const mockListUserChats = mock(() => Promise.resolve([{ id: 'chat1', channelId: 'ch1', state: 'opened' as const, userId: 'user1' }]))
11
- const mockGetUserChatMessages = mock(() => Promise.resolve([{ id: 'msg2', chatId: 'chat1', plainText: 'Hi', createdAt: 1234567890 }]))
12
- const mockListManagers = mock(() => Promise.resolve([{ id: 'mgr1', channelId: 'ch1', name: 'Alice', description: 'Lead' }]))
11
+ const mockGetGroupMessages = mock(() =>
12
+ Promise.resolve([
13
+ { id: 'msg1', chatId: 'grp1', personType: 'manager' as const, plainText: 'Hello', createdAt: 1234567890 },
14
+ ]),
15
+ )
16
+ const mockListUserChats = mock(() =>
17
+ Promise.resolve([{ id: 'chat1', channelId: 'ch1', state: 'opened' as const, userId: 'user1' }]),
18
+ )
19
+ const mockGetUserChatMessages = mock(() =>
20
+ Promise.resolve([{ id: 'msg2', chatId: 'chat1', plainText: 'Hi', createdAt: 1234567890 }]),
21
+ )
22
+ const mockListManagers = mock(() =>
23
+ Promise.resolve([{ id: 'mgr1', channelId: 'ch1', name: 'Alice', description: 'Lead' }]),
24
+ )
13
25
  const mockListBots = mock(() => Promise.resolve([{ id: 'bot1', channelId: 'ch1', name: 'Support Bot' }]))
14
26
 
15
27
  mock.module('../client', () => ({
@@ -55,10 +67,28 @@ describe('snapshot command', () => {
55
67
  })
56
68
 
57
69
  describe('snapshotAction', () => {
58
- test('returns workspace, groups, user_chats, managers, bots', async () => {
70
+ test('brief snapshot returns workspace, groups (names), chat counts, and hint', async () => {
59
71
  const manager = new ChannelBotCredentialManager(tempDir)
60
72
  const result = await snapshotAction({ _credManager: manager })
61
73
 
74
+ expect(result.error).toBeUndefined()
75
+ expect(result.workspace).toBeDefined()
76
+ expect(result.workspace?.id).toBe('ch1')
77
+ expect(result.workspace?.name).toBe('Test Workspace')
78
+ expect(result.groups).toBeDefined()
79
+ expect(result.groups?.[0]).toEqual({ id: 'grp1', name: 'Team Alpha' })
80
+ expect(result.user_chats).toBeDefined()
81
+ expect(result.user_chats?.opened_count).toBe(1)
82
+ expect(result.hint).toBeDefined()
83
+ expect(result.managers).toBeUndefined()
84
+ expect(result.bots).toBeUndefined()
85
+ expect(mockGetGroupMessages).not.toHaveBeenCalled()
86
+ })
87
+
88
+ test('full snapshot returns workspace, groups, user_chats, managers, bots', async () => {
89
+ const manager = new ChannelBotCredentialManager(tempDir)
90
+ const result = await snapshotAction({ full: true, _credManager: manager })
91
+
62
92
  expect(result.error).toBeUndefined()
63
93
  expect(result.workspace).toBeDefined()
64
94
  expect(result.workspace?.id).toBe('ch1')
@@ -71,7 +101,7 @@ describe('snapshot command', () => {
71
101
 
72
102
  test('groups-only flag skips user_chats, managers, bots', async () => {
73
103
  const manager = new ChannelBotCredentialManager(tempDir)
74
- const result = await snapshotAction({ groupsOnly: true, _credManager: manager })
104
+ const result = await snapshotAction({ full: true, groupsOnly: true, _credManager: manager })
75
105
 
76
106
  expect(result.error).toBeUndefined()
77
107
  expect(result.workspace).toBeDefined()
@@ -83,7 +113,7 @@ describe('snapshot command', () => {
83
113
 
84
114
  test('chats-only flag skips groups, managers, bots', async () => {
85
115
  const manager = new ChannelBotCredentialManager(tempDir)
86
- const result = await snapshotAction({ chatsOnly: true, _credManager: manager })
116
+ const result = await snapshotAction({ full: true, chatsOnly: true, _credManager: manager })
87
117
 
88
118
  expect(result.error).toBeUndefined()
89
119
  expect(result.workspace).toBeDefined()
@@ -93,21 +123,21 @@ describe('snapshot command', () => {
93
123
  expect(result.bots).toBeUndefined()
94
124
  })
95
125
 
96
- test('groups include recent messages', async () => {
126
+ test('full groups include recent messages', async () => {
97
127
  const manager = new ChannelBotCredentialManager(tempDir)
98
- const result = await snapshotAction({ groupsOnly: true, limit: 3, _credManager: manager })
128
+ const result = await snapshotAction({ full: true, groupsOnly: true, limit: 3, _credManager: manager })
99
129
 
100
130
  expect(result.groups?.[0].messages).toBeDefined()
101
131
  expect(result.groups?.[0].messages?.[0].id).toBe('msg1')
102
132
  })
103
133
 
104
- test('user_chats includes counts and recent opened', async () => {
134
+ test('full user_chats includes counts and recent opened', async () => {
105
135
  const manager = new ChannelBotCredentialManager(tempDir)
106
- const result = await snapshotAction({ chatsOnly: true, _credManager: manager })
136
+ const result = await snapshotAction({ full: true, chatsOnly: true, _credManager: manager })
107
137
 
108
138
  expect(result.user_chats?.opened_count).toBe(1)
109
139
  expect(result.user_chats?.recent_opened).toHaveLength(1)
110
- expect(result.user_chats?.recent_opened[0].id).toBe('chat1')
140
+ expect(result.user_chats?.recent_opened?.[0].id).toBe('chat1')
111
141
  })
112
142
  })
113
143
  })
@@ -9,6 +9,7 @@ import { getClient } from './shared'
9
9
  interface SnapshotOption extends WorkspaceOption {
10
10
  groupsOnly?: boolean
11
11
  chatsOnly?: boolean
12
+ full?: boolean
12
13
  limit?: number
13
14
  }
14
15
 
@@ -33,7 +34,7 @@ interface SnapshotResult {
33
34
  opened_count: number
34
35
  snoozed_count: number
35
36
  closed_count: number
36
- recent_opened: Array<{
37
+ recent_opened?: Array<{
37
38
  id: string
38
39
  name?: string
39
40
  user_id?: string
@@ -46,13 +47,13 @@ interface SnapshotResult {
46
47
  }
47
48
  managers?: Array<{ id: string; name: string; description?: string }>
48
49
  bots?: Array<{ id: string; name: string }>
50
+ hint?: string
49
51
  error?: string
50
52
  }
51
53
 
52
54
  export async function snapshotAction(options: SnapshotOption): Promise<SnapshotResult> {
53
55
  try {
54
56
  const client = await getClient(options)
55
- const limit = options.limit ?? 5
56
57
 
57
58
  const channel = await client.getChannel()
58
59
  const workspace = {
@@ -62,71 +63,75 @@ export async function snapshotAction(options: SnapshotOption): Promise<SnapshotR
62
63
  description: channel.description,
63
64
  }
64
65
 
65
- if (options.groupsOnly) {
66
- const groups = await client.listGroups({ limit: 20 })
67
- const groupsWithMessages = await Promise.all(
68
- groups.map(async (g) => {
69
- const messages = await client.getGroupMessages(g.id, { limit, sortOrder: 'desc' })
70
- return {
71
- id: g.id,
72
- name: g.name,
73
- messages: messages.map((m) => ({
74
- id: m.id,
75
- person_type: m.personType,
76
- plain_text: m.plainText,
77
- created_at: m.createdAt,
78
- })),
79
- }
80
- }),
81
- )
82
- return { workspace, groups: groupsWithMessages }
66
+ if (options.full) {
67
+ return buildFullSnapshot(client, workspace, options)
83
68
  }
84
69
 
85
- if (options.chatsOnly) {
86
- const [openedChats, snoozedChats, closedChats] = await Promise.all([
87
- client.listUserChats({ state: 'opened', limit: 10, sortOrder: 'desc' }),
88
- client.listUserChats({ state: 'snoozed', limit: 1 }),
89
- client.listUserChats({ state: 'closed', limit: 1 }),
90
- ])
91
-
92
- const recentOpened = await Promise.all(
93
- openedChats.slice(0, 5).map(async (chat) => {
94
- const messages = await client.getUserChatMessages(chat.id, { limit: 1, sortOrder: 'desc' })
95
- return {
96
- id: chat.id,
97
- name: chat.name,
98
- user_id: chat.userId,
99
- last_message: messages[0]
100
- ? {
101
- id: messages[0].id,
102
- plain_text: messages[0].plainText,
103
- created_at: messages[0].createdAt,
104
- }
105
- : undefined,
106
- }
107
- }),
108
- )
70
+ return buildBriefSnapshot(client, workspace, options)
71
+ } catch (error) {
72
+ return { error: (error as Error).message }
73
+ }
74
+ }
109
75
 
110
- return {
111
- workspace,
112
- user_chats: {
113
- opened_count: openedChats.length,
114
- snoozed_count: snoozedChats.length,
115
- closed_count: closedChats.length,
116
- recent_opened: recentOpened,
117
- },
118
- }
76
+ async function buildBriefSnapshot(
77
+ client: Awaited<ReturnType<typeof getClient>>,
78
+ workspace: SnapshotResult['workspace'],
79
+ options: SnapshotOption,
80
+ ): Promise<SnapshotResult> {
81
+ if (options.groupsOnly) {
82
+ const groups = await client.listGroups({ limit: 20 })
83
+ return {
84
+ workspace,
85
+ groups: groups.map((g) => ({ id: g.id, name: g.name })),
86
+ hint: "Use 'group messages <group>' for messages.",
119
87
  }
88
+ }
120
89
 
121
- const [groups, openedChats, snoozedChats, closedChats, managers, bots] = await Promise.all([
122
- client.listGroups({ limit: 20 }),
90
+ if (options.chatsOnly) {
91
+ const [openedChats, snoozedChats, closedChats] = await Promise.all([
123
92
  client.listUserChats({ state: 'opened', limit: 10, sortOrder: 'desc' }),
124
93
  client.listUserChats({ state: 'snoozed', limit: 1 }),
125
94
  client.listUserChats({ state: 'closed', limit: 1 }),
126
- client.listManagers({ limit: 50 }),
127
- client.listBots({ limit: 50 }),
128
95
  ])
96
+ return {
97
+ workspace,
98
+ user_chats: {
99
+ opened_count: openedChats.length,
100
+ snoozed_count: snoozedChats.length,
101
+ closed_count: closedChats.length,
102
+ },
103
+ hint: "Use 'chat list --state opened' for chat details, 'chat messages <chat>' for messages.",
104
+ }
105
+ }
106
+
107
+ const [groups, openedChats, snoozedChats, closedChats] = await Promise.all([
108
+ client.listGroups({ limit: 20 }),
109
+ client.listUserChats({ state: 'opened', limit: 10, sortOrder: 'desc' }),
110
+ client.listUserChats({ state: 'snoozed', limit: 1 }),
111
+ client.listUserChats({ state: 'closed', limit: 1 }),
112
+ ])
113
+
114
+ return {
115
+ workspace,
116
+ groups: groups.map((g) => ({ id: g.id, name: g.name })),
117
+ user_chats: {
118
+ opened_count: openedChats.length,
119
+ snoozed_count: snoozedChats.length,
120
+ closed_count: closedChats.length,
121
+ },
122
+ hint: "Use 'group messages <group>' for group messages, 'chat list --state opened' for chats, 'manager list' for managers.",
123
+ }
124
+ }
125
+
126
+ async function buildFullSnapshot(
127
+ client: Awaited<ReturnType<typeof getClient>>,
128
+ workspace: SnapshotResult['workspace'],
129
+ options: SnapshotOption,
130
+ ): Promise<SnapshotResult> {
131
+ const limit = options.limit ?? 5
129
132
 
133
+ if (options.groupsOnly) {
134
+ const groups = await client.listGroups({ limit: 20 })
130
135
  const groupsWithMessages = await Promise.all(
131
136
  groups.map(async (g) => {
132
137
  const messages = await client.getGroupMessages(g.id, { limit, sortOrder: 'desc' })
@@ -142,6 +147,15 @@ export async function snapshotAction(options: SnapshotOption): Promise<SnapshotR
142
147
  }
143
148
  }),
144
149
  )
150
+ return { workspace, groups: groupsWithMessages }
151
+ }
152
+
153
+ if (options.chatsOnly) {
154
+ const [openedChats, snoozedChats, closedChats] = await Promise.all([
155
+ client.listUserChats({ state: 'opened', limit: 10, sortOrder: 'desc' }),
156
+ client.listUserChats({ state: 'snoozed', limit: 1 }),
157
+ client.listUserChats({ state: 'closed', limit: 1 }),
158
+ ])
145
159
 
146
160
  const recentOpened = await Promise.all(
147
161
  openedChats.slice(0, 5).map(async (chat) => {
@@ -163,26 +177,78 @@ export async function snapshotAction(options: SnapshotOption): Promise<SnapshotR
163
177
 
164
178
  return {
165
179
  workspace,
166
- groups: groupsWithMessages,
167
180
  user_chats: {
168
181
  opened_count: openedChats.length,
169
182
  snoozed_count: snoozedChats.length,
170
183
  closed_count: closedChats.length,
171
184
  recent_opened: recentOpened,
172
185
  },
173
- managers: managers.map((m) => ({ id: m.id, name: m.name, description: m.description })),
174
- bots: bots.map((b) => ({ id: b.id, name: b.name })),
175
186
  }
176
- } catch (error) {
177
- return { error: (error as Error).message }
187
+ }
188
+
189
+ const [groups, openedChats, snoozedChats, closedChats, managers, bots] = await Promise.all([
190
+ client.listGroups({ limit: 20 }),
191
+ client.listUserChats({ state: 'opened', limit: 10, sortOrder: 'desc' }),
192
+ client.listUserChats({ state: 'snoozed', limit: 1 }),
193
+ client.listUserChats({ state: 'closed', limit: 1 }),
194
+ client.listManagers({ limit: 50 }),
195
+ client.listBots({ limit: 50 }),
196
+ ])
197
+
198
+ const groupsWithMessages = await Promise.all(
199
+ groups.map(async (g) => {
200
+ const messages = await client.getGroupMessages(g.id, { limit, sortOrder: 'desc' })
201
+ return {
202
+ id: g.id,
203
+ name: g.name,
204
+ messages: messages.map((m) => ({
205
+ id: m.id,
206
+ person_type: m.personType,
207
+ plain_text: m.plainText,
208
+ created_at: m.createdAt,
209
+ })),
210
+ }
211
+ }),
212
+ )
213
+
214
+ const recentOpened = await Promise.all(
215
+ openedChats.slice(0, 5).map(async (chat) => {
216
+ const messages = await client.getUserChatMessages(chat.id, { limit: 1, sortOrder: 'desc' })
217
+ return {
218
+ id: chat.id,
219
+ name: chat.name,
220
+ user_id: chat.userId,
221
+ last_message: messages[0]
222
+ ? {
223
+ id: messages[0].id,
224
+ plain_text: messages[0].plainText,
225
+ created_at: messages[0].createdAt,
226
+ }
227
+ : undefined,
228
+ }
229
+ }),
230
+ )
231
+
232
+ return {
233
+ workspace,
234
+ groups: groupsWithMessages,
235
+ user_chats: {
236
+ opened_count: openedChats.length,
237
+ snoozed_count: snoozedChats.length,
238
+ closed_count: closedChats.length,
239
+ recent_opened: recentOpened,
240
+ },
241
+ managers: managers.map((m) => ({ id: m.id, name: m.name, description: m.description })),
242
+ bots: bots.map((b) => ({ id: b.id, name: b.name })),
178
243
  }
179
244
  }
180
245
 
181
246
  export const snapshotCommand = new Command('snapshot')
182
- .description('Workspace overview for AI agent context')
247
+ .description('Workspace overview for AI agents (brief by default, use --full for comprehensive data)')
248
+ .option('--full', 'Include messages, managers, and bots (verbose)')
183
249
  .option('--groups-only', 'List groups only, skip user chats')
184
250
  .option('--chats-only', 'List user chats only, skip groups')
185
- .option('--limit <n>', 'Messages per group/chat (default: 5)', '5')
251
+ .option('--limit <n>', 'Messages per group/chat with --full (default: 5)', '5')
186
252
  .option('--workspace <id>', 'Workspace ID')
187
253
  .option('--bot <name>', 'Bot name')
188
254
  .option('--pretty', 'Pretty print JSON output')
@@ -190,6 +256,7 @@ export const snapshotCommand = new Command('snapshot')
190
256
  try {
191
257
  const result = await snapshotAction({
192
258
  ...options,
259
+ full: options.full,
193
260
  limit: parseInt(options.limit, 10),
194
261
  })
195
262
  console.log(formatOutput(result, options.pretty))
@@ -53,7 +53,7 @@ describe('ChannelBotCredentialManager', () => {
53
53
  const config = {
54
54
  current: { workspace_id: 'ch_abc123' },
55
55
  workspaces: {
56
- 'ch_abc123': {
56
+ ch_abc123: {
57
57
  workspace_id: 'ch_abc123',
58
58
  workspace_name: 'Test Workspace',
59
59
  access_key: 'test-key',
@@ -72,5 +72,3 @@ test('ChannelBotWorkspaceEntrySchema is exported from barrel', () => {
72
72
  test('MessageBlockSchema is exported from barrel', () => {
73
73
  expect(typeof MessageBlockSchema.parse).toBe('function')
74
74
  })
75
-
76
-
@@ -27,4 +27,3 @@ export {
27
27
  ChannelBotWorkspaceEntrySchema,
28
28
  MessageBlockSchema,
29
29
  } from './types'
30
-
@@ -1,9 +1,9 @@
1
1
  import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
2
2
 
3
- import { getNoDiscordTokenFoundMessage } from './auth'
4
3
  import { DiscordClient } from '../client'
5
4
  import { DiscordCredentialManager } from '../credential-manager'
6
5
  import { DiscordTokenExtractor } from '../token-extractor'
6
+ import { getNoDiscordTokenFoundMessage } from './auth'
7
7
 
8
8
  let extractorExtractSpy: ReturnType<typeof spyOn>
9
9
  let clientTestAuthSpy: ReturnType<typeof spyOn>
@@ -14,9 +14,11 @@ let credManagerClearTokenSpy: ReturnType<typeof spyOn>
14
14
 
15
15
  beforeEach(() => {
16
16
  // Spy on DiscordTokenExtractor.prototype.extract
17
- extractorExtractSpy = spyOn(DiscordTokenExtractor.prototype, 'extract').mockResolvedValue([{
18
- token: 'test-token-123',
19
- }])
17
+ extractorExtractSpy = spyOn(DiscordTokenExtractor.prototype, 'extract').mockResolvedValue([
18
+ {
19
+ token: 'test-token-123',
20
+ },
21
+ ])
20
22
 
21
23
  // Spy on DiscordClient.prototype methods
22
24
  clientTestAuthSpy = spyOn(DiscordClient.prototype, 'testAuth').mockResolvedValue({