agent-messenger 2.6.3 → 2.8.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 (515) 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 -1
  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.map +1 -1
  15. package/dist/src/platforms/channeltalk/commands/snapshot.js.map +1 -1
  16. package/dist/src/platforms/channeltalk/ensure-auth.d.ts.map +1 -1
  17. package/dist/src/platforms/channeltalk/ensure-auth.js.map +1 -1
  18. package/dist/src/platforms/channeltalk/token-extractor.d.ts +9 -23
  19. package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
  20. package/dist/src/platforms/channeltalk/token-extractor.js +109 -341
  21. package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
  22. package/dist/src/platforms/channeltalkbot/client.d.ts +1 -1
  23. package/dist/src/platforms/channeltalkbot/client.d.ts.map +1 -1
  24. package/dist/src/platforms/channeltalkbot/client.js +4 -4
  25. package/dist/src/platforms/channeltalkbot/client.js.map +1 -1
  26. package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
  27. package/dist/src/platforms/channeltalkbot/commands/auth.js +4 -1
  28. package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
  29. package/dist/src/platforms/channeltalkbot/commands/shared.d.ts.map +1 -1
  30. package/dist/src/platforms/channeltalkbot/commands/shared.js.map +1 -1
  31. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  32. package/dist/src/platforms/discord/commands/whoami.d.ts.map +1 -1
  33. package/dist/src/platforms/discord/commands/whoami.js.map +1 -1
  34. package/dist/src/platforms/discord/token-extractor.d.ts +2 -10
  35. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  36. package/dist/src/platforms/discord/token-extractor.js +38 -172
  37. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  38. package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
  39. package/dist/src/platforms/discordbot/client.js.map +1 -1
  40. package/dist/src/platforms/instagram/cli.d.ts.map +1 -1
  41. package/dist/src/platforms/instagram/cli.js +1 -4
  42. package/dist/src/platforms/instagram/cli.js.map +1 -1
  43. package/dist/src/platforms/instagram/client.d.ts.map +1 -1
  44. package/dist/src/platforms/instagram/client.js +8 -7
  45. package/dist/src/platforms/instagram/client.js.map +1 -1
  46. package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
  47. package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
  48. package/dist/src/platforms/instagram/commands/chat.d.ts.map +1 -1
  49. package/dist/src/platforms/instagram/commands/chat.js.map +1 -1
  50. package/dist/src/platforms/instagram/commands/message.d.ts.map +1 -1
  51. package/dist/src/platforms/instagram/commands/message.js.map +1 -1
  52. package/dist/src/platforms/instagram/commands/shared.d.ts.map +1 -1
  53. package/dist/src/platforms/instagram/commands/shared.js.map +1 -1
  54. package/dist/src/platforms/instagram/credential-manager.d.ts.map +1 -1
  55. package/dist/src/platforms/instagram/credential-manager.js +1 -1
  56. package/dist/src/platforms/instagram/credential-manager.js.map +1 -1
  57. package/dist/src/platforms/instagram/ensure-auth.d.ts.map +1 -1
  58. package/dist/src/platforms/instagram/ensure-auth.js.map +1 -1
  59. package/dist/src/platforms/instagram/token-extractor.d.ts +7 -19
  60. package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
  61. package/dist/src/platforms/instagram/token-extractor.js +44 -270
  62. package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
  63. package/dist/src/platforms/instagram/types.d.ts.map +1 -1
  64. package/dist/src/platforms/instagram/types.js +4 -2
  65. package/dist/src/platforms/instagram/types.js.map +1 -1
  66. package/dist/src/platforms/kakaotalk/auth/kakao-login.d.ts.map +1 -1
  67. package/dist/src/platforms/kakaotalk/auth/kakao-login.js +18 -4
  68. package/dist/src/platforms/kakaotalk/auth/kakao-login.js.map +1 -1
  69. package/dist/src/platforms/kakaotalk/client.d.ts.map +1 -1
  70. package/dist/src/platforms/kakaotalk/client.js +3 -3
  71. package/dist/src/platforms/kakaotalk/client.js.map +1 -1
  72. package/dist/src/platforms/kakaotalk/commands/auth.d.ts.map +1 -1
  73. package/dist/src/platforms/kakaotalk/commands/auth.js +15 -9
  74. package/dist/src/platforms/kakaotalk/commands/auth.js.map +1 -1
  75. package/dist/src/platforms/kakaotalk/commands/shared.d.ts.map +1 -1
  76. package/dist/src/platforms/kakaotalk/commands/shared.js.map +1 -1
  77. package/dist/src/platforms/kakaotalk/protocol/connection.d.ts.map +1 -1
  78. package/dist/src/platforms/kakaotalk/protocol/connection.js.map +1 -1
  79. package/dist/src/platforms/kakaotalk/protocol/crypto.js +1 -1
  80. package/dist/src/platforms/kakaotalk/protocol/crypto.js.map +1 -1
  81. package/dist/src/platforms/kakaotalk/protocol/session.d.ts.map +1 -1
  82. package/dist/src/platforms/kakaotalk/protocol/session.js +1 -3
  83. package/dist/src/platforms/kakaotalk/protocol/session.js.map +1 -1
  84. package/dist/src/platforms/kakaotalk/token-extractor.js +5 -2
  85. package/dist/src/platforms/kakaotalk/token-extractor.js.map +1 -1
  86. package/dist/src/platforms/kakaotalk/types.d.ts.map +1 -1
  87. package/dist/src/platforms/kakaotalk/types.js +4 -2
  88. package/dist/src/platforms/kakaotalk/types.js.map +1 -1
  89. package/dist/src/platforms/line/cli.d.ts.map +1 -1
  90. package/dist/src/platforms/line/cli.js +1 -4
  91. package/dist/src/platforms/line/cli.js.map +1 -1
  92. package/dist/src/platforms/line/client.d.ts.map +1 -1
  93. package/dist/src/platforms/line/client.js +5 -13
  94. package/dist/src/platforms/line/client.js.map +1 -1
  95. package/dist/src/platforms/line/commands/chat.d.ts.map +1 -1
  96. package/dist/src/platforms/line/commands/chat.js.map +1 -1
  97. package/dist/src/platforms/line/commands/message.d.ts.map +1 -1
  98. package/dist/src/platforms/line/commands/message.js.map +1 -1
  99. package/dist/src/platforms/line/listener.js +1 -1
  100. package/dist/src/platforms/line/listener.js.map +1 -1
  101. package/dist/src/platforms/slack/cli.d.ts.map +1 -1
  102. package/dist/src/platforms/slack/cli.js.map +1 -1
  103. package/dist/src/platforms/slack/client-mappers.d.ts +14 -0
  104. package/dist/src/platforms/slack/client-mappers.d.ts.map +1 -0
  105. package/dist/src/platforms/slack/client-mappers.js +245 -0
  106. package/dist/src/platforms/slack/client-mappers.js.map +1 -0
  107. package/dist/src/platforms/slack/client.d.ts +0 -1
  108. package/dist/src/platforms/slack/client.d.ts.map +1 -1
  109. package/dist/src/platforms/slack/client.js +41 -455
  110. package/dist/src/platforms/slack/client.js.map +1 -1
  111. package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -1
  112. package/dist/src/platforms/slack/commands/channel.js.map +1 -1
  113. package/dist/src/platforms/slack/commands/emoji.d.ts.map +1 -1
  114. package/dist/src/platforms/slack/commands/emoji.js +1 -3
  115. package/dist/src/platforms/slack/commands/emoji.js.map +1 -1
  116. package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
  117. package/dist/src/platforms/slack/commands/message.js.map +1 -1
  118. package/dist/src/platforms/slack/commands/reminder.d.ts.map +1 -1
  119. package/dist/src/platforms/slack/commands/reminder.js.map +1 -1
  120. package/dist/src/platforms/slack/commands/user.d.ts.map +1 -1
  121. package/dist/src/platforms/slack/commands/user.js.map +1 -1
  122. package/dist/src/platforms/slack/commands/usergroup.d.ts.map +1 -1
  123. package/dist/src/platforms/slack/commands/usergroup.js.map +1 -1
  124. package/dist/src/platforms/slack/commands/whoami.d.ts.map +1 -1
  125. package/dist/src/platforms/slack/commands/whoami.js.map +1 -1
  126. package/dist/src/platforms/slack/token-extractor.d.ts +2 -6
  127. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  128. package/dist/src/platforms/slack/token-extractor.js +35 -229
  129. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  130. package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
  131. package/dist/src/platforms/slackbot/cli.js +1 -1
  132. package/dist/src/platforms/slackbot/cli.js.map +1 -1
  133. package/dist/src/platforms/teams/client.d.ts.map +1 -1
  134. package/dist/src/platforms/teams/client.js +1 -1
  135. package/dist/src/platforms/teams/client.js.map +1 -1
  136. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  137. package/dist/src/platforms/teams/commands/auth.js +4 -1
  138. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  139. package/dist/src/platforms/teams/commands/whoami.d.ts.map +1 -1
  140. package/dist/src/platforms/teams/commands/whoami.js.map +1 -1
  141. package/dist/src/platforms/teams/token-extractor.d.ts +6 -18
  142. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  143. package/dist/src/platforms/teams/token-extractor.js +71 -324
  144. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  145. package/dist/src/platforms/telegram/cli.d.ts.map +1 -1
  146. package/dist/src/platforms/telegram/cli.js +1 -4
  147. package/dist/src/platforms/telegram/cli.js.map +1 -1
  148. package/dist/src/platforms/telegram/client.d.ts.map +1 -1
  149. package/dist/src/platforms/telegram/client.js.map +1 -1
  150. package/dist/src/platforms/telegram/commands/auth.d.ts.map +1 -1
  151. package/dist/src/platforms/telegram/commands/auth.js +1 -1
  152. package/dist/src/platforms/telegram/commands/auth.js.map +1 -1
  153. package/dist/src/platforms/telegram/commands/chat.d.ts.map +1 -1
  154. package/dist/src/platforms/telegram/commands/chat.js.map +1 -1
  155. package/dist/src/platforms/telegram/commands/message.d.ts.map +1 -1
  156. package/dist/src/platforms/telegram/commands/message.js.map +1 -1
  157. package/dist/src/platforms/telegram/commands/whoami.js +1 -1
  158. package/dist/src/platforms/telegram/commands/whoami.js.map +1 -1
  159. package/dist/src/platforms/telegram/credential-manager.d.ts.map +1 -1
  160. package/dist/src/platforms/telegram/credential-manager.js +6 -2
  161. package/dist/src/platforms/telegram/credential-manager.js.map +1 -1
  162. package/dist/src/platforms/telegram/my-telegram-org.js.map +1 -1
  163. package/dist/src/platforms/webex/cli.d.ts.map +1 -1
  164. package/dist/src/platforms/webex/cli.js +1 -4
  165. package/dist/src/platforms/webex/cli.js.map +1 -1
  166. package/dist/src/platforms/webex/client.d.ts.map +1 -1
  167. package/dist/src/platforms/webex/client.js +19 -15
  168. package/dist/src/platforms/webex/client.js.map +1 -1
  169. package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
  170. package/dist/src/platforms/webex/commands/auth.js +1 -3
  171. package/dist/src/platforms/webex/commands/auth.js.map +1 -1
  172. package/dist/src/platforms/webex/commands/member.d.ts.map +1 -1
  173. package/dist/src/platforms/webex/commands/member.js +1 -3
  174. package/dist/src/platforms/webex/commands/member.js.map +1 -1
  175. package/dist/src/platforms/webex/commands/message.d.ts.map +1 -1
  176. package/dist/src/platforms/webex/commands/message.js.map +1 -1
  177. package/dist/src/platforms/webex/commands/snapshot.d.ts.map +1 -1
  178. package/dist/src/platforms/webex/commands/snapshot.js.map +1 -1
  179. package/dist/src/platforms/webex/commands/space.d.ts.map +1 -1
  180. package/dist/src/platforms/webex/commands/space.js.map +1 -1
  181. package/dist/src/platforms/webex/commands/whoami.d.ts.map +1 -1
  182. package/dist/src/platforms/webex/commands/whoami.js.map +1 -1
  183. package/dist/src/platforms/webex/credential-manager.d.ts.map +1 -1
  184. package/dist/src/platforms/webex/credential-manager.js.map +1 -1
  185. package/dist/src/platforms/webex/ensure-auth.d.ts.map +1 -1
  186. package/dist/src/platforms/webex/ensure-auth.js +1 -3
  187. package/dist/src/platforms/webex/ensure-auth.js.map +1 -1
  188. package/dist/src/platforms/webex/index.d.ts +1 -1
  189. package/dist/src/platforms/webex/index.d.ts.map +1 -1
  190. package/dist/src/platforms/webex/index.js.map +1 -1
  191. package/dist/src/platforms/webex/markdown-to-html.d.ts +3 -0
  192. package/dist/src/platforms/webex/markdown-to-html.d.ts.map +1 -0
  193. package/dist/src/platforms/webex/markdown-to-html.js +161 -0
  194. package/dist/src/platforms/webex/markdown-to-html.js.map +1 -0
  195. package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
  196. package/dist/src/platforms/webex/token-extractor.js +5 -14
  197. package/dist/src/platforms/webex/token-extractor.js.map +1 -1
  198. package/dist/src/platforms/wechatbot/client.d.ts.map +1 -1
  199. package/dist/src/platforms/wechatbot/client.js.map +1 -1
  200. package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
  201. package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
  202. package/dist/src/platforms/whatsapp/cli.d.ts.map +1 -1
  203. package/dist/src/platforms/whatsapp/cli.js +1 -4
  204. package/dist/src/platforms/whatsapp/cli.js.map +1 -1
  205. package/dist/src/platforms/whatsapp/commands/chat.d.ts.map +1 -1
  206. package/dist/src/platforms/whatsapp/commands/chat.js.map +1 -1
  207. package/dist/src/platforms/whatsapp/commands/message.d.ts.map +1 -1
  208. package/dist/src/platforms/whatsapp/commands/message.js.map +1 -1
  209. package/dist/src/platforms/whatsapp/commands/shared.d.ts.map +1 -1
  210. package/dist/src/platforms/whatsapp/commands/shared.js.map +1 -1
  211. package/dist/src/platforms/whatsapp/credential-manager.d.ts.map +1 -1
  212. package/dist/src/platforms/whatsapp/credential-manager.js +1 -1
  213. package/dist/src/platforms/whatsapp/credential-manager.js.map +1 -1
  214. package/dist/src/platforms/whatsapp/ensure-auth.d.ts.map +1 -1
  215. package/dist/src/platforms/whatsapp/ensure-auth.js.map +1 -1
  216. package/dist/src/platforms/whatsappbot/client.d.ts.map +1 -1
  217. package/dist/src/platforms/whatsappbot/client.js +2 -2
  218. package/dist/src/platforms/whatsappbot/client.js.map +1 -1
  219. package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
  220. package/dist/src/platforms/whatsappbot/commands/auth.js +4 -1
  221. package/dist/src/platforms/whatsappbot/commands/auth.js.map +1 -1
  222. package/dist/src/platforms/whatsappbot/commands/message.d.ts.map +1 -1
  223. package/dist/src/platforms/whatsappbot/commands/message.js.map +1 -1
  224. package/dist/src/platforms/whatsappbot/commands/shared.d.ts.map +1 -1
  225. package/dist/src/platforms/whatsappbot/commands/shared.js.map +1 -1
  226. package/dist/src/shared/chromium/browsers.d.ts +7 -0
  227. package/dist/src/shared/chromium/browsers.d.ts.map +1 -0
  228. package/dist/src/shared/chromium/browsers.js +89 -0
  229. package/dist/src/shared/chromium/browsers.js.map +1 -0
  230. package/dist/src/shared/chromium/cookie-reader.d.ts +20 -0
  231. package/dist/src/shared/chromium/cookie-reader.d.ts.map +1 -0
  232. package/dist/src/shared/chromium/cookie-reader.js +99 -0
  233. package/dist/src/shared/chromium/cookie-reader.js.map +1 -0
  234. package/dist/src/shared/chromium/decryptor.d.ts +42 -0
  235. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -0
  236. package/dist/src/shared/chromium/decryptor.js +205 -0
  237. package/dist/src/shared/chromium/decryptor.js.map +1 -0
  238. package/dist/src/shared/chromium/index.d.ts +6 -0
  239. package/dist/src/shared/chromium/index.d.ts.map +1 -0
  240. package/dist/src/shared/chromium/index.js +4 -0
  241. package/dist/src/shared/chromium/index.js.map +1 -0
  242. package/dist/src/shared/chromium/types.d.ts +11 -0
  243. package/dist/src/shared/chromium/types.d.ts.map +1 -0
  244. package/dist/src/shared/chromium/types.js +2 -0
  245. package/dist/src/shared/chromium/types.js.map +1 -0
  246. package/dist/src/shared/utils/derived-key-cache.d.ts +1 -1
  247. package/dist/src/shared/utils/derived-key-cache.d.ts.map +1 -1
  248. package/dist/src/shared/utils/linux-keyring.js +4 -1
  249. package/dist/src/shared/utils/linux-keyring.js.map +1 -1
  250. package/dist/src/tui/adapters/kakaotalk-adapter.d.ts.map +1 -1
  251. package/dist/src/tui/adapters/kakaotalk-adapter.js +6 -1
  252. package/dist/src/tui/adapters/kakaotalk-adapter.js.map +1 -1
  253. package/dist/src/tui/adapters/telegram-adapter.js +1 -1
  254. package/dist/src/tui/adapters/telegram-adapter.js.map +1 -1
  255. package/dist/src/tui/adapters/webex-adapter.js +1 -1
  256. package/dist/src/tui/adapters/webex-adapter.js.map +1 -1
  257. package/dist/src/tui/app.d.ts.map +1 -1
  258. package/dist/src/tui/app.js +112 -23
  259. package/dist/src/tui/app.js.map +1 -1
  260. package/dist/src/tui/utils.d.ts.map +1 -1
  261. package/dist/src/tui/utils.js +11 -13
  262. package/dist/src/tui/utils.js.map +1 -1
  263. package/dist/src/tui/views/channel-picker.d.ts.map +1 -1
  264. package/dist/src/tui/views/channel-picker.js.map +1 -1
  265. package/dist/src/tui/views/workspace-picker.d.ts.map +1 -1
  266. package/dist/src/tui/views/workspace-picker.js.map +1 -1
  267. package/docs/content/docs/cli/channeltalk.mdx +24 -22
  268. package/docs/content/docs/cli/channeltalkbot.mdx +7 -7
  269. package/docs/content/docs/cli/instagram.mdx +4 -4
  270. package/docs/content/docs/cli/kakaotalk.mdx +9 -8
  271. package/docs/content/docs/cli/line.mdx +14 -14
  272. package/docs/content/docs/cli/webex.mdx +19 -19
  273. package/docs/content/docs/cli/wechatbot.mdx +12 -11
  274. package/docs/content/docs/cli/whatsapp.mdx +5 -4
  275. package/docs/content/docs/cli/whatsappbot.mdx +11 -11
  276. package/docs/content/docs/index.mdx +7 -7
  277. package/docs/content/docs/meta.json +1 -9
  278. package/docs/content/docs/sdk/channeltalk.mdx +5 -6
  279. package/docs/content/docs/sdk/channeltalkbot.mdx +6 -12
  280. package/docs/content/docs/sdk/discord.mdx +36 -43
  281. package/docs/content/docs/sdk/instagram.mdx +18 -18
  282. package/docs/content/docs/sdk/kakaotalk.mdx +27 -18
  283. package/docs/content/docs/sdk/line.mdx +8 -13
  284. package/docs/content/docs/sdk/meta.json +14 -1
  285. package/docs/content/docs/sdk/slack.mdx +36 -42
  286. package/docs/content/docs/sdk/teams.mdx +2 -8
  287. package/docs/content/docs/sdk/webex.mdx +2 -12
  288. package/docs/content/docs/sdk/wechatbot.mdx +1 -5
  289. package/docs/content/docs/sdk/whatsapp.mdx +10 -19
  290. package/docs/content/docs/sdk/whatsappbot.mdx +2 -10
  291. package/docs/content/docs/tui.mdx +23 -23
  292. package/docs/src/app/page.tsx +353 -108
  293. package/e2e/channeltalkbot.e2e.test.ts +1 -5
  294. package/e2e/config.ts +6 -2
  295. package/package.json +59 -58
  296. package/scripts/prepublish.ts +1 -3
  297. package/skills/agent-channeltalk/SKILL.md +1 -1
  298. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  299. package/skills/agent-discord/SKILL.md +1 -1
  300. package/skills/agent-discordbot/SKILL.md +1 -1
  301. package/skills/agent-instagram/SKILL.md +1 -1
  302. package/skills/agent-kakaotalk/SKILL.md +1 -1
  303. package/skills/agent-line/SKILL.md +1 -1
  304. package/skills/agent-slack/SKILL.md +1 -1
  305. package/skills/agent-slackbot/SKILL.md +1 -1
  306. package/skills/agent-teams/SKILL.md +1 -1
  307. package/skills/agent-telegram/SKILL.md +1 -1
  308. package/skills/agent-webex/SKILL.md +1 -1
  309. package/skills/agent-wechatbot/SKILL.md +1 -1
  310. package/skills/agent-whatsapp/SKILL.md +1 -1
  311. package/skills/agent-whatsappbot/SKILL.md +1 -1
  312. package/src/platforms/channeltalk/client.test.ts +116 -29
  313. package/src/platforms/channeltalk/client.ts +26 -6
  314. package/src/platforms/channeltalk/commands/auth.test.ts +5 -5
  315. package/src/platforms/channeltalk/commands/auth.ts +19 -5
  316. package/src/platforms/channeltalk/commands/message.test.ts +2 -6
  317. package/src/platforms/channeltalk/commands/message.ts +5 -1
  318. package/src/platforms/channeltalk/commands/snapshot.test.ts +19 -4
  319. package/src/platforms/channeltalk/commands/snapshot.ts +5 -1
  320. package/src/platforms/channeltalk/ensure-auth.test.ts +20 -17
  321. package/src/platforms/channeltalk/ensure-auth.ts +6 -7
  322. package/src/platforms/channeltalk/index.ts +0 -1
  323. package/src/platforms/channeltalk/token-extractor.test.ts +33 -25
  324. package/src/platforms/channeltalk/token-extractor.ts +120 -372
  325. package/src/platforms/channeltalkbot/client.test.ts +1 -3
  326. package/src/platforms/channeltalkbot/client.ts +39 -13
  327. package/src/platforms/channeltalkbot/commands/auth.test.ts +3 -1
  328. package/src/platforms/channeltalkbot/commands/auth.ts +4 -1
  329. package/src/platforms/channeltalkbot/commands/bot.test.ts +13 -5
  330. package/src/platforms/channeltalkbot/commands/message.test.ts +12 -6
  331. package/src/platforms/channeltalkbot/commands/shared.ts +6 -2
  332. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +17 -5
  333. package/src/platforms/channeltalkbot/credential-manager.test.ts +1 -1
  334. package/src/platforms/channeltalkbot/index.test.ts +0 -2
  335. package/src/platforms/channeltalkbot/index.ts +0 -1
  336. package/src/platforms/discord/commands/auth.test.ts +6 -4
  337. package/src/platforms/discord/commands/auth.ts +14 -14
  338. package/src/platforms/discord/commands/whoami.test.ts +2 -4
  339. package/src/platforms/discord/commands/whoami.ts +2 -0
  340. package/src/platforms/discord/ensure-auth.test.ts +5 -3
  341. package/src/platforms/discord/index.ts +0 -1
  342. package/src/platforms/discord/listener.test.ts +7 -1
  343. package/src/platforms/discord/token-extractor.test.ts +18 -12
  344. package/src/platforms/discord/token-extractor.ts +46 -190
  345. package/src/platforms/discordbot/client.ts +1 -4
  346. package/src/platforms/discordbot/commands/auth.test.ts +3 -1
  347. package/src/platforms/discordbot/commands/channel.test.ts +3 -1
  348. package/src/platforms/discordbot/commands/message.test.ts +3 -1
  349. package/src/platforms/discordbot/commands/server.test.ts +3 -1
  350. package/src/platforms/discordbot/commands/snapshot.test.ts +3 -1
  351. package/src/platforms/discordbot/commands/thread.test.ts +3 -1
  352. package/src/platforms/discordbot/commands/user.test.ts +3 -1
  353. package/src/platforms/instagram/cli.ts +1 -4
  354. package/src/platforms/instagram/client.test.ts +3 -8
  355. package/src/platforms/instagram/client.ts +39 -34
  356. package/src/platforms/instagram/commands/auth.test.ts +13 -12
  357. package/src/platforms/instagram/commands/auth.ts +136 -71
  358. package/src/platforms/instagram/commands/chat.test.ts +21 -24
  359. package/src/platforms/instagram/commands/chat.ts +2 -0
  360. package/src/platforms/instagram/commands/message.test.ts +29 -24
  361. package/src/platforms/instagram/commands/message.ts +3 -4
  362. package/src/platforms/instagram/commands/shared.ts +2 -5
  363. package/src/platforms/instagram/commands/whoami.test.ts +4 -6
  364. package/src/platforms/instagram/credential-manager.ts +2 -6
  365. package/src/platforms/instagram/ensure-auth.test.ts +1 -4
  366. package/src/platforms/instagram/ensure-auth.ts +6 -3
  367. package/src/platforms/instagram/listener.test.ts +7 -3
  368. package/src/platforms/instagram/token-extractor.test.ts +4 -16
  369. package/src/platforms/instagram/token-extractor.ts +55 -309
  370. package/src/platforms/instagram/types.test.ts +2 -6
  371. package/src/platforms/instagram/types.ts +4 -2
  372. package/src/platforms/kakaotalk/auth/kakao-login.ts +30 -8
  373. package/src/platforms/kakaotalk/client.test.ts +37 -25
  374. package/src/platforms/kakaotalk/client.ts +23 -12
  375. package/src/platforms/kakaotalk/commands/auth.test.ts +6 -18
  376. package/src/platforms/kakaotalk/commands/auth.ts +101 -47
  377. package/src/platforms/kakaotalk/commands/chat.test.ts +8 -11
  378. package/src/platforms/kakaotalk/commands/message.test.ts +15 -24
  379. package/src/platforms/kakaotalk/commands/shared.ts +1 -0
  380. package/src/platforms/kakaotalk/commands/whoami.test.ts +6 -10
  381. package/src/platforms/kakaotalk/credential-manager.test.ts +1 -4
  382. package/src/platforms/kakaotalk/index.test.ts +1 -0
  383. package/src/platforms/kakaotalk/index.ts +0 -2
  384. package/src/platforms/kakaotalk/listener.test.ts +7 -1
  385. package/src/platforms/kakaotalk/protocol/connection.ts +4 -1
  386. package/src/platforms/kakaotalk/protocol/crypto.ts +1 -1
  387. package/src/platforms/kakaotalk/protocol/session.ts +12 -6
  388. package/src/platforms/kakaotalk/token-extractor.ts +5 -5
  389. package/src/platforms/kakaotalk/types.ts +8 -7
  390. package/src/platforms/line/cli.ts +1 -4
  391. package/src/platforms/line/client.ts +12 -20
  392. package/src/platforms/line/commands/auth.test.ts +2 -1
  393. package/src/platforms/line/commands/chat.test.ts +2 -1
  394. package/src/platforms/line/commands/chat.ts +1 -4
  395. package/src/platforms/line/commands/friend.test.ts +2 -1
  396. package/src/platforms/line/commands/message.test.ts +2 -1
  397. package/src/platforms/line/commands/message.ts +2 -9
  398. package/src/platforms/line/commands/whoami.test.ts +2 -1
  399. package/src/platforms/line/credential-manager.test.ts +1 -2
  400. package/src/platforms/line/index.test.ts +1 -0
  401. package/src/platforms/line/listener.ts +1 -1
  402. package/src/platforms/line/types.test.ts +1 -0
  403. package/src/platforms/slack/cli.ts +3 -1
  404. package/src/platforms/slack/client-mappers.ts +297 -0
  405. package/src/platforms/slack/client.test.ts +532 -17
  406. package/src/platforms/slack/client.ts +69 -458
  407. package/src/platforms/slack/commands/channel.ts +1 -4
  408. package/src/platforms/slack/commands/emoji.test.ts +6 -4
  409. package/src/platforms/slack/commands/emoji.ts +20 -22
  410. package/src/platforms/slack/commands/message.ts +6 -1
  411. package/src/platforms/slack/commands/pin.test.ts +14 -12
  412. package/src/platforms/slack/commands/reminder.ts +7 -6
  413. package/src/platforms/slack/commands/user.ts +6 -1
  414. package/src/platforms/slack/commands/usergroup.test.ts +3 -3
  415. package/src/platforms/slack/commands/usergroup.ts +10 -7
  416. package/src/platforms/slack/commands/whoami.test.ts +1 -1
  417. package/src/platforms/slack/commands/whoami.ts +2 -0
  418. package/src/platforms/slack/index.ts +0 -2
  419. package/src/platforms/slack/listener.test.ts +1 -0
  420. package/src/platforms/slack/token-extractor.test.ts +7 -12
  421. package/src/platforms/slack/token-extractor.ts +47 -255
  422. package/src/platforms/slackbot/cli.ts +8 -1
  423. package/src/platforms/slackbot/commands/auth.test.ts +3 -1
  424. package/src/platforms/teams/client.ts +1 -1
  425. package/src/platforms/teams/commands/auth.test.ts +1 -1
  426. package/src/platforms/teams/commands/auth.ts +4 -1
  427. package/src/platforms/teams/commands/whoami.test.ts +2 -4
  428. package/src/platforms/teams/commands/whoami.ts +2 -0
  429. package/src/platforms/teams/index.ts +0 -1
  430. package/src/platforms/teams/token-extractor.ts +82 -350
  431. package/src/platforms/telegram/app-config.test.ts +1 -0
  432. package/src/platforms/telegram/chat-utils.test.ts +5 -1
  433. package/src/platforms/telegram/cli.ts +2 -4
  434. package/src/platforms/telegram/client.test.ts +16 -3
  435. package/src/platforms/telegram/client.ts +14 -4
  436. package/src/platforms/telegram/commands/auth.test.ts +1 -0
  437. package/src/platforms/telegram/commands/auth.ts +3 -4
  438. package/src/platforms/telegram/commands/chat.test.ts +2 -5
  439. package/src/platforms/telegram/commands/chat.ts +1 -0
  440. package/src/platforms/telegram/commands/message.test.ts +2 -5
  441. package/src/platforms/telegram/commands/message.ts +1 -0
  442. package/src/platforms/telegram/commands/shared.test.ts +1 -0
  443. package/src/platforms/telegram/commands/whoami.test.ts +5 -7
  444. package/src/platforms/telegram/commands/whoami.ts +1 -1
  445. package/src/platforms/telegram/credential-manager.test.ts +1 -0
  446. package/src/platforms/telegram/credential-manager.ts +11 -2
  447. package/src/platforms/telegram/my-telegram-org.ts +6 -2
  448. package/src/platforms/telegram/types.test.ts +1 -0
  449. package/src/platforms/webex/app-config.test.ts +1 -0
  450. package/src/platforms/webex/cli.ts +1 -4
  451. package/src/platforms/webex/client.test.ts +39 -12
  452. package/src/platforms/webex/client.ts +30 -61
  453. package/src/platforms/webex/commands/auth.test.ts +7 -1
  454. package/src/platforms/webex/commands/auth.ts +12 -15
  455. package/src/platforms/webex/commands/member.test.ts +1 -3
  456. package/src/platforms/webex/commands/member.ts +14 -19
  457. package/src/platforms/webex/commands/message.ts +4 -15
  458. package/src/platforms/webex/commands/snapshot.test.ts +28 -3
  459. package/src/platforms/webex/commands/snapshot.ts +3 -3
  460. package/src/platforms/webex/commands/space.test.ts +3 -3
  461. package/src/platforms/webex/commands/space.ts +2 -9
  462. package/src/platforms/webex/commands/whoami.test.ts +12 -5
  463. package/src/platforms/webex/commands/whoami.ts +2 -0
  464. package/src/platforms/webex/credential-manager.ts +11 -2
  465. package/src/platforms/webex/ensure-auth.ts +1 -3
  466. package/src/platforms/webex/index.ts +1 -7
  467. package/src/platforms/webex/markdown-to-html.test.ts +141 -0
  468. package/src/platforms/webex/markdown-to-html.ts +194 -0
  469. package/src/platforms/webex/token-extractor.ts +6 -29
  470. package/src/platforms/wechatbot/cli.ts +0 -0
  471. package/src/platforms/wechatbot/client.test.ts +6 -2
  472. package/src/platforms/wechatbot/client.ts +6 -1
  473. package/src/platforms/wechatbot/commands/auth.test.ts +3 -7
  474. package/src/platforms/wechatbot/commands/message.test.ts +1 -4
  475. package/src/platforms/wechatbot/commands/message.ts +5 -1
  476. package/src/platforms/wechatbot/commands/template.test.ts +1 -4
  477. package/src/platforms/wechatbot/commands/user.test.ts +2 -7
  478. package/src/platforms/whatsapp/cli.ts +1 -4
  479. package/src/platforms/whatsapp/commands/auth.test.ts +19 -22
  480. package/src/platforms/whatsapp/commands/chat.test.ts +21 -24
  481. package/src/platforms/whatsapp/commands/chat.ts +2 -0
  482. package/src/platforms/whatsapp/commands/message.test.ts +22 -24
  483. package/src/platforms/whatsapp/commands/message.ts +3 -5
  484. package/src/platforms/whatsapp/commands/shared.ts +2 -5
  485. package/src/platforms/whatsapp/commands/whoami.test.ts +2 -2
  486. package/src/platforms/whatsapp/credential-manager.ts +2 -6
  487. package/src/platforms/whatsapp/ensure-auth.test.ts +1 -4
  488. package/src/platforms/whatsapp/ensure-auth.ts +14 -6
  489. package/src/platforms/whatsapp/index.ts +0 -2
  490. package/src/platforms/whatsappbot/client.test.ts +13 -7
  491. package/src/platforms/whatsappbot/client.ts +18 -4
  492. package/src/platforms/whatsappbot/commands/auth.ts +4 -1
  493. package/src/platforms/whatsappbot/commands/message.test.ts +12 -2
  494. package/src/platforms/whatsappbot/commands/message.ts +16 -3
  495. package/src/platforms/whatsappbot/commands/shared.ts +3 -1
  496. package/src/platforms/whatsappbot/commands/whoami.test.ts +1 -3
  497. package/src/platforms/whatsappbot/index.ts +0 -2
  498. package/src/shared/chromium/browsers.test.ts +274 -0
  499. package/src/shared/chromium/browsers.ts +86 -0
  500. package/src/shared/chromium/cookie-reader.test.ts +274 -0
  501. package/src/shared/chromium/cookie-reader.ts +111 -0
  502. package/src/shared/chromium/decryptor.test.ts +449 -0
  503. package/src/shared/chromium/decryptor.ts +227 -0
  504. package/src/shared/chromium/index.ts +11 -0
  505. package/src/shared/chromium/types.ts +11 -0
  506. package/src/shared/utils/derived-key-cache.ts +1 -1
  507. package/src/shared/utils/linux-keyring.ts +4 -4
  508. package/src/tui/adapters/kakaotalk-adapter.ts +6 -1
  509. package/src/tui/adapters/telegram-adapter.ts +1 -1
  510. package/src/tui/adapters/webex-adapter.ts +1 -1
  511. package/src/tui/app.ts +149 -59
  512. package/src/tui/utils.test.ts +144 -145
  513. package/src/tui/utils.ts +27 -29
  514. package/src/tui/views/channel-picker.ts +1 -1
  515. package/src/tui/views/workspace-picker.ts +1 -1
@@ -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
 
@@ -10,9 +10,7 @@ const mockListChats = mock(() =>
10
10
  ]),
11
11
  )
12
12
 
13
- const mockSearchChats = mock(() =>
14
- Promise.resolve([{ id: 'thread-1', title: 'Alice', last_message: 'Hi' }]),
15
- )
13
+ const mockSearchChats = mock(() => Promise.resolve([{ id: 'thread-1', title: 'Alice', last_message: 'Hi' }]))
16
14
 
17
15
  const mockClient = {
18
16
  listChats: mockListChats,
@@ -29,8 +27,12 @@ import { chatCommand } from './chat'
29
27
 
30
28
  function resetCommandState(cmd: Command): void {
31
29
  for (const sub of cmd.commands) {
32
- (sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> })._optionValues = {}
33
- ;(sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> })._optionValueSources = {}
30
+ ;(
31
+ sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> }
32
+ )._optionValues = {}
33
+ ;(
34
+ sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> }
35
+ )._optionValueSources = {}
34
36
  }
35
37
  }
36
38
 
@@ -50,11 +52,10 @@ describe('chat commands', () => {
50
52
  { id: 'thread-2', title: 'Bob', last_message: 'Hey' },
51
53
  ]),
52
54
  )
53
- mockSearchChats.mockImplementation(() =>
54
- Promise.resolve([{ id: 'thread-1', title: 'Alice', last_message: 'Hi' }]),
55
- )
55
+ mockSearchChats.mockImplementation(() => Promise.resolve([{ id: 'thread-1', title: 'Alice', last_message: 'Hi' }]))
56
56
 
57
- consoleLogSpy = mock((..._args: unknown[]) => {}); console.log = consoleLogSpy
57
+ consoleLogSpy = mock((..._args: unknown[]) => {})
58
+ console.log = consoleLogSpy
58
59
  processExitSpy = spyOn(process, 'exit').mockImplementation(() => {
59
60
  throw new Error('process.exit called')
60
61
  })
@@ -67,9 +68,7 @@ describe('chat commands', () => {
67
68
 
68
69
  describe('list', () => {
69
70
  test('lists DM conversations', async () => {
70
- await expect(
71
- chatCommand.parseAsync(['list'], { from: 'user' }),
72
- ).rejects.toThrow('process.exit called')
71
+ await expect(chatCommand.parseAsync(['list'], { from: 'user' })).rejects.toThrow('process.exit called')
73
72
 
74
73
  expect(processExitSpy).toHaveBeenCalledWith(0)
75
74
  expect(mockListChats).toHaveBeenCalledWith(20)
@@ -80,9 +79,9 @@ describe('chat commands', () => {
80
79
  })
81
80
 
82
81
  test('passes custom limit', async () => {
83
- await expect(
84
- chatCommand.parseAsync(['list', '--limit', '5'], { from: 'user' }),
85
- ).rejects.toThrow('process.exit called')
82
+ await expect(chatCommand.parseAsync(['list', '--limit', '5'], { from: 'user' })).rejects.toThrow(
83
+ 'process.exit called',
84
+ )
86
85
 
87
86
  expect(mockListChats).toHaveBeenCalledWith(5)
88
87
  })
@@ -90,9 +89,7 @@ describe('chat commands', () => {
90
89
 
91
90
  describe('search', () => {
92
91
  test('searches DM conversations by query', async () => {
93
- await expect(
94
- chatCommand.parseAsync(['search', 'Alice'], { from: 'user' }),
95
- ).rejects.toThrow('process.exit called')
92
+ await expect(chatCommand.parseAsync(['search', 'Alice'], { from: 'user' })).rejects.toThrow('process.exit called')
96
93
 
97
94
  expect(processExitSpy).toHaveBeenCalledWith(0)
98
95
  expect(mockSearchChats).toHaveBeenCalledWith('Alice', 20)
@@ -102,9 +99,9 @@ describe('chat commands', () => {
102
99
  })
103
100
 
104
101
  test('passes custom limit to search', async () => {
105
- await expect(
106
- chatCommand.parseAsync(['search', 'Alice', '--limit', '10'], { from: 'user' }),
107
- ).rejects.toThrow('process.exit called')
102
+ await expect(chatCommand.parseAsync(['search', 'Alice', '--limit', '10'], { from: 'user' })).rejects.toThrow(
103
+ 'process.exit called',
104
+ )
108
105
 
109
106
  expect(mockSearchChats).toHaveBeenCalledWith('Alice', 10)
110
107
  })
@@ -112,9 +109,9 @@ describe('chat commands', () => {
112
109
  test('returns empty array when no results', async () => {
113
110
  mockSearchChats.mockImplementation(() => Promise.resolve([]))
114
111
 
115
- await expect(
116
- chatCommand.parseAsync(['search', 'nobody'], { from: 'user' }),
117
- ).rejects.toThrow('process.exit called')
112
+ await expect(chatCommand.parseAsync(['search', 'nobody'], { from: 'user' })).rejects.toThrow(
113
+ 'process.exit called',
114
+ )
118
115
 
119
116
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
120
117
  expect(output).toEqual([])
@@ -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 { parseLimitOption, withInstagramClient } from './shared'
5
7
 
6
8
  async function listAction(options: { account?: string; pretty?: boolean; limit?: string }): Promise<void> {
@@ -27,8 +27,12 @@ import { messageCommand } from './message'
27
27
 
28
28
  function resetCommandState(cmd: Command): void {
29
29
  for (const sub of cmd.commands) {
30
- (sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> })._optionValues = {}
31
- ;(sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> })._optionValueSources = {}
30
+ ;(
31
+ sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> }
32
+ )._optionValues = {}
33
+ ;(
34
+ sub as unknown as { _optionValues: Record<string, unknown>; _optionValueSources: Record<string, unknown> }
35
+ )._optionValueSources = {}
32
36
  }
33
37
  }
34
38
 
@@ -51,7 +55,8 @@ describe('message commands', () => {
51
55
  mockSearchMessages.mockImplementation(() => Promise.resolve([{ id: 'msg-4', text: 'Found' }]))
52
56
  mockSearchUsers.mockImplementation(() => Promise.resolve([{ pk: '999', username: 'targetuser' }]))
53
57
 
54
- consoleLogSpy = mock((..._args: unknown[]) => {}); console.log = consoleLogSpy
58
+ consoleLogSpy = mock((..._args: unknown[]) => {})
59
+ console.log = consoleLogSpy
55
60
  processExitSpy = spyOn(process, 'exit').mockImplementation(() => {
56
61
  throw new Error('process.exit called')
57
62
  })
@@ -64,9 +69,9 @@ describe('message commands', () => {
64
69
 
65
70
  describe('list', () => {
66
71
  test('lists messages from a thread', async () => {
67
- await expect(
68
- messageCommand.parseAsync(['list', 'thread-123'], { from: 'user' }),
69
- ).rejects.toThrow('process.exit called')
72
+ await expect(messageCommand.parseAsync(['list', 'thread-123'], { from: 'user' })).rejects.toThrow(
73
+ 'process.exit called',
74
+ )
70
75
 
71
76
  expect(processExitSpy).toHaveBeenCalledWith(0)
72
77
  expect(mockGetMessages).toHaveBeenCalledWith('thread-123', 25)
@@ -85,9 +90,9 @@ describe('message commands', () => {
85
90
 
86
91
  describe('send', () => {
87
92
  test('sends a message to a thread', async () => {
88
- await expect(
89
- messageCommand.parseAsync(['send', 'thread-123', 'Hello world'], { from: 'user' }),
90
- ).rejects.toThrow('process.exit called')
93
+ await expect(messageCommand.parseAsync(['send', 'thread-123', 'Hello world'], { from: 'user' })).rejects.toThrow(
94
+ 'process.exit called',
95
+ )
91
96
 
92
97
  expect(processExitSpy).toHaveBeenCalledWith(0)
93
98
  expect(mockSendMessage).toHaveBeenCalledWith('thread-123', 'Hello world')
@@ -98,9 +103,9 @@ describe('message commands', () => {
98
103
 
99
104
  describe('send-to', () => {
100
105
  test('sends a message to a user by username', async () => {
101
- await expect(
102
- messageCommand.parseAsync(['send-to', 'targetuser', 'Hi there'], { from: 'user' }),
103
- ).rejects.toThrow('process.exit called')
106
+ await expect(messageCommand.parseAsync(['send-to', 'targetuser', 'Hi there'], { from: 'user' })).rejects.toThrow(
107
+ 'process.exit called',
108
+ )
104
109
 
105
110
  expect(processExitSpy).toHaveBeenCalledWith(0)
106
111
  expect(mockSearchUsers).toHaveBeenCalledWith('targetuser')
@@ -110,9 +115,9 @@ describe('message commands', () => {
110
115
  })
111
116
 
112
117
  test('strips @ prefix from username', async () => {
113
- await expect(
114
- messageCommand.parseAsync(['send-to', '@targetuser', 'Hi there'], { from: 'user' }),
115
- ).rejects.toThrow('process.exit called')
118
+ await expect(messageCommand.parseAsync(['send-to', '@targetuser', 'Hi there'], { from: 'user' })).rejects.toThrow(
119
+ 'process.exit called',
120
+ )
116
121
 
117
122
  expect(mockSearchUsers).toHaveBeenCalledWith('targetuser')
118
123
  })
@@ -132,9 +137,9 @@ describe('message commands', () => {
132
137
 
133
138
  describe('search', () => {
134
139
  test('searches messages by query', async () => {
135
- await expect(
136
- messageCommand.parseAsync(['search', 'hello'], { from: 'user' }),
137
- ).rejects.toThrow('process.exit called')
140
+ await expect(messageCommand.parseAsync(['search', 'hello'], { from: 'user' })).rejects.toThrow(
141
+ 'process.exit called',
142
+ )
138
143
 
139
144
  expect(processExitSpy).toHaveBeenCalledWith(0)
140
145
  expect(mockSearchMessages).toHaveBeenCalledWith('hello', { threadId: undefined, limit: 20 })
@@ -151,9 +156,9 @@ describe('message commands', () => {
151
156
  })
152
157
 
153
158
  test('passes limit option to search', async () => {
154
- await expect(
155
- messageCommand.parseAsync(['search', 'hello2', '--limit', '5'], { from: 'user' }),
156
- ).rejects.toThrow('process.exit called')
159
+ await expect(messageCommand.parseAsync(['search', 'hello2', '--limit', '5'], { from: 'user' })).rejects.toThrow(
160
+ 'process.exit called',
161
+ )
157
162
 
158
163
  expect(mockSearchMessages).toHaveBeenCalledWith('hello2', { threadId: undefined, limit: 5 })
159
164
  })
@@ -161,9 +166,9 @@ describe('message commands', () => {
161
166
 
162
167
  describe('search-users', () => {
163
168
  test('searches users by query', async () => {
164
- await expect(
165
- messageCommand.parseAsync(['search-users', 'target'], { from: 'user' }),
166
- ).rejects.toThrow('process.exit called')
169
+ await expect(messageCommand.parseAsync(['search-users', 'target'], { from: 'user' })).rejects.toThrow(
170
+ 'process.exit called',
171
+ )
167
172
 
168
173
  expect(processExitSpy).toHaveBeenCalledWith(0)
169
174
  expect(mockSearchUsers).toHaveBeenCalledWith('target')
@@ -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 { parseLimitOption, withInstagramClient } from './shared'
5
7
 
6
8
  async function listAction(
@@ -72,10 +74,7 @@ async function searchAction(
72
74
  }
73
75
  }
74
76
 
75
- async function searchUsersAction(
76
- query: string,
77
- options: { account?: string; pretty?: boolean },
78
- ): Promise<void> {
77
+ async function searchUsersAction(query: string, options: { account?: string; pretty?: boolean }): Promise<void> {
79
78
  try {
80
79
  const users = await withInstagramClient(options, (client) => client.searchUsers(query))
81
80
  console.log(formatOutput(users, options.pretty))
@@ -1,4 +1,5 @@
1
1
  import { formatOutput } from '@/shared/utils/output'
2
+
2
3
  import { InstagramClient } from '../client'
3
4
  import { InstagramCredentialManager } from '../credential-manager'
4
5
  import { InstagramError } from '../types'
@@ -8,11 +9,7 @@ export interface AccountOption {
8
9
  pretty?: boolean
9
10
  }
10
11
 
11
- export function parseLimitOption(
12
- rawLimit: string | undefined,
13
- defaultValue: number,
14
- maxValue = 100,
15
- ): number {
12
+ export function parseLimitOption(rawLimit: string | undefined, defaultValue: number, maxValue = 100): number {
16
13
  const trimmed = (rawLimit ?? `${defaultValue}`).trim()
17
14
 
18
15
  if (!/^\d+$/.test(trimmed)) {
@@ -16,12 +16,10 @@ describe('whoami command', () => {
16
16
  full_name: 'Test User',
17
17
  profile_pic_url: 'https://example.com/pic.jpg',
18
18
  })
19
- withInstagramClientSpy = spyOn(sharedModule, 'withInstagramClient').mockImplementation(
20
- async (_opts, fn) => {
21
- const fakeClient = Object.create(InstagramClient.prototype) as InstagramClient
22
- return fn(fakeClient)
23
- },
24
- )
19
+ withInstagramClientSpy = spyOn(sharedModule, 'withInstagramClient').mockImplementation(async (_opts, fn) => {
20
+ const fakeClient = Object.create(InstagramClient.prototype) as InstagramClient
21
+ return fn(fakeClient)
22
+ })
25
23
  consoleLogSpy = spyOn(console, 'log').mockImplementation(() => {})
26
24
  })
27
25