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
@@ -7,61 +7,16 @@ import { join } from 'node:path'
7
7
 
8
8
  import { ClassicLevel } from 'classic-level'
9
9
 
10
+ import {
11
+ CHROMIUM_BROWSERS,
12
+ ChromiumCookieDecryptor,
13
+ ChromiumCookieReader,
14
+ discoverBrowserProfileDirs,
15
+ getBrowserBasePath,
16
+ } from '@/shared/chromium'
10
17
  import { DerivedKeyCache } from '@/shared/utils/derived-key-cache'
11
18
  import { lookupLinuxKeyringPassword } from '@/shared/utils/linux-keyring'
12
19
 
13
- interface BrowserConfig {
14
- name: string
15
- darwin: string
16
- linux: string
17
- win32: string
18
- }
19
-
20
- const BROWSERS: BrowserConfig[] = [
21
- {
22
- name: 'Chrome',
23
- darwin: join('Google', 'Chrome'),
24
- linux: 'google-chrome',
25
- win32: join('Google', 'Chrome', 'User Data'),
26
- },
27
- {
28
- name: 'Chrome Canary',
29
- darwin: join('Google', 'Chrome Canary'),
30
- linux: 'google-chrome-unstable',
31
- win32: join('Google', 'Chrome SxS', 'User Data'),
32
- },
33
- {
34
- name: 'Edge',
35
- darwin: 'Microsoft Edge',
36
- linux: 'microsoft-edge',
37
- win32: join('Microsoft', 'Edge', 'User Data'),
38
- },
39
- {
40
- name: 'Arc',
41
- darwin: join('Arc', 'User Data'),
42
- linux: '',
43
- win32: join('Arc', 'User Data'),
44
- },
45
- {
46
- name: 'Brave',
47
- darwin: join('BraveSoftware', 'Brave-Browser'),
48
- linux: join('BraveSoftware', 'Brave-Browser'),
49
- win32: join('BraveSoftware', 'Brave-Browser', 'User Data'),
50
- },
51
- {
52
- name: 'Vivaldi',
53
- darwin: 'Vivaldi',
54
- linux: 'vivaldi',
55
- win32: join('Vivaldi', 'User Data'),
56
- },
57
- {
58
- name: 'Chromium',
59
- darwin: 'Chromium',
60
- linux: 'chromium',
61
- win32: join('Chromium', 'User Data'),
62
- },
63
- ]
64
-
65
20
  const require = createRequire(import.meta.url)
66
21
 
67
22
  export interface ExtractedWorkspace {
@@ -106,6 +61,8 @@ export class TokenExtractor {
106
61
  private slackDir: string
107
62
  private keyCache: DerivedKeyCache
108
63
  private debugLog: ((message: string) => void) | null
64
+ private browserDecryptor: ChromiumCookieDecryptor
65
+ private browserCookieReader: ChromiumCookieReader
109
66
 
110
67
  constructor(
111
68
  platform?: NodeJS.Platform,
@@ -122,6 +79,8 @@ export class TokenExtractor {
122
79
  this.slackDir = slackDir ?? this.getSlackDir()
123
80
  this.keyCache = keyCache ?? new DerivedKeyCache()
124
81
  this.debugLog = debugLog ?? null
82
+ this.browserDecryptor = new ChromiumCookieDecryptor({ platform: this.platform })
83
+ this.browserCookieReader = new ChromiumCookieReader()
125
84
  }
126
85
 
127
86
  private debug(message: string): void {
@@ -267,11 +226,11 @@ export class TokenExtractor {
267
226
  const results: ExtractedWorkspace[] = []
268
227
  const seenTokens = new Set<string>()
269
228
 
270
- for (const browser of BROWSERS) {
271
- const browserBase = this.getBrowserBasePath(browser)
229
+ for (const browser of CHROMIUM_BROWSERS) {
230
+ const browserBase = getBrowserBasePath(browser, this.platform)
272
231
  if (!browserBase) continue
273
232
 
274
- const profileDirs = this.discoverBrowserProfileDirs(browserBase)
233
+ const profileDirs = discoverBrowserProfileDirs(browserBase)
275
234
  for (const profileDir of profileDirs) {
276
235
  const leveldbDir = join(profileDir, 'Local Storage', 'leveldb')
277
236
  if (!existsSync(leveldbDir)) continue
@@ -303,54 +262,8 @@ export class TokenExtractor {
303
262
  return results
304
263
  }
305
264
 
306
- private getBrowserBasePath(browser: BrowserConfig): string | null {
307
- let relative: string
308
-
309
- switch (this.platform) {
310
- case 'darwin':
311
- relative = browser.darwin
312
- if (!relative) return null
313
- return join(homedir(), 'Library', 'Application Support', relative)
314
- case 'linux':
315
- relative = browser.linux
316
- if (!relative) return null
317
- return join(homedir(), '.config', relative)
318
- case 'win32':
319
- relative = browser.win32
320
- if (!relative) return null
321
- return join(
322
- process.env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local'),
323
- relative,
324
- )
325
- default:
326
- return null
327
- }
328
- }
329
-
330
- private discoverBrowserProfileDirs(browserBase: string): string[] {
331
- const dirs: string[] = []
332
-
333
- dirs.push(join(browserBase, 'Default'))
334
-
335
- if (!existsSync(browserBase)) return dirs
336
-
337
- try {
338
- const entries = readdirSync(browserBase, { withFileTypes: true })
339
- for (const entry of entries) {
340
- if (!entry.isDirectory()) continue
341
- if (!/^Profile \d+$/i.test(entry.name)) continue
342
- dirs.push(join(browserBase, entry.name))
343
- }
344
- } catch {}
345
-
346
- return dirs
347
- }
348
-
349
265
  private async extractCookieFromBrowserProfile(profileDir: string, browserBase: string): Promise<string> {
350
- const cookiePaths = [
351
- join(profileDir, 'Cookies'),
352
- join(profileDir, 'Network', 'Cookies'),
353
- ]
266
+ const cookiePaths = [join(profileDir, 'Cookies'), join(profileDir, 'Network', 'Cookies')]
354
267
 
355
268
  for (const cookiePath of cookiePaths) {
356
269
  if (!existsSync(cookiePath)) continue
@@ -363,166 +276,35 @@ export class TokenExtractor {
363
276
  }
364
277
 
365
278
  private async extractCookieFromBrowserSQLite(cookiesPath: string, browserBase: string): Promise<string> {
366
- const tempDbPath = join(tmpdir(), `slack-browser-cookies-${Date.now()}-${Math.random().toString(36).slice(2)}.db`)
367
-
368
- try {
369
- copyFileSync(cookiesPath, tempDbPath)
370
- } catch {
371
- return ''
279
+ const sql = `SELECT value, encrypted_value
280
+ FROM cookies
281
+ WHERE name = 'd' AND host_key LIKE '%slack.com%'
282
+ ORDER BY last_access_utc DESC
283
+ LIMIT 1`
284
+
285
+ type CookieRow = {
286
+ value?: string
287
+ encrypted_value?: Uint8Array | Buffer
372
288
  }
373
289
 
374
- try {
375
- const sql = `SELECT value, encrypted_value
376
- FROM cookies
377
- WHERE name = 'd' AND host_key LIKE '%slack.com%'
378
- ORDER BY last_access_utc DESC
379
- LIMIT 1`
290
+ const row = await this.browserCookieReader.queryFirst<CookieRow>(cookiesPath, sql)
291
+ if (!row) return ''
380
292
 
381
- type CookieRow = {
382
- value?: string
383
- encrypted_value?: Uint8Array | Buffer
384
- } | null
293
+ if (row.value?.startsWith('xoxd-')) return row.value
385
294
 
386
- let row: CookieRow
387
- if (typeof globalThis.Bun !== 'undefined') {
388
- const { Database } = require('bun:sqlite')
389
- const db = new Database(tempDbPath, { readonly: true })
390
- row = db.query(sql).get() as CookieRow
391
- db.close()
392
- } else {
393
- const Database = require('better-sqlite3')
394
- const db = new Database(tempDbPath, { readonly: true })
395
- row = db.prepare(sql).get() as CookieRow
396
- db.close()
397
- }
398
-
399
- if (!row) return ''
400
-
401
- if (row.value?.startsWith('xoxd-')) return row.value
402
-
403
- if (row.encrypted_value && row.encrypted_value.length > 0) {
404
- return this.decryptBrowserCookieForSlack(Buffer.from(row.encrypted_value), browserBase) ?? ''
405
- }
406
-
407
- return ''
408
- } catch {
409
- return ''
410
- } finally {
411
- try {
412
- rmSync(tempDbPath, { force: true })
413
- } catch {}
414
- }
415
- }
416
-
417
- private decryptBrowserCookieForSlack(encrypted: Buffer, browserBase: string): string | null {
418
- const str = encrypted.toString('utf8')
419
- if (str.startsWith('xoxd-')) return str
420
-
421
- const prefix = encrypted.length > 3 ? encrypted.subarray(0, 3).toString() : ''
422
-
423
- if (prefix === 'v10') {
424
- if (this.platform === 'win32') {
425
- return this.decryptBrowserV10CookieWindows(encrypted, browserBase)
426
- }
427
- if (this.platform === 'linux') {
428
- return this.decryptV10CookieLinux(encrypted)
429
- }
430
- return this.decryptBrowserV10CookieMac(encrypted)
431
- }
432
-
433
- if (prefix === 'v11') {
434
- if (this.platform === 'linux') {
435
- return this.decryptV11CookieLinux(encrypted)
436
- }
437
- if (this.platform === 'darwin') {
438
- return this.decryptBrowserV10CookieMac(encrypted)
439
- }
440
- }
441
-
442
- if (this.platform === 'win32' && encrypted.length > 0) {
443
- const decrypted = this.decryptDPAPI(encrypted)
295
+ if (row.encrypted_value && row.encrypted_value.length > 0) {
296
+ const localStatePath = join(browserBase, 'Local State')
297
+ const decrypted = this.browserDecryptor.decryptCookie(
298
+ Buffer.from(row.encrypted_value),
299
+ existsSync(localStatePath) ? localStatePath : undefined,
300
+ )
444
301
  if (decrypted) {
445
- const text = decrypted.toString('utf8')
446
- const match = text.match(/xoxd-[A-Za-z0-9%]+/)
447
- return match ? match[0] : null
448
- }
449
- }
450
-
451
- return null
452
- }
453
-
454
- private decryptBrowserV10CookieMac(encrypted: Buffer): string | null {
455
- const keychainVariants = [
456
- { service: 'Chrome Safe Storage', account: 'Chrome' },
457
- { service: 'Chrome Canary Safe Storage', account: 'Chrome Canary' },
458
- { service: 'Microsoft Edge Safe Storage', account: 'Microsoft Edge' },
459
- { service: 'Arc Safe Storage', account: 'Arc' },
460
- { service: 'Brave Safe Storage', account: 'Brave' },
461
- { service: 'Vivaldi Safe Storage', account: 'Vivaldi' },
462
- { service: 'Chromium Safe Storage', account: 'Chromium' },
463
- ]
464
-
465
- for (const variant of keychainVariants) {
466
- try {
467
- const password = execSync(
468
- `security find-generic-password -s "${variant.service}" -a "${variant.account}" -w 2>/dev/null`,
469
- { encoding: 'utf8' },
470
- ).trim()
471
-
472
- const key = pbkdf2Sync(password, 'saltysalt', 1003, 16, 'sha1')
473
- const result = this.decryptLinuxCookieWithKey(encrypted, key)
474
- if (result) return result
475
- } catch {}
476
- }
477
-
478
- return null
479
- }
480
-
481
- private decryptBrowserV10CookieWindows(encrypted: Buffer, browserBase: string): string | null {
482
- try {
483
- const masterKey = this.getBrowserWindowsMasterKey(browserBase)
484
- if (!masterKey) {
485
- const decrypted = this.decryptDPAPI(encrypted.subarray(3))
486
- if (!decrypted) return null
487
- const text = decrypted.toString('utf8')
488
- const match = text.match(/xoxd-[A-Za-z0-9%]+/)
489
- return match ? match[0] : null
302
+ const match = decrypted.match(/xoxd-[A-Za-z0-9%]+/)
303
+ return match ? match[0] : ''
490
304
  }
491
-
492
- const nonce = encrypted.subarray(3, 3 + 12)
493
- const ciphertextWithTag = encrypted.subarray(3 + 12)
494
- const tag = ciphertextWithTag.subarray(ciphertextWithTag.length - 16)
495
- const ciphertext = ciphertextWithTag.subarray(0, ciphertextWithTag.length - 16)
496
-
497
- const decipher = createDecipheriv('aes-256-gcm', masterKey, nonce)
498
- decipher.setAuthTag(tag)
499
- const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8')
500
-
501
- const match = decrypted.match(/xoxd-[A-Za-z0-9%]+/)
502
- return match ? match[0] : null
503
- } catch {
504
- return null
505
305
  }
506
- }
507
-
508
- private getBrowserWindowsMasterKey(browserBase: string): Buffer | null {
509
- try {
510
- const localStatePath = join(browserBase, 'Local State')
511
- if (!existsSync(localStatePath)) return null
512
-
513
- const localState = JSON.parse(readFileSync(localStatePath, 'utf8')) as {
514
- os_crypt?: { encrypted_key?: string }
515
- }
516
- const encryptedKeyB64 = localState?.os_crypt?.encrypted_key
517
- if (!encryptedKeyB64) return null
518
-
519
- const encryptedKey = Buffer.from(encryptedKeyB64, 'base64')
520
- if (encryptedKey.subarray(0, 5).toString() !== 'DPAPI') return null
521
306
 
522
- return this.decryptDPAPI(encryptedKey.subarray(5))
523
- } catch {
524
- return null
525
- }
307
+ return ''
526
308
  }
527
309
 
528
310
  private async extractTokensFromLevelDB(): Promise<TokenInfo[]> {
@@ -1157,7 +939,17 @@ export class TokenExtractor {
1157
939
  }
1158
940
 
1159
941
  private decryptV11CookieLinux(encrypted: Buffer): string | null {
1160
- const appNames = ['Slack', 'slack', 'Chrome', 'chrome', 'Chromium', 'chromium', 'Microsoft Edge', 'Brave', 'Vivaldi']
942
+ const appNames = [
943
+ 'Slack',
944
+ 'slack',
945
+ 'Chrome',
946
+ 'chrome',
947
+ 'Chromium',
948
+ 'chromium',
949
+ 'Microsoft Edge',
950
+ 'Brave',
951
+ 'Vivaldi',
952
+ ]
1161
953
  for (const appName of appNames) {
1162
954
  try {
1163
955
  const keyringPassword = this.getLinuxKeyringPassword(appName)
@@ -3,7 +3,14 @@
3
3
  import { Command } from 'commander'
4
4
 
5
5
  import pkg from '../../../package.json' with { type: 'json' }
6
- import { authCommand, channelCommand, messageCommand, reactionCommand, userCommand, whoamiCommand } from './commands/index'
6
+ import {
7
+ authCommand,
8
+ channelCommand,
9
+ messageCommand,
10
+ reactionCommand,
11
+ userCommand,
12
+ whoamiCommand,
13
+ } from './commands/index'
7
14
 
8
15
  const program = new Command()
9
16
 
@@ -17,7 +17,9 @@ const mockTestAuth = mock(() =>
17
17
 
18
18
  mock.module('../client', () => ({
19
19
  SlackBotClient: class MockSlackBotClient {
20
- async login(_credentials?: any) { return this }
20
+ async login(_credentials?: any) {
21
+ return this
22
+ }
21
23
  testAuth = mockTestAuth
22
24
  },
23
25
  }))
@@ -1,9 +1,9 @@
1
1
  import { readFile } from 'node:fs/promises'
2
2
  import { basename } from 'node:path'
3
3
 
4
+ import { TeamsCredentialManager } from './credential-manager'
4
5
  import type { TeamsChannel, TeamsFile, TeamsMessage, TeamsTeam, TeamsUser } from './types'
5
6
  import { TeamsError } from './types'
6
- import { TeamsCredentialManager } from './credential-manager'
7
7
 
8
8
  interface RateLimitBucket {
9
9
  remaining: number
@@ -1,9 +1,9 @@
1
1
  import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
2
2
 
3
- import { getNoTeamsTokenFoundMessage } from './auth'
4
3
  import { TeamsClient } from '../client'
5
4
  import { TeamsCredentialManager } from '../credential-manager'
6
5
  import { TeamsTokenExtractor } from '../token-extractor'
6
+ import { getNoTeamsTokenFoundMessage } from './auth'
7
7
 
8
8
  let extractorExtractSpy: ReturnType<typeof spyOn>
9
9
  let clientTestAuthSpy: ReturnType<typeof spyOn>
@@ -292,7 +292,10 @@ export async function statusAction(options: { pretty?: boolean }): Promise<void>
292
292
 
293
293
  if (!isExpired) {
294
294
  try {
295
- const client = await new TeamsClient().login({ token: account.token, tokenExpiresAt: account.token_expires_at ?? undefined })
295
+ const client = await new TeamsClient().login({
296
+ token: account.token,
297
+ tokenExpiresAt: account.token_expires_at ?? undefined,
298
+ })
296
299
  const authInfo = await client.testAuth()
297
300
  displayName = authInfo.displayName
298
301
  valid = true
@@ -8,7 +8,7 @@ test('snapshot: command is defined', () => {
8
8
  })
9
9
 
10
10
  test('snapshot: command has correct description', () => {
11
- expect(snapshotCommand.description()).toContain('team state')
11
+ expect(snapshotCommand.description()).toContain('team overview')
12
12
  })
13
13
 
14
14
  test('snapshot: command has --channels-only option', () => {
@@ -11,6 +11,7 @@ import type { TeamsChannel } from '../types'
11
11
  export async function snapshotAction(options: {
12
12
  channelsOnly?: boolean
13
13
  usersOnly?: boolean
14
+ full?: boolean
14
15
  limit?: number
15
16
  teamId?: string
16
17
  pretty?: boolean
@@ -34,7 +35,6 @@ export async function snapshotAction(options: {
34
35
  }
35
36
 
36
37
  const client = await new TeamsClient().login({ token: cred.token, tokenExpiresAt: cred.tokenExpiresAt })
37
- const messageLimit = options.limit || 20
38
38
 
39
39
  const snapshot: Record<string, unknown> = {}
40
40
 
@@ -45,47 +45,60 @@ export async function snapshotAction(options: {
45
45
  description: team.description,
46
46
  }
47
47
 
48
- if (!options.usersOnly) {
49
- const channels = await client.listChannels(teamId)
48
+ const isFull = options.full || options.channelsOnly || options.usersOnly
49
+ if (isFull) {
50
+ const messageLimit = options.limit || 20
50
51
 
51
- snapshot.channels = channels.map((ch) => ({
52
- id: ch.id,
53
- name: ch.name,
54
- type: ch.type,
55
- }))
52
+ if (!options.usersOnly) {
53
+ const channels = await client.listChannels(teamId)
56
54
 
57
- if (!options.channelsOnly) {
58
- const channelMessages = await parallelMap(
59
- channels,
60
- async (channel: TeamsChannel) => {
61
- const messages = await client.getMessages(teamId, channel.id, messageLimit)
62
- return messages.map((msg) => ({
63
- ...msg,
64
- channel_name: channel.name,
65
- }))
66
- },
67
- 5,
68
- )
69
-
70
- snapshot.recent_messages = channelMessages.flat().map((msg) => ({
71
- channel_id: msg.channel_id,
72
- channel_name: msg.channel_name,
73
- id: msg.id,
74
- author: msg.author.displayName,
75
- content: msg.content,
76
- timestamp: msg.timestamp,
55
+ snapshot.channels = channels.map((ch) => ({
56
+ id: ch.id,
57
+ name: ch.name,
58
+ type: ch.type,
77
59
  }))
60
+
61
+ if (!options.channelsOnly) {
62
+ const channelMessages = await parallelMap(
63
+ channels,
64
+ async (channel: TeamsChannel) => {
65
+ const messages = await client.getMessages(teamId, channel.id, messageLimit)
66
+ return messages.map((msg) => ({
67
+ ...msg,
68
+ channel_name: channel.name,
69
+ }))
70
+ },
71
+ 5,
72
+ )
73
+
74
+ snapshot.recent_messages = channelMessages.flat().map((msg) => ({
75
+ channel_id: msg.channel_id,
76
+ channel_name: msg.channel_name,
77
+ id: msg.id,
78
+ author: msg.author.displayName,
79
+ content: msg.content,
80
+ timestamp: msg.timestamp,
81
+ }))
82
+ }
78
83
  }
79
- }
80
84
 
81
- if (!options.channelsOnly) {
82
- const users = await client.listUsers(teamId)
85
+ if (!options.channelsOnly) {
86
+ const users = await client.listUsers(teamId)
87
+
88
+ snapshot.members = users.map((u) => ({
89
+ id: u.id,
90
+ displayName: u.displayName,
91
+ email: u.email || null,
92
+ }))
93
+ }
94
+ } else {
95
+ if (!options.usersOnly) {
96
+ const channels = await client.listChannels(teamId)
97
+ snapshot.channels = channels.map((ch) => ({ id: ch.id, name: ch.name }))
98
+ }
83
99
 
84
- snapshot.members = users.map((u) => ({
85
- id: u.id,
86
- displayName: u.displayName,
87
- email: u.email || null,
88
- }))
100
+ snapshot.hint =
101
+ "Use 'message list <channel>' for messages, 'channel info <channel>' for channel details, 'user list' for members."
89
102
  }
90
103
 
91
104
  console.log(formatOutput(snapshot, options.pretty))
@@ -95,16 +108,18 @@ export async function snapshotAction(options: {
95
108
  }
96
109
 
97
110
  export const snapshotCommand = new Command('snapshot')
98
- .description('Get comprehensive team state for AI agents')
111
+ .description('Get team overview for AI agents (brief by default, use --full for comprehensive data)')
112
+ .option('--full', 'Include messages and members (verbose)')
99
113
  .option('--channels-only', 'Include only channels (exclude messages and members)')
100
114
  .option('--users-only', 'Include only members (exclude channels and messages)')
101
- .option('--limit <n>', 'Number of recent messages per channel (default: 20)', '20')
115
+ .option('--limit <n>', 'Number of recent messages per channel with --full (default: 20)', '20')
102
116
  .option('--team-id <id>', 'Team ID (defaults to current team)')
103
117
  .option('--pretty', 'Pretty print JSON output')
104
118
  .action(async (options) => {
105
119
  await snapshotAction({
106
120
  channelsOnly: options.channelsOnly,
107
121
  usersOnly: options.usersOnly,
122
+ full: options.full,
108
123
  limit: parseInt(options.limit, 10),
109
124
  teamId: options.teamId,
110
125
  pretty: options.pretty,
@@ -1,8 +1,8 @@
1
1
  import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
2
2
 
3
3
  import { TeamsClient } from '@/platforms/teams/client'
4
- import { TeamsCredentialManager } from '@/platforms/teams/credential-manager'
5
4
  import { whoamiAction, whoamiCommand } from '@/platforms/teams/commands/whoami'
5
+ import { TeamsCredentialManager } from '@/platforms/teams/credential-manager'
6
6
 
7
7
  let credManagerSpy: ReturnType<typeof spyOn>
8
8
  let clientTestAuthSpy: ReturnType<typeof spyOn>
@@ -76,8 +76,6 @@ test('whoami exits with error when not authenticated', async () => {
76
76
 
77
77
  await whoamiAction({})
78
78
 
79
- expect(consoleLogSpy).toHaveBeenCalledWith(
80
- JSON.stringify({ error: 'Not authenticated. Run "auth extract" first.' }),
81
- )
79
+ expect(consoleLogSpy).toHaveBeenCalledWith(JSON.stringify({ error: 'Not authenticated. Run "auth extract" first.' }))
82
80
  expect(processExitSpy).toHaveBeenCalledWith(1)
83
81
  })
@@ -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 { TeamsClient } from '../client'
5
7
  import { TeamsCredentialManager } from '../credential-manager'
6
8
 
@@ -27,4 +27,3 @@ export {
27
27
  TeamsTeamSchema,
28
28
  TeamsUserSchema,
29
29
  } from './types'
30
-