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
@@ -28,7 +28,9 @@ const mockGetUser = mock((userId: string) => {
28
28
 
29
29
  mock.module('../client', () => ({
30
30
  DiscordBotClient: class MockDiscordBotClient {
31
- async login(_credentials?: any) { return this }
31
+ async login(_credentials?: any) {
32
+ return this
33
+ }
32
34
  listUsers = mockListUsers
33
35
  getUser = mockGetUser
34
36
  },
@@ -18,10 +18,7 @@ function isAuthCommand(command: CommandType): boolean {
18
18
 
19
19
  const program = new Command()
20
20
 
21
- program
22
- .name('agent-instagram')
23
- .description('CLI tool for Instagram DMs via private mobile API')
24
- .version(pkg.version)
21
+ program.name('agent-instagram').description('CLI tool for Instagram DMs via private mobile API').version(pkg.version)
25
22
 
26
23
  program.hook('preAction', async (_thisCommand, actionCommand) => {
27
24
  if (isAuthCommand(actionCommand)) return
@@ -104,8 +104,7 @@ describe('InstagramClient', () => {
104
104
  const mockManager = {
105
105
  getAccount: () =>
106
106
  Promise.resolve({ account_id: 'testuser', username: 'testuser', created_at: '', updated_at: '' }),
107
- ensureAccountPaths: () =>
108
- Promise.resolve({ account_dir: testDir, session_path: sessionPath }),
107
+ ensureAccountPaths: () => Promise.resolve({ account_dir: testDir, session_path: sessionPath }),
109
108
  } as any
110
109
 
111
110
  const client = new InstagramClient(mockManager)
@@ -124,9 +123,7 @@ describe('InstagramClient', () => {
124
123
  headers: {},
125
124
  }),
126
125
  )
127
- fetchResponses.push(
128
- jsonResponse({ status: 'ok', logged_in_user: { pk: '99' } }),
129
- )
126
+ fetchResponses.push(jsonResponse({ status: 'ok', logged_in_user: { pk: '99' } }))
130
127
 
131
128
  const client = new InstagramClient()
132
129
  const before = Math.floor(Date.now() / 1000)
@@ -155,9 +152,7 @@ describe('InstagramClient', () => {
155
152
  }),
156
153
  }),
157
154
  )
158
- fetchResponses.push(
159
- jsonResponse({ status: 'ok', logged_in_user: { pk: '99' } }),
160
- )
155
+ fetchResponses.push(jsonResponse({ status: 'ok', logged_in_user: { pk: '99' } }))
161
156
 
162
157
  const client = new InstagramClient()
163
158
  const before = Math.floor(Date.now() / 1000)
@@ -1,6 +1,7 @@
1
1
  import { constants, createCipheriv, publicEncrypt, randomBytes, randomUUID } from 'node:crypto'
2
2
  import { existsSync } from 'node:fs'
3
3
  import { mkdir, readFile, writeFile } from 'node:fs/promises'
4
+
4
5
  import { InstagramCredentialManager } from './credential-manager'
5
6
  import {
6
7
  InstagramError,
@@ -164,11 +165,7 @@ export class InstagramClient {
164
165
  return { userId: this.userId ?? '' }
165
166
  }
166
167
 
167
- async twoFactorLogin(
168
- username: string,
169
- code: string,
170
- twoFactorIdentifier: string,
171
- ): Promise<{ userId: string }> {
168
+ async twoFactorLogin(username: string, code: string, twoFactorIdentifier: string): Promise<{ userId: string }> {
172
169
  const { status, data } = await this.request('POST', '/accounts/two_factor_login/', {
173
170
  username,
174
171
  verification_code: code,
@@ -193,7 +190,10 @@ export class InstagramClient {
193
190
  ): Promise<{ contactPoint: string; stepName: string }> {
194
191
  this.ensureSession()
195
192
 
196
- const { data: getData } = await this.request('GET', `${apiPath}?guid=${this.session!.device.uuid}&device_id=${this.session!.device.android_device_id}`)
193
+ const { data: getData } = await this.request(
194
+ 'GET',
195
+ `${apiPath}?guid=${this.session!.device.uuid}&device_id=${this.session!.device.android_device_id}`,
196
+ )
197
197
  const stepName = (getData['step_name'] as string) ?? ''
198
198
 
199
199
  const choice = method === 'sms' ? '0' : '1'
@@ -210,10 +210,7 @@ export class InstagramClient {
210
210
  return { contactPoint, stepName: resultStep }
211
211
  }
212
212
 
213
- async challengeSubmitCode(
214
- apiPath: string,
215
- code: string,
216
- ): Promise<{ userId: string }> {
213
+ async challengeSubmitCode(apiPath: string, code: string): Promise<{ userId: string }> {
217
214
  this.ensureSession()
218
215
 
219
216
  const { status, data } = await this.request('POST', apiPath, {
@@ -304,9 +301,7 @@ export class InstagramClient {
304
301
  async searchChats(query: string, limit = 20): Promise<InstagramChatSummary[]> {
305
302
  const allChats = await this.listChats(Math.max(limit, 50))
306
303
  const lower = query.toLowerCase()
307
- return allChats
308
- .filter((c) => c.name.toLowerCase().includes(lower) || c.id.includes(query))
309
- .slice(0, limit)
304
+ return allChats.filter((c) => c.name.toLowerCase().includes(lower) || c.id.includes(query)).slice(0, limit)
310
305
  }
311
306
 
312
307
  async searchMessages(
@@ -410,7 +405,12 @@ export class InstagramClient {
410
405
  return this.userId
411
406
  }
412
407
 
413
- async getProfile(): Promise<{ user_id: string; username: string; full_name: string | null; profile_pic_url: string | null }> {
408
+ async getProfile(): Promise<{
409
+ user_id: string
410
+ username: string
411
+ full_name: string | null
412
+ profile_pic_url: string | null
413
+ }> {
414
414
  if (!this.userId) {
415
415
  throw new InstagramError('Not authenticated. Call login() first.', 'not_authenticated')
416
416
  }
@@ -441,17 +441,16 @@ export class InstagramClient {
441
441
  const keyIdHeader = response.headers.get('ig-set-password-encryption-key-id')
442
442
 
443
443
  if (pubKeyHeader && keyIdHeader) {
444
- this.debugLog?.(`encryption key_id=${keyIdHeader} pub_key_length=${pubKeyHeader.length} pub_key_prefix=${pubKeyHeader.substring(0, 40)}...`)
444
+ this.debugLog?.(
445
+ `encryption key_id=${keyIdHeader} pub_key_length=${pubKeyHeader.length} pub_key_prefix=${pubKeyHeader.substring(0, 40)}...`,
446
+ )
445
447
  return { keyId: keyIdHeader, publicKey: pubKeyHeader }
446
448
  }
447
449
 
448
450
  return null
449
451
  }
450
452
 
451
- private encryptPassword(
452
- password: string,
453
- key: { keyId: string; publicKey: string },
454
- ): string {
453
+ private encryptPassword(password: string, key: { keyId: string; publicKey: string }): string {
455
454
  const timestamp = Math.floor(Date.now() / 1000).toString()
456
455
  const passwordBytes = Buffer.from(password, 'utf-8')
457
456
 
@@ -463,21 +462,24 @@ export class InstagramClient {
463
462
  const tag = cipher.getAuthTag()
464
463
 
465
464
  const pubKeyPem = Buffer.from(key.publicKey, 'base64').toString('utf-8')
466
- const rsaEncrypted = publicEncrypt(
467
- { key: pubKeyPem, padding: constants.RSA_PKCS1_PADDING },
468
- aesKey,
469
- )
465
+ const rsaEncrypted = publicEncrypt({ key: pubKeyPem, padding: constants.RSA_PKCS1_PADDING }, aesKey)
470
466
 
471
467
  // Wire format: version(1) | keyId(1) | iv(12) | rsaLen(2 LE) | rsaEncrypted | tag(16) | aesEncrypted
472
468
  const keyIdNum = Number.parseInt(key.keyId, 10)
473
469
  const buf = Buffer.alloc(1 + 1 + 12 + 2 + rsaEncrypted.length + 16 + encrypted.length)
474
470
  let offset = 0
475
- buf.writeUInt8(1, offset); offset += 1
476
- buf.writeUInt8(keyIdNum, offset); offset += 1
477
- iv.copy(buf, offset); offset += 12
478
- buf.writeUInt16LE(rsaEncrypted.length, offset); offset += 2
479
- rsaEncrypted.copy(buf, offset); offset += rsaEncrypted.length
480
- tag.copy(buf, offset); offset += 16
471
+ buf.writeUInt8(1, offset)
472
+ offset += 1
473
+ buf.writeUInt8(keyIdNum, offset)
474
+ offset += 1
475
+ iv.copy(buf, offset)
476
+ offset += 12
477
+ buf.writeUInt16LE(rsaEncrypted.length, offset)
478
+ offset += 2
479
+ rsaEncrypted.copy(buf, offset)
480
+ offset += rsaEncrypted.length
481
+ tag.copy(buf, offset)
482
+ offset += 16
481
483
  encrypted.copy(buf, offset)
482
484
 
483
485
  return `#PWD_INSTAGRAM:4:${timestamp}:${buf.toString('base64')}`
@@ -532,7 +534,7 @@ export class InstagramClient {
532
534
  'X-IG-Connection-Type': 'WIFI',
533
535
  'X-IG-Timezone-Offset': String(new Date().getTimezoneOffset() * -60),
534
536
  'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
535
- 'Accept': '*/*',
537
+ Accept: '*/*',
536
538
  'Accept-Language': 'en-US,en;q=0.9',
537
539
  }
538
540
 
@@ -606,7 +608,6 @@ export class InstagramClient {
606
608
  if (this.session) {
607
609
  this.session.user_id = this.userId ?? undefined
608
610
  this.session.cookies = this.serializeCookies()
609
-
610
611
  }
611
612
 
612
613
  await this.saveSession()
@@ -634,9 +635,13 @@ export class InstagramClient {
634
635
  const items = (thread['items'] ?? []) as Array<Record<string, unknown>>
635
636
  const lastItem = items[0]
636
637
 
637
- const name = threadTitle
638
- || users.map((u) => (u['full_name'] as string) || (u['username'] as string) || '').filter(Boolean).join(', ')
639
- || threadId
638
+ const name =
639
+ threadTitle ||
640
+ users
641
+ .map((u) => (u['full_name'] as string) || (u['username'] as string) || '')
642
+ .filter(Boolean)
643
+ .join(', ') ||
644
+ threadId
640
645
 
641
646
  return {
642
647
  id: threadId,
@@ -21,8 +21,12 @@ import { authCommand } from './auth'
21
21
 
22
22
  function resetCommandState(cmd: Command): void {
23
23
  for (const sub of cmd.commands) {
24
- (sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> })._optionValues = {}
25
- ;(sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> })._optionValueSources = {}
24
+ ;(
25
+ sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> }
26
+ )._optionValues = {}
27
+ ;(
28
+ sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> }
29
+ )._optionValueSources = {}
26
30
  }
27
31
  }
28
32
 
@@ -38,7 +42,8 @@ describe('auth commands', () => {
38
42
  mockSetCurrent.mockReset()
39
43
  mockRemoveAccount.mockReset()
40
44
 
41
- consoleLogSpy = mock((..._args: unknown[]) => {}); console.log = consoleLogSpy
45
+ consoleLogSpy = mock((..._args: unknown[]) => {})
46
+ console.log = consoleLogSpy
42
47
  processExitSpy = spyOn(process, 'exit').mockImplementation(() => {
43
48
  throw new Error('process.exit called')
44
49
  })
@@ -53,9 +58,7 @@ describe('auth commands', () => {
53
58
  test('outputs error and exits when no account found', async () => {
54
59
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
55
60
 
56
- await expect(
57
- authCommand.parseAsync(['status'], { from: 'user' }),
58
- ).rejects.toThrow('process.exit called')
61
+ await expect(authCommand.parseAsync(['status'], { from: 'user' })).rejects.toThrow('process.exit called')
59
62
 
60
63
  expect(processExitSpy).toHaveBeenCalledWith(1)
61
64
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -160,9 +163,9 @@ describe('auth commands', () => {
160
163
  test('outputs error when account not found', async () => {
161
164
  mockSetCurrent.mockImplementation(() => Promise.resolve(false))
162
165
 
163
- await expect(
164
- authCommand.parseAsync(['use', 'missing_account'], { from: 'user' }),
165
- ).rejects.toThrow('process.exit called')
166
+ await expect(authCommand.parseAsync(['use', 'missing_account'], { from: 'user' })).rejects.toThrow(
167
+ 'process.exit called',
168
+ )
166
169
 
167
170
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
168
171
  expect(output.error).toContain('missing_account')
@@ -194,9 +197,7 @@ describe('auth commands', () => {
194
197
  test('outputs error when no account configured', async () => {
195
198
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
196
199
 
197
- await expect(
198
- authCommand.parseAsync(['logout'], { from: 'user' }),
199
- ).rejects.toThrow('process.exit called')
200
+ await expect(authCommand.parseAsync(['logout'], { from: 'user' })).rejects.toThrow('process.exit called')
200
201
 
201
202
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
202
203
  expect(output.error).toContain('No Instagram account configured')
@@ -3,9 +3,11 @@ import { mkdir, writeFile } from 'node:fs/promises'
3
3
  import { Writable } from 'node:stream'
4
4
 
5
5
  import { Command } from 'commander'
6
+
6
7
  import { handleError } from '@/shared/utils/error-handler'
7
8
  import { formatOutput } from '@/shared/utils/output'
8
9
  import { info, warn, error as stderrError, debug } from '@/shared/utils/stderr'
10
+
9
11
  import { InstagramClient, generateAndroidDeviceId, generateDeviceString } from '../client'
10
12
  import { InstagramCredentialManager } from '../credential-manager'
11
13
  import { InstagramTokenExtractor } from '../token-extractor'
@@ -65,11 +67,16 @@ async function saveAccountAndPrint(
65
67
  })
66
68
  await manager.setCurrent(accountId)
67
69
 
68
- console.log(formatOutput({
69
- authenticated: true,
70
- account_id: accountId,
71
- username,
72
- }, pretty))
70
+ console.log(
71
+ formatOutput(
72
+ {
73
+ authenticated: true,
74
+ account_id: accountId,
75
+ username,
76
+ },
77
+ pretty,
78
+ ),
79
+ )
73
80
  }
74
81
 
75
82
  interface LoginOptions {
@@ -86,24 +93,40 @@ async function loginAction(options: LoginOptions): Promise<void> {
86
93
 
87
94
  if (!username) {
88
95
  if (!interactive) {
89
- console.log(formatOutput({
90
- error: 'Username required. Use --username <username> --password <password>.',
91
- }, options.pretty))
96
+ console.log(
97
+ formatOutput(
98
+ {
99
+ error: 'Username required. Use --username <username> --password <password>.',
100
+ },
101
+ options.pretty,
102
+ ),
103
+ )
92
104
  process.exit(1)
93
105
  }
94
106
  username = await promptText('Instagram username')
95
- if (!username) { stderrError('Username is required.'); process.exit(1) }
107
+ if (!username) {
108
+ stderrError('Username is required.')
109
+ process.exit(1)
110
+ }
96
111
  }
97
112
 
98
113
  if (!password) {
99
114
  if (!interactive) {
100
- console.log(formatOutput({
101
- error: 'Password required. Use --username <username> --password <password>.',
102
- }, options.pretty))
115
+ console.log(
116
+ formatOutput(
117
+ {
118
+ error: 'Password required. Use --username <username> --password <password>.',
119
+ },
120
+ options.pretty,
121
+ ),
122
+ )
103
123
  process.exit(1)
104
124
  }
105
125
  password = await promptHidden('Password')
106
- if (!password) { stderrError('Password is required.'); process.exit(1) }
126
+ if (!password) {
127
+ stderrError('Password is required.')
128
+ process.exit(1)
129
+ }
107
130
  }
108
131
 
109
132
  const manager = new InstagramCredentialManager()
@@ -124,16 +147,25 @@ async function loginAction(options: LoginOptions): Promise<void> {
124
147
  if (interactive) {
125
148
  info('\n Two-factor authentication required.')
126
149
  const code = await promptText('Verification code')
127
- if (!code) { stderrError('Code is required.'); process.exit(1) }
150
+ if (!code) {
151
+ stderrError('Code is required.')
152
+ process.exit(1)
153
+ }
128
154
 
129
155
  const tfResult = await client.twoFactorLogin(username, code, twoFactorIdentifier)
130
156
  await saveAccountAndPrint(manager, accountId, username, tfResult.userId, options.pretty)
131
157
  } else {
132
- console.log(formatOutput({
133
- two_factor_required: true,
134
- two_factor_identifier: twoFactorIdentifier,
135
- message: 'Run "agent-instagram auth verify --username <username> --code <code> --identifier <identifier>"',
136
- }, options.pretty))
158
+ console.log(
159
+ formatOutput(
160
+ {
161
+ two_factor_required: true,
162
+ two_factor_identifier: twoFactorIdentifier,
163
+ message:
164
+ 'Run "agent-instagram auth verify --username <username> --code <code> --identifier <identifier>"',
165
+ },
166
+ options.pretty,
167
+ ),
168
+ )
137
169
  }
138
170
  return
139
171
  }
@@ -142,11 +174,17 @@ async function loginAction(options: LoginOptions): Promise<void> {
142
174
  if (interactive) {
143
175
  await handleInteractiveChallenge(client, manager, accountId, username, result.challengePath!, options.pretty)
144
176
  } else {
145
- console.log(formatOutput({
146
- challenge_required: true,
147
- challenge_path: result.challengePath,
148
- message: 'Run "agent-instagram auth challenge --username <username> --method email" then "agent-instagram auth challenge --username <username> --code <code>"',
149
- }, options.pretty))
177
+ console.log(
178
+ formatOutput(
179
+ {
180
+ challenge_required: true,
181
+ challenge_path: result.challengePath,
182
+ message:
183
+ 'Run "agent-instagram auth challenge --username <username> --method email" then "agent-instagram auth challenge --username <username> --code <code>"',
184
+ },
185
+ options.pretty,
186
+ ),
187
+ )
150
188
  }
151
189
  return
152
190
  }
@@ -172,7 +210,7 @@ async function handleInteractiveChallenge(
172
210
  info('')
173
211
 
174
212
  const choice = await promptText('Method (1/2)')
175
- const method = choice === '2' ? 'sms' as const : 'email' as const
213
+ const method = choice === '2' ? ('sms' as const) : ('email' as const)
176
214
 
177
215
  const sendResult = await client.challengeSendCode(challengePath, method)
178
216
  if (sendResult.contactPoint) {
@@ -182,7 +220,10 @@ async function handleInteractiveChallenge(
182
220
  }
183
221
 
184
222
  const code = await promptText('Verification code')
185
- if (!code) { stderrError('Code is required.'); process.exit(1) }
223
+ if (!code) {
224
+ stderrError('Code is required.')
225
+ process.exit(1)
226
+ }
186
227
 
187
228
  const verifyResult = await client.challengeSubmitCode(challengePath, code)
188
229
  await saveAccountAndPrint(manager, accountId, username, verifyResult.userId, pretty)
@@ -204,11 +245,7 @@ async function verifyAction(options: VerifyOptions): Promise<void> {
204
245
  const client = new InstagramClient(manager)
205
246
  client.setSessionPath(paths.session_path)
206
247
 
207
- const result = await client.twoFactorLogin(
208
- options.username,
209
- options.code,
210
- options.identifier,
211
- )
248
+ const result = await client.twoFactorLogin(options.username, options.code, options.identifier)
212
249
 
213
250
  await saveAccountAndPrint(manager, accountId, options.username, result.userId, options.pretty)
214
251
  } catch (error) {
@@ -235,9 +272,14 @@ async function challengeAction(options: ChallengeOptions): Promise<void> {
235
272
 
236
273
  const challengePath = client.getChallengePath()
237
274
  if (!challengePath) {
238
- console.log(formatOutput({
239
- error: 'No pending challenge found. Run "agent-instagram auth login" first.',
240
- }, options.pretty))
275
+ console.log(
276
+ formatOutput(
277
+ {
278
+ error: 'No pending challenge found. Run "agent-instagram auth login" first.',
279
+ },
280
+ options.pretty,
281
+ ),
282
+ )
241
283
  process.exit(1)
242
284
  }
243
285
 
@@ -248,12 +290,17 @@ async function challengeAction(options: ChallengeOptions): Promise<void> {
248
290
  const method = (options.method === 'sms' ? 'sms' : 'email') as 'email' | 'sms'
249
291
  const result = await client.challengeSendCode(challengePath, method)
250
292
 
251
- console.log(formatOutput({
252
- code_sent: true,
253
- contact_point: result.contactPoint,
254
- step_name: result.stepName,
255
- message: `Verification code sent. Run "agent-instagram auth challenge --username ${options.username} --code <code>" to complete.`,
256
- }, options.pretty))
293
+ console.log(
294
+ formatOutput(
295
+ {
296
+ code_sent: true,
297
+ contact_point: result.contactPoint,
298
+ step_name: result.stepName,
299
+ message: `Verification code sent. Run "agent-instagram auth challenge --username ${options.username} --code <code>" to complete.`,
300
+ },
301
+ options.pretty,
302
+ ),
303
+ )
257
304
  }
258
305
  } catch (error) {
259
306
  handleError(error as Error)
@@ -266,22 +313,32 @@ async function statusAction(options: { account?: string; pretty?: boolean }): Pr
266
313
  const account = await manager.getAccount(options.account)
267
314
 
268
315
  if (!account) {
269
- console.log(formatOutput({
270
- error: options.account
271
- ? `Instagram account "${options.account}" not found.`
272
- : 'No Instagram account configured. Run "auth login" first.',
273
- }, options.pretty))
316
+ console.log(
317
+ formatOutput(
318
+ {
319
+ error: options.account
320
+ ? `Instagram account "${options.account}" not found.`
321
+ : 'No Instagram account configured. Run "auth login" first.',
322
+ },
323
+ options.pretty,
324
+ ),
325
+ )
274
326
  process.exit(1)
275
327
  }
276
328
 
277
- console.log(formatOutput({
278
- account_id: account.account_id,
279
- username: account.username,
280
- full_name: account.full_name,
281
- pk: account.pk,
282
- created_at: account.created_at,
283
- updated_at: account.updated_at,
284
- }, options.pretty))
329
+ console.log(
330
+ formatOutput(
331
+ {
332
+ account_id: account.account_id,
333
+ username: account.username,
334
+ full_name: account.full_name,
335
+ pk: account.pk,
336
+ created_at: account.created_at,
337
+ updated_at: account.updated_at,
338
+ },
339
+ options.pretty,
340
+ ),
341
+ )
285
342
  } catch (error) {
286
343
  handleError(error as Error)
287
344
  }
@@ -292,18 +349,20 @@ async function listAction(options: { pretty?: boolean }): Promise<void> {
292
349
  const manager = new InstagramCredentialManager()
293
350
  const accounts = await manager.listAccounts()
294
351
 
295
- console.log(formatOutput(
296
- accounts.map((account) => ({
297
- account_id: account.account_id,
298
- username: account.username,
299
- full_name: account.full_name,
300
- pk: account.pk,
301
- created_at: account.created_at,
302
- updated_at: account.updated_at,
303
- is_current: account.is_current,
304
- })),
305
- options.pretty,
306
- ))
352
+ console.log(
353
+ formatOutput(
354
+ accounts.map((account) => ({
355
+ account_id: account.account_id,
356
+ username: account.username,
357
+ full_name: account.full_name,
358
+ pk: account.pk,
359
+ created_at: account.created_at,
360
+ updated_at: account.updated_at,
361
+ is_current: account.is_current,
362
+ })),
363
+ options.pretty,
364
+ ),
365
+ )
307
366
  } catch (error) {
308
367
  handleError(error as Error)
309
368
  }
@@ -343,7 +402,8 @@ async function extractAction(options: { pretty?: boolean; debug?: boolean }): Pr
343
402
  console.log(
344
403
  formatOutput(
345
404
  {
346
- error: 'No Instagram cookies found in any browser. Make sure you are logged in to instagram.com in Chrome, Edge, Arc, or Brave.',
405
+ error:
406
+ 'No Instagram cookies found in any browser. Make sure you are logged in to instagram.com in Chrome, Edge, Arc, or Brave.',
347
407
  hint: 'Run "auth login --username <username>" to log in manually.',
348
408
  },
349
409
  options.pretty,
@@ -440,11 +500,16 @@ async function logoutAction(options: { account?: string; pretty?: boolean }): Pr
440
500
  const account = await manager.getAccount(options.account)
441
501
 
442
502
  if (!account) {
443
- console.log(formatOutput({
444
- error: options.account
445
- ? `Instagram account "${options.account}" not found.`
446
- : 'No Instagram account configured.',
447
- }, options.pretty))
503
+ console.log(
504
+ formatOutput(
505
+ {
506
+ error: options.account
507
+ ? `Instagram account "${options.account}" not found.`
508
+ : 'No Instagram account configured.',
509
+ },
510
+ options.pretty,
511
+ ),
512
+ )
448
513
  process.exit(1)
449
514
  }
450
515