agent-messenger 2.7.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (553) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.github/workflows/ci.yml +6 -0
  3. package/.oxfmtrc.json +13 -1
  4. package/.oxlintrc.json +10 -1
  5. package/README.md +1 -12
  6. package/dist/package.json +59 -58
  7. package/dist/src/platforms/channeltalk/client.d.ts.map +1 -1
  8. package/dist/src/platforms/channeltalk/client.js +2 -2
  9. package/dist/src/platforms/channeltalk/client.js.map +1 -1
  10. package/dist/src/platforms/channeltalk/commands/auth.d.ts.map +1 -1
  11. package/dist/src/platforms/channeltalk/commands/auth.js.map +1 -1
  12. package/dist/src/platforms/channeltalk/commands/message.d.ts.map +1 -1
  13. package/dist/src/platforms/channeltalk/commands/message.js.map +1 -1
  14. package/dist/src/platforms/channeltalk/commands/snapshot.d.ts +4 -2
  15. package/dist/src/platforms/channeltalk/commands/snapshot.d.ts.map +1 -1
  16. package/dist/src/platforms/channeltalk/commands/snapshot.js +86 -31
  17. package/dist/src/platforms/channeltalk/commands/snapshot.js.map +1 -1
  18. package/dist/src/platforms/channeltalk/ensure-auth.d.ts.map +1 -1
  19. package/dist/src/platforms/channeltalk/ensure-auth.js.map +1 -1
  20. package/dist/src/platforms/channeltalk/token-extractor.d.ts +9 -23
  21. package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
  22. package/dist/src/platforms/channeltalk/token-extractor.js +109 -341
  23. package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
  24. package/dist/src/platforms/channeltalkbot/client.d.ts +1 -1
  25. package/dist/src/platforms/channeltalkbot/client.d.ts.map +1 -1
  26. package/dist/src/platforms/channeltalkbot/client.js +4 -4
  27. package/dist/src/platforms/channeltalkbot/client.js.map +1 -1
  28. package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
  29. package/dist/src/platforms/channeltalkbot/commands/auth.js +4 -1
  30. package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
  31. package/dist/src/platforms/channeltalkbot/commands/shared.d.ts.map +1 -1
  32. package/dist/src/platforms/channeltalkbot/commands/shared.js.map +1 -1
  33. package/dist/src/platforms/channeltalkbot/commands/snapshot.d.ts +3 -1
  34. package/dist/src/platforms/channeltalkbot/commands/snapshot.d.ts.map +1 -1
  35. package/dist/src/platforms/channeltalkbot/commands/snapshot.js +110 -60
  36. package/dist/src/platforms/channeltalkbot/commands/snapshot.js.map +1 -1
  37. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  38. package/dist/src/platforms/discord/commands/snapshot.d.ts +1 -0
  39. package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -1
  40. package/dist/src/platforms/discord/commands/snapshot.js +48 -34
  41. package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
  42. package/dist/src/platforms/discord/commands/whoami.d.ts.map +1 -1
  43. package/dist/src/platforms/discord/commands/whoami.js.map +1 -1
  44. package/dist/src/platforms/discord/token-extractor.d.ts +2 -10
  45. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  46. package/dist/src/platforms/discord/token-extractor.js +38 -172
  47. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  48. package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
  49. package/dist/src/platforms/discordbot/client.js.map +1 -1
  50. package/dist/src/platforms/discordbot/commands/snapshot.d.ts +2 -0
  51. package/dist/src/platforms/discordbot/commands/snapshot.d.ts.map +1 -1
  52. package/dist/src/platforms/discordbot/commands/snapshot.js +46 -34
  53. package/dist/src/platforms/discordbot/commands/snapshot.js.map +1 -1
  54. package/dist/src/platforms/instagram/cli.d.ts.map +1 -1
  55. package/dist/src/platforms/instagram/cli.js +1 -4
  56. package/dist/src/platforms/instagram/cli.js.map +1 -1
  57. package/dist/src/platforms/instagram/client.d.ts.map +1 -1
  58. package/dist/src/platforms/instagram/client.js +8 -7
  59. package/dist/src/platforms/instagram/client.js.map +1 -1
  60. package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
  61. package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
  62. package/dist/src/platforms/instagram/commands/chat.d.ts.map +1 -1
  63. package/dist/src/platforms/instagram/commands/chat.js.map +1 -1
  64. package/dist/src/platforms/instagram/commands/message.d.ts.map +1 -1
  65. package/dist/src/platforms/instagram/commands/message.js.map +1 -1
  66. package/dist/src/platforms/instagram/commands/shared.d.ts.map +1 -1
  67. package/dist/src/platforms/instagram/commands/shared.js.map +1 -1
  68. package/dist/src/platforms/instagram/credential-manager.d.ts.map +1 -1
  69. package/dist/src/platforms/instagram/credential-manager.js +1 -1
  70. package/dist/src/platforms/instagram/credential-manager.js.map +1 -1
  71. package/dist/src/platforms/instagram/ensure-auth.d.ts.map +1 -1
  72. package/dist/src/platforms/instagram/ensure-auth.js.map +1 -1
  73. package/dist/src/platforms/instagram/token-extractor.d.ts +7 -19
  74. package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
  75. package/dist/src/platforms/instagram/token-extractor.js +44 -270
  76. package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
  77. package/dist/src/platforms/instagram/types.d.ts.map +1 -1
  78. package/dist/src/platforms/instagram/types.js +4 -2
  79. package/dist/src/platforms/instagram/types.js.map +1 -1
  80. package/dist/src/platforms/kakaotalk/auth/kakao-login.d.ts.map +1 -1
  81. package/dist/src/platforms/kakaotalk/auth/kakao-login.js +18 -4
  82. package/dist/src/platforms/kakaotalk/auth/kakao-login.js.map +1 -1
  83. package/dist/src/platforms/kakaotalk/client.d.ts.map +1 -1
  84. package/dist/src/platforms/kakaotalk/client.js +3 -3
  85. package/dist/src/platforms/kakaotalk/client.js.map +1 -1
  86. package/dist/src/platforms/kakaotalk/commands/auth.d.ts.map +1 -1
  87. package/dist/src/platforms/kakaotalk/commands/auth.js +15 -9
  88. package/dist/src/platforms/kakaotalk/commands/auth.js.map +1 -1
  89. package/dist/src/platforms/kakaotalk/commands/shared.d.ts.map +1 -1
  90. package/dist/src/platforms/kakaotalk/commands/shared.js.map +1 -1
  91. package/dist/src/platforms/kakaotalk/protocol/connection.d.ts.map +1 -1
  92. package/dist/src/platforms/kakaotalk/protocol/connection.js.map +1 -1
  93. package/dist/src/platforms/kakaotalk/protocol/crypto.js +1 -1
  94. package/dist/src/platforms/kakaotalk/protocol/crypto.js.map +1 -1
  95. package/dist/src/platforms/kakaotalk/protocol/session.d.ts.map +1 -1
  96. package/dist/src/platforms/kakaotalk/protocol/session.js +1 -3
  97. package/dist/src/platforms/kakaotalk/protocol/session.js.map +1 -1
  98. package/dist/src/platforms/kakaotalk/token-extractor.js +5 -2
  99. package/dist/src/platforms/kakaotalk/token-extractor.js.map +1 -1
  100. package/dist/src/platforms/kakaotalk/types.d.ts.map +1 -1
  101. package/dist/src/platforms/kakaotalk/types.js +4 -2
  102. package/dist/src/platforms/kakaotalk/types.js.map +1 -1
  103. package/dist/src/platforms/line/cli.d.ts.map +1 -1
  104. package/dist/src/platforms/line/cli.js +1 -4
  105. package/dist/src/platforms/line/cli.js.map +1 -1
  106. package/dist/src/platforms/line/client.d.ts.map +1 -1
  107. package/dist/src/platforms/line/client.js +5 -13
  108. package/dist/src/platforms/line/client.js.map +1 -1
  109. package/dist/src/platforms/line/commands/chat.d.ts.map +1 -1
  110. package/dist/src/platforms/line/commands/chat.js.map +1 -1
  111. package/dist/src/platforms/line/commands/message.d.ts.map +1 -1
  112. package/dist/src/platforms/line/commands/message.js.map +1 -1
  113. package/dist/src/platforms/line/listener.js +1 -1
  114. package/dist/src/platforms/line/listener.js.map +1 -1
  115. package/dist/src/platforms/slack/cli.d.ts.map +1 -1
  116. package/dist/src/platforms/slack/cli.js.map +1 -1
  117. package/dist/src/platforms/slack/client-mappers.d.ts +14 -0
  118. package/dist/src/platforms/slack/client-mappers.d.ts.map +1 -0
  119. package/dist/src/platforms/slack/client-mappers.js +245 -0
  120. package/dist/src/platforms/slack/client-mappers.js.map +1 -0
  121. package/dist/src/platforms/slack/client.d.ts +0 -1
  122. package/dist/src/platforms/slack/client.d.ts.map +1 -1
  123. package/dist/src/platforms/slack/client.js +41 -455
  124. package/dist/src/platforms/slack/client.js.map +1 -1
  125. package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -1
  126. package/dist/src/platforms/slack/commands/channel.js.map +1 -1
  127. package/dist/src/platforms/slack/commands/emoji.d.ts.map +1 -1
  128. package/dist/src/platforms/slack/commands/emoji.js +1 -3
  129. package/dist/src/platforms/slack/commands/emoji.js.map +1 -1
  130. package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
  131. package/dist/src/platforms/slack/commands/message.js.map +1 -1
  132. package/dist/src/platforms/slack/commands/reminder.d.ts.map +1 -1
  133. package/dist/src/platforms/slack/commands/reminder.js.map +1 -1
  134. package/dist/src/platforms/slack/commands/snapshot.d.ts.map +1 -1
  135. package/dist/src/platforms/slack/commands/snapshot.js +75 -55
  136. package/dist/src/platforms/slack/commands/snapshot.js.map +1 -1
  137. package/dist/src/platforms/slack/commands/user.d.ts.map +1 -1
  138. package/dist/src/platforms/slack/commands/user.js.map +1 -1
  139. package/dist/src/platforms/slack/commands/usergroup.d.ts.map +1 -1
  140. package/dist/src/platforms/slack/commands/usergroup.js.map +1 -1
  141. package/dist/src/platforms/slack/commands/whoami.d.ts.map +1 -1
  142. package/dist/src/platforms/slack/commands/whoami.js.map +1 -1
  143. package/dist/src/platforms/slack/token-extractor.d.ts +2 -6
  144. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  145. package/dist/src/platforms/slack/token-extractor.js +35 -229
  146. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  147. package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
  148. package/dist/src/platforms/slackbot/cli.js +1 -1
  149. package/dist/src/platforms/slackbot/cli.js.map +1 -1
  150. package/dist/src/platforms/teams/client.d.ts.map +1 -1
  151. package/dist/src/platforms/teams/client.js +1 -1
  152. package/dist/src/platforms/teams/client.js.map +1 -1
  153. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  154. package/dist/src/platforms/teams/commands/auth.js +4 -1
  155. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  156. package/dist/src/platforms/teams/commands/snapshot.d.ts +1 -0
  157. package/dist/src/platforms/teams/commands/snapshot.d.ts.map +1 -1
  158. package/dist/src/platforms/teams/commands/snapshot.js +44 -31
  159. package/dist/src/platforms/teams/commands/snapshot.js.map +1 -1
  160. package/dist/src/platforms/teams/commands/whoami.d.ts.map +1 -1
  161. package/dist/src/platforms/teams/commands/whoami.js.map +1 -1
  162. package/dist/src/platforms/teams/token-extractor.d.ts +6 -18
  163. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  164. package/dist/src/platforms/teams/token-extractor.js +71 -324
  165. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  166. package/dist/src/platforms/telegram/cli.d.ts.map +1 -1
  167. package/dist/src/platforms/telegram/cli.js +1 -4
  168. package/dist/src/platforms/telegram/cli.js.map +1 -1
  169. package/dist/src/platforms/telegram/client.d.ts.map +1 -1
  170. package/dist/src/platforms/telegram/client.js.map +1 -1
  171. package/dist/src/platforms/telegram/commands/auth.d.ts.map +1 -1
  172. package/dist/src/platforms/telegram/commands/auth.js +1 -1
  173. package/dist/src/platforms/telegram/commands/auth.js.map +1 -1
  174. package/dist/src/platforms/telegram/commands/chat.d.ts.map +1 -1
  175. package/dist/src/platforms/telegram/commands/chat.js.map +1 -1
  176. package/dist/src/platforms/telegram/commands/message.d.ts.map +1 -1
  177. package/dist/src/platforms/telegram/commands/message.js.map +1 -1
  178. package/dist/src/platforms/telegram/commands/whoami.js +1 -1
  179. package/dist/src/platforms/telegram/commands/whoami.js.map +1 -1
  180. package/dist/src/platforms/telegram/credential-manager.d.ts.map +1 -1
  181. package/dist/src/platforms/telegram/credential-manager.js +6 -2
  182. package/dist/src/platforms/telegram/credential-manager.js.map +1 -1
  183. package/dist/src/platforms/telegram/my-telegram-org.js.map +1 -1
  184. package/dist/src/platforms/webex/cli.d.ts.map +1 -1
  185. package/dist/src/platforms/webex/cli.js +1 -4
  186. package/dist/src/platforms/webex/cli.js.map +1 -1
  187. package/dist/src/platforms/webex/client.d.ts.map +1 -1
  188. package/dist/src/platforms/webex/client.js +3 -7
  189. package/dist/src/platforms/webex/client.js.map +1 -1
  190. package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
  191. package/dist/src/platforms/webex/commands/auth.js +1 -3
  192. package/dist/src/platforms/webex/commands/auth.js.map +1 -1
  193. package/dist/src/platforms/webex/commands/member.d.ts.map +1 -1
  194. package/dist/src/platforms/webex/commands/member.js +1 -3
  195. package/dist/src/platforms/webex/commands/member.js.map +1 -1
  196. package/dist/src/platforms/webex/commands/message.d.ts.map +1 -1
  197. package/dist/src/platforms/webex/commands/message.js.map +1 -1
  198. package/dist/src/platforms/webex/commands/snapshot.d.ts +1 -0
  199. package/dist/src/platforms/webex/commands/snapshot.d.ts.map +1 -1
  200. package/dist/src/platforms/webex/commands/snapshot.js +14 -7
  201. package/dist/src/platforms/webex/commands/snapshot.js.map +1 -1
  202. package/dist/src/platforms/webex/commands/space.d.ts.map +1 -1
  203. package/dist/src/platforms/webex/commands/space.js.map +1 -1
  204. package/dist/src/platforms/webex/commands/whoami.d.ts.map +1 -1
  205. package/dist/src/platforms/webex/commands/whoami.js.map +1 -1
  206. package/dist/src/platforms/webex/credential-manager.d.ts.map +1 -1
  207. package/dist/src/platforms/webex/credential-manager.js.map +1 -1
  208. package/dist/src/platforms/webex/ensure-auth.d.ts.map +1 -1
  209. package/dist/src/platforms/webex/ensure-auth.js +1 -3
  210. package/dist/src/platforms/webex/ensure-auth.js.map +1 -1
  211. package/dist/src/platforms/webex/index.d.ts +1 -1
  212. package/dist/src/platforms/webex/index.d.ts.map +1 -1
  213. package/dist/src/platforms/webex/index.js.map +1 -1
  214. package/dist/src/platforms/webex/markdown-to-html.js.map +1 -1
  215. package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
  216. package/dist/src/platforms/webex/token-extractor.js +5 -14
  217. package/dist/src/platforms/webex/token-extractor.js.map +1 -1
  218. package/dist/src/platforms/wechatbot/client.d.ts.map +1 -1
  219. package/dist/src/platforms/wechatbot/client.js.map +1 -1
  220. package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
  221. package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
  222. package/dist/src/platforms/whatsapp/cli.d.ts.map +1 -1
  223. package/dist/src/platforms/whatsapp/cli.js +1 -4
  224. package/dist/src/platforms/whatsapp/cli.js.map +1 -1
  225. package/dist/src/platforms/whatsapp/commands/chat.d.ts.map +1 -1
  226. package/dist/src/platforms/whatsapp/commands/chat.js.map +1 -1
  227. package/dist/src/platforms/whatsapp/commands/message.d.ts.map +1 -1
  228. package/dist/src/platforms/whatsapp/commands/message.js.map +1 -1
  229. package/dist/src/platforms/whatsapp/commands/shared.d.ts.map +1 -1
  230. package/dist/src/platforms/whatsapp/commands/shared.js.map +1 -1
  231. package/dist/src/platforms/whatsapp/credential-manager.d.ts.map +1 -1
  232. package/dist/src/platforms/whatsapp/credential-manager.js +1 -1
  233. package/dist/src/platforms/whatsapp/credential-manager.js.map +1 -1
  234. package/dist/src/platforms/whatsapp/ensure-auth.d.ts.map +1 -1
  235. package/dist/src/platforms/whatsapp/ensure-auth.js.map +1 -1
  236. package/dist/src/platforms/whatsappbot/client.d.ts.map +1 -1
  237. package/dist/src/platforms/whatsappbot/client.js +2 -2
  238. package/dist/src/platforms/whatsappbot/client.js.map +1 -1
  239. package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
  240. package/dist/src/platforms/whatsappbot/commands/auth.js +4 -1
  241. package/dist/src/platforms/whatsappbot/commands/auth.js.map +1 -1
  242. package/dist/src/platforms/whatsappbot/commands/message.d.ts.map +1 -1
  243. package/dist/src/platforms/whatsappbot/commands/message.js.map +1 -1
  244. package/dist/src/platforms/whatsappbot/commands/shared.d.ts.map +1 -1
  245. package/dist/src/platforms/whatsappbot/commands/shared.js.map +1 -1
  246. package/dist/src/shared/chromium/browsers.d.ts +7 -0
  247. package/dist/src/shared/chromium/browsers.d.ts.map +1 -0
  248. package/dist/src/shared/chromium/browsers.js +89 -0
  249. package/dist/src/shared/chromium/browsers.js.map +1 -0
  250. package/dist/src/shared/chromium/cookie-reader.d.ts +20 -0
  251. package/dist/src/shared/chromium/cookie-reader.d.ts.map +1 -0
  252. package/dist/src/shared/chromium/cookie-reader.js +99 -0
  253. package/dist/src/shared/chromium/cookie-reader.js.map +1 -0
  254. package/dist/src/shared/chromium/decryptor.d.ts +42 -0
  255. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -0
  256. package/dist/src/shared/chromium/decryptor.js +205 -0
  257. package/dist/src/shared/chromium/decryptor.js.map +1 -0
  258. package/dist/src/shared/chromium/index.d.ts +6 -0
  259. package/dist/src/shared/chromium/index.d.ts.map +1 -0
  260. package/dist/src/shared/chromium/index.js +4 -0
  261. package/dist/src/shared/chromium/index.js.map +1 -0
  262. package/dist/src/shared/chromium/types.d.ts +11 -0
  263. package/dist/src/shared/chromium/types.d.ts.map +1 -0
  264. package/dist/src/shared/chromium/types.js +2 -0
  265. package/dist/src/shared/chromium/types.js.map +1 -0
  266. package/dist/src/shared/utils/derived-key-cache.d.ts +1 -1
  267. package/dist/src/shared/utils/derived-key-cache.d.ts.map +1 -1
  268. package/dist/src/shared/utils/linux-keyring.js +4 -1
  269. package/dist/src/shared/utils/linux-keyring.js.map +1 -1
  270. package/dist/src/tui/adapters/kakaotalk-adapter.d.ts.map +1 -1
  271. package/dist/src/tui/adapters/kakaotalk-adapter.js +6 -1
  272. package/dist/src/tui/adapters/kakaotalk-adapter.js.map +1 -1
  273. package/dist/src/tui/adapters/telegram-adapter.js +1 -1
  274. package/dist/src/tui/adapters/telegram-adapter.js.map +1 -1
  275. package/dist/src/tui/adapters/webex-adapter.js +1 -1
  276. package/dist/src/tui/adapters/webex-adapter.js.map +1 -1
  277. package/dist/src/tui/app.d.ts.map +1 -1
  278. package/dist/src/tui/app.js +112 -23
  279. package/dist/src/tui/app.js.map +1 -1
  280. package/dist/src/tui/utils.d.ts.map +1 -1
  281. package/dist/src/tui/utils.js +11 -13
  282. package/dist/src/tui/utils.js.map +1 -1
  283. package/dist/src/tui/views/channel-picker.d.ts.map +1 -1
  284. package/dist/src/tui/views/channel-picker.js.map +1 -1
  285. package/dist/src/tui/views/workspace-picker.d.ts.map +1 -1
  286. package/dist/src/tui/views/workspace-picker.js.map +1 -1
  287. package/docs/content/docs/agent-skills.mdx +0 -10
  288. package/docs/content/docs/cli/channeltalk.mdx +42 -30
  289. package/docs/content/docs/cli/channeltalkbot.mdx +23 -13
  290. package/docs/content/docs/cli/discord.mdx +23 -7
  291. package/docs/content/docs/cli/discordbot.mdx +23 -7
  292. package/docs/content/docs/cli/instagram.mdx +4 -4
  293. package/docs/content/docs/cli/kakaotalk.mdx +9 -8
  294. package/docs/content/docs/cli/line.mdx +14 -14
  295. package/docs/content/docs/cli/slack.mdx +24 -7
  296. package/docs/content/docs/cli/teams.mdx +24 -8
  297. package/docs/content/docs/cli/webex.mdx +34 -21
  298. package/docs/content/docs/cli/wechatbot.mdx +12 -11
  299. package/docs/content/docs/cli/whatsapp.mdx +5 -4
  300. package/docs/content/docs/cli/whatsappbot.mdx +11 -11
  301. package/docs/content/docs/index.mdx +7 -7
  302. package/docs/content/docs/meta.json +1 -9
  303. package/docs/content/docs/sdk/channeltalk.mdx +5 -6
  304. package/docs/content/docs/sdk/channeltalkbot.mdx +6 -12
  305. package/docs/content/docs/sdk/discord.mdx +36 -43
  306. package/docs/content/docs/sdk/instagram.mdx +18 -18
  307. package/docs/content/docs/sdk/kakaotalk.mdx +27 -18
  308. package/docs/content/docs/sdk/line.mdx +8 -13
  309. package/docs/content/docs/sdk/meta.json +14 -1
  310. package/docs/content/docs/sdk/slack.mdx +36 -42
  311. package/docs/content/docs/sdk/teams.mdx +2 -8
  312. package/docs/content/docs/sdk/webex.mdx +2 -12
  313. package/docs/content/docs/sdk/wechatbot.mdx +1 -5
  314. package/docs/content/docs/sdk/whatsapp.mdx +10 -19
  315. package/docs/content/docs/sdk/whatsappbot.mdx +2 -10
  316. package/docs/content/docs/tui.mdx +23 -23
  317. package/docs/src/app/page.tsx +353 -108
  318. package/e2e/channeltalkbot.e2e.test.ts +1 -5
  319. package/e2e/config.ts +6 -2
  320. package/package.json +59 -58
  321. package/scripts/prepublish.ts +1 -3
  322. package/skills/agent-channeltalk/SKILL.md +19 -9
  323. package/skills/agent-channeltalk/references/common-patterns.md +10 -9
  324. package/skills/agent-channeltalkbot/SKILL.md +19 -9
  325. package/skills/agent-channeltalkbot/references/common-patterns.md +10 -9
  326. package/skills/agent-discord/SKILL.md +18 -9
  327. package/skills/agent-discord/references/common-patterns.md +8 -7
  328. package/skills/agent-discordbot/SKILL.md +18 -9
  329. package/skills/agent-instagram/SKILL.md +1 -1
  330. package/skills/agent-kakaotalk/SKILL.md +1 -1
  331. package/skills/agent-line/SKILL.md +1 -1
  332. package/skills/agent-slack/SKILL.md +19 -10
  333. package/skills/agent-slack/references/common-patterns.md +4 -7
  334. package/skills/agent-slackbot/SKILL.md +1 -1
  335. package/skills/agent-teams/SKILL.md +18 -9
  336. package/skills/agent-teams/references/common-patterns.md +9 -7
  337. package/skills/agent-telegram/SKILL.md +1 -1
  338. package/skills/agent-webex/SKILL.md +13 -4
  339. package/skills/agent-webex/references/common-patterns.md +8 -2
  340. package/skills/agent-wechatbot/SKILL.md +1 -1
  341. package/skills/agent-whatsapp/SKILL.md +1 -1
  342. package/skills/agent-whatsappbot/SKILL.md +1 -1
  343. package/src/platforms/channeltalk/client.test.ts +116 -29
  344. package/src/platforms/channeltalk/client.ts +26 -6
  345. package/src/platforms/channeltalk/commands/auth.test.ts +5 -5
  346. package/src/platforms/channeltalk/commands/auth.ts +19 -5
  347. package/src/platforms/channeltalk/commands/message.test.ts +2 -6
  348. package/src/platforms/channeltalk/commands/message.ts +5 -1
  349. package/src/platforms/channeltalk/commands/snapshot.test.ts +77 -30
  350. package/src/platforms/channeltalk/commands/snapshot.ts +112 -34
  351. package/src/platforms/channeltalk/ensure-auth.test.ts +20 -17
  352. package/src/platforms/channeltalk/ensure-auth.ts +6 -7
  353. package/src/platforms/channeltalk/index.ts +0 -1
  354. package/src/platforms/channeltalk/token-extractor.test.ts +33 -25
  355. package/src/platforms/channeltalk/token-extractor.ts +120 -372
  356. package/src/platforms/channeltalkbot/client.test.ts +1 -3
  357. package/src/platforms/channeltalkbot/client.ts +39 -13
  358. package/src/platforms/channeltalkbot/commands/auth.test.ts +3 -1
  359. package/src/platforms/channeltalkbot/commands/auth.ts +4 -1
  360. package/src/platforms/channeltalkbot/commands/bot.test.ts +13 -5
  361. package/src/platforms/channeltalkbot/commands/message.test.ts +12 -6
  362. package/src/platforms/channeltalkbot/commands/shared.ts +6 -2
  363. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +43 -13
  364. package/src/platforms/channeltalkbot/commands/snapshot.ts +131 -64
  365. package/src/platforms/channeltalkbot/credential-manager.test.ts +1 -1
  366. package/src/platforms/channeltalkbot/index.test.ts +0 -2
  367. package/src/platforms/channeltalkbot/index.ts +0 -1
  368. package/src/platforms/discord/commands/auth.test.ts +6 -4
  369. package/src/platforms/discord/commands/auth.ts +14 -14
  370. package/src/platforms/discord/commands/snapshot.test.ts +1 -1
  371. package/src/platforms/discord/commands/snapshot.ts +58 -42
  372. package/src/platforms/discord/commands/whoami.test.ts +2 -4
  373. package/src/platforms/discord/commands/whoami.ts +2 -0
  374. package/src/platforms/discord/ensure-auth.test.ts +5 -3
  375. package/src/platforms/discord/index.ts +0 -1
  376. package/src/platforms/discord/listener.test.ts +7 -1
  377. package/src/platforms/discord/token-extractor.test.ts +18 -12
  378. package/src/platforms/discord/token-extractor.ts +46 -190
  379. package/src/platforms/discordbot/client.ts +1 -4
  380. package/src/platforms/discordbot/commands/auth.test.ts +3 -1
  381. package/src/platforms/discordbot/commands/channel.test.ts +3 -1
  382. package/src/platforms/discordbot/commands/message.test.ts +3 -1
  383. package/src/platforms/discordbot/commands/server.test.ts +3 -1
  384. package/src/platforms/discordbot/commands/snapshot.test.ts +43 -19
  385. package/src/platforms/discordbot/commands/snapshot.ts +54 -37
  386. package/src/platforms/discordbot/commands/thread.test.ts +3 -1
  387. package/src/platforms/discordbot/commands/user.test.ts +3 -1
  388. package/src/platforms/instagram/cli.ts +1 -4
  389. package/src/platforms/instagram/client.test.ts +3 -8
  390. package/src/platforms/instagram/client.ts +39 -34
  391. package/src/platforms/instagram/commands/auth.test.ts +13 -12
  392. package/src/platforms/instagram/commands/auth.ts +136 -71
  393. package/src/platforms/instagram/commands/chat.test.ts +21 -24
  394. package/src/platforms/instagram/commands/chat.ts +2 -0
  395. package/src/platforms/instagram/commands/message.test.ts +29 -24
  396. package/src/platforms/instagram/commands/message.ts +3 -4
  397. package/src/platforms/instagram/commands/shared.ts +2 -5
  398. package/src/platforms/instagram/commands/whoami.test.ts +4 -6
  399. package/src/platforms/instagram/credential-manager.ts +2 -6
  400. package/src/platforms/instagram/ensure-auth.test.ts +1 -4
  401. package/src/platforms/instagram/ensure-auth.ts +6 -3
  402. package/src/platforms/instagram/listener.test.ts +7 -3
  403. package/src/platforms/instagram/token-extractor.test.ts +4 -16
  404. package/src/platforms/instagram/token-extractor.ts +55 -309
  405. package/src/platforms/instagram/types.test.ts +2 -6
  406. package/src/platforms/instagram/types.ts +4 -2
  407. package/src/platforms/kakaotalk/auth/kakao-login.ts +30 -8
  408. package/src/platforms/kakaotalk/client.test.ts +37 -25
  409. package/src/platforms/kakaotalk/client.ts +23 -12
  410. package/src/platforms/kakaotalk/commands/auth.test.ts +6 -18
  411. package/src/platforms/kakaotalk/commands/auth.ts +101 -47
  412. package/src/platforms/kakaotalk/commands/chat.test.ts +8 -11
  413. package/src/platforms/kakaotalk/commands/message.test.ts +15 -24
  414. package/src/platforms/kakaotalk/commands/shared.ts +1 -0
  415. package/src/platforms/kakaotalk/commands/whoami.test.ts +6 -10
  416. package/src/platforms/kakaotalk/credential-manager.test.ts +1 -4
  417. package/src/platforms/kakaotalk/index.test.ts +1 -0
  418. package/src/platforms/kakaotalk/index.ts +0 -2
  419. package/src/platforms/kakaotalk/listener.test.ts +7 -1
  420. package/src/platforms/kakaotalk/protocol/connection.ts +4 -1
  421. package/src/platforms/kakaotalk/protocol/crypto.ts +1 -1
  422. package/src/platforms/kakaotalk/protocol/session.ts +12 -6
  423. package/src/platforms/kakaotalk/token-extractor.ts +5 -5
  424. package/src/platforms/kakaotalk/types.ts +8 -7
  425. package/src/platforms/line/cli.ts +1 -4
  426. package/src/platforms/line/client.ts +12 -20
  427. package/src/platforms/line/commands/auth.test.ts +2 -1
  428. package/src/platforms/line/commands/chat.test.ts +2 -1
  429. package/src/platforms/line/commands/chat.ts +1 -4
  430. package/src/platforms/line/commands/friend.test.ts +2 -1
  431. package/src/platforms/line/commands/message.test.ts +2 -1
  432. package/src/platforms/line/commands/message.ts +2 -9
  433. package/src/platforms/line/commands/whoami.test.ts +2 -1
  434. package/src/platforms/line/credential-manager.test.ts +1 -2
  435. package/src/platforms/line/index.test.ts +1 -0
  436. package/src/platforms/line/listener.ts +1 -1
  437. package/src/platforms/line/types.test.ts +1 -0
  438. package/src/platforms/slack/cli.ts +3 -1
  439. package/src/platforms/slack/client-mappers.ts +297 -0
  440. package/src/platforms/slack/client.test.ts +532 -17
  441. package/src/platforms/slack/client.ts +69 -458
  442. package/src/platforms/slack/commands/channel.ts +1 -4
  443. package/src/platforms/slack/commands/emoji.test.ts +6 -4
  444. package/src/platforms/slack/commands/emoji.ts +20 -22
  445. package/src/platforms/slack/commands/message.ts +6 -1
  446. package/src/platforms/slack/commands/pin.test.ts +14 -12
  447. package/src/platforms/slack/commands/reminder.ts +7 -6
  448. package/src/platforms/slack/commands/snapshot.test.ts +63 -8
  449. package/src/platforms/slack/commands/snapshot.ts +98 -66
  450. package/src/platforms/slack/commands/user.ts +6 -1
  451. package/src/platforms/slack/commands/usergroup.test.ts +3 -3
  452. package/src/platforms/slack/commands/usergroup.ts +10 -7
  453. package/src/platforms/slack/commands/whoami.test.ts +1 -1
  454. package/src/platforms/slack/commands/whoami.ts +2 -0
  455. package/src/platforms/slack/index.ts +0 -2
  456. package/src/platforms/slack/listener.test.ts +1 -0
  457. package/src/platforms/slack/token-extractor.test.ts +7 -12
  458. package/src/platforms/slack/token-extractor.ts +47 -255
  459. package/src/platforms/slackbot/cli.ts +8 -1
  460. package/src/platforms/slackbot/commands/auth.test.ts +3 -1
  461. package/src/platforms/teams/client.ts +1 -1
  462. package/src/platforms/teams/commands/auth.test.ts +1 -1
  463. package/src/platforms/teams/commands/auth.ts +4 -1
  464. package/src/platforms/teams/commands/snapshot.test.ts +1 -1
  465. package/src/platforms/teams/commands/snapshot.ts +53 -38
  466. package/src/platforms/teams/commands/whoami.test.ts +2 -4
  467. package/src/platforms/teams/commands/whoami.ts +2 -0
  468. package/src/platforms/teams/index.ts +0 -1
  469. package/src/platforms/teams/token-extractor.ts +82 -350
  470. package/src/platforms/telegram/app-config.test.ts +1 -0
  471. package/src/platforms/telegram/chat-utils.test.ts +5 -1
  472. package/src/platforms/telegram/cli.ts +2 -4
  473. package/src/platforms/telegram/client.test.ts +16 -3
  474. package/src/platforms/telegram/client.ts +14 -4
  475. package/src/platforms/telegram/commands/auth.test.ts +1 -0
  476. package/src/platforms/telegram/commands/auth.ts +3 -4
  477. package/src/platforms/telegram/commands/chat.test.ts +2 -5
  478. package/src/platforms/telegram/commands/chat.ts +1 -0
  479. package/src/platforms/telegram/commands/message.test.ts +2 -5
  480. package/src/platforms/telegram/commands/message.ts +1 -0
  481. package/src/platforms/telegram/commands/shared.test.ts +1 -0
  482. package/src/platforms/telegram/commands/whoami.test.ts +5 -7
  483. package/src/platforms/telegram/commands/whoami.ts +1 -1
  484. package/src/platforms/telegram/credential-manager.test.ts +1 -0
  485. package/src/platforms/telegram/credential-manager.ts +11 -2
  486. package/src/platforms/telegram/my-telegram-org.ts +6 -2
  487. package/src/platforms/telegram/types.test.ts +1 -0
  488. package/src/platforms/webex/app-config.test.ts +1 -0
  489. package/src/platforms/webex/cli.ts +1 -4
  490. package/src/platforms/webex/client.test.ts +4 -12
  491. package/src/platforms/webex/client.ts +14 -52
  492. package/src/platforms/webex/commands/auth.test.ts +7 -1
  493. package/src/platforms/webex/commands/auth.ts +12 -15
  494. package/src/platforms/webex/commands/member.test.ts +1 -3
  495. package/src/platforms/webex/commands/member.ts +14 -19
  496. package/src/platforms/webex/commands/message.ts +4 -15
  497. package/src/platforms/webex/commands/snapshot.test.ts +42 -4
  498. package/src/platforms/webex/commands/snapshot.ts +19 -11
  499. package/src/platforms/webex/commands/space.test.ts +3 -3
  500. package/src/platforms/webex/commands/space.ts +2 -9
  501. package/src/platforms/webex/commands/whoami.test.ts +12 -5
  502. package/src/platforms/webex/commands/whoami.ts +2 -0
  503. package/src/platforms/webex/credential-manager.ts +11 -2
  504. package/src/platforms/webex/ensure-auth.ts +1 -3
  505. package/src/platforms/webex/index.ts +1 -7
  506. package/src/platforms/webex/markdown-to-html.test.ts +6 -18
  507. package/src/platforms/webex/markdown-to-html.ts +8 -8
  508. package/src/platforms/webex/token-extractor.ts +6 -29
  509. package/src/platforms/wechatbot/client.test.ts +6 -2
  510. package/src/platforms/wechatbot/client.ts +6 -1
  511. package/src/platforms/wechatbot/commands/auth.test.ts +3 -7
  512. package/src/platforms/wechatbot/commands/message.test.ts +1 -4
  513. package/src/platforms/wechatbot/commands/message.ts +5 -1
  514. package/src/platforms/wechatbot/commands/template.test.ts +1 -4
  515. package/src/platforms/wechatbot/commands/user.test.ts +2 -7
  516. package/src/platforms/whatsapp/cli.ts +1 -4
  517. package/src/platforms/whatsapp/commands/auth.test.ts +19 -22
  518. package/src/platforms/whatsapp/commands/chat.test.ts +21 -24
  519. package/src/platforms/whatsapp/commands/chat.ts +2 -0
  520. package/src/platforms/whatsapp/commands/message.test.ts +22 -24
  521. package/src/platforms/whatsapp/commands/message.ts +3 -5
  522. package/src/platforms/whatsapp/commands/shared.ts +2 -5
  523. package/src/platforms/whatsapp/commands/whoami.test.ts +2 -2
  524. package/src/platforms/whatsapp/credential-manager.ts +2 -6
  525. package/src/platforms/whatsapp/ensure-auth.test.ts +1 -4
  526. package/src/platforms/whatsapp/ensure-auth.ts +14 -6
  527. package/src/platforms/whatsapp/index.ts +0 -2
  528. package/src/platforms/whatsappbot/client.test.ts +13 -7
  529. package/src/platforms/whatsappbot/client.ts +18 -4
  530. package/src/platforms/whatsappbot/commands/auth.ts +4 -1
  531. package/src/platforms/whatsappbot/commands/message.test.ts +12 -2
  532. package/src/platforms/whatsappbot/commands/message.ts +16 -3
  533. package/src/platforms/whatsappbot/commands/shared.ts +3 -1
  534. package/src/platforms/whatsappbot/commands/whoami.test.ts +1 -3
  535. package/src/platforms/whatsappbot/index.ts +0 -2
  536. package/src/shared/chromium/browsers.test.ts +274 -0
  537. package/src/shared/chromium/browsers.ts +86 -0
  538. package/src/shared/chromium/cookie-reader.test.ts +274 -0
  539. package/src/shared/chromium/cookie-reader.ts +111 -0
  540. package/src/shared/chromium/decryptor.test.ts +449 -0
  541. package/src/shared/chromium/decryptor.ts +227 -0
  542. package/src/shared/chromium/index.ts +11 -0
  543. package/src/shared/chromium/types.ts +11 -0
  544. package/src/shared/utils/derived-key-cache.ts +1 -1
  545. package/src/shared/utils/linux-keyring.ts +4 -4
  546. package/src/tui/adapters/kakaotalk-adapter.ts +6 -1
  547. package/src/tui/adapters/telegram-adapter.ts +1 -1
  548. package/src/tui/adapters/webex-adapter.ts +1 -1
  549. package/src/tui/app.ts +149 -59
  550. package/src/tui/utils.test.ts +144 -145
  551. package/src/tui/utils.ts +27 -29
  552. package/src/tui/views/channel-picker.ts +1 -1
  553. package/src/tui/views/workspace-picker.ts +1 -1
@@ -1,9 +1,10 @@
1
- import { Long } from 'bson'
2
1
  import { existsSync } from 'node:fs'
3
2
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises'
4
3
  import { homedir } from 'node:os'
5
4
  import { join } from 'node:path'
6
5
 
6
+ import { Long } from 'bson'
7
+
7
8
  import { warn } from '@/shared/utils/stderr'
8
9
 
9
10
  import { LANG, PC_OS_NAME, getLocoDeviceConfig } from './protocol/config'
@@ -312,7 +313,9 @@ export class KakaoTalkClient {
312
313
  // where a concurrent call already reconnected and replaced this.state.
313
314
  if (this.state?.session === state.session) throw error
314
315
 
315
- try { state.session.close() } catch {}
316
+ try {
317
+ state.session.close()
318
+ } catch {}
316
319
  this.initPromise = null
317
320
  state = await this.ensureSession()
318
321
  return operation(state)
@@ -323,7 +326,13 @@ export class KakaoTalkClient {
323
326
  const session = new LocoSession()
324
327
  try {
325
328
  const syncState = await loadSyncState(this.deviceUuid!)
326
- const loginResult = await session.login(this.oauthToken!, this.userId!, this.deviceUuid!, syncState, this.deviceType)
329
+ const loginResult = await session.login(
330
+ this.oauthToken!,
331
+ this.userId!,
332
+ this.deviceUuid!,
333
+ syncState,
334
+ this.deviceType,
335
+ )
327
336
 
328
337
  const newSyncState = mergeSyncState(syncState, loginResult)
329
338
  await saveSyncState(this.deviceUuid!, newSyncState)
@@ -338,11 +347,7 @@ export class KakaoTalkClient {
338
347
  return { session, loginResult }
339
348
  } catch (error) {
340
349
  session.close()
341
- throw new KakaoTalkError(
342
- error instanceof Error ? error.message : String(error),
343
- 'login_failed',
344
- { cause: error },
345
- )
350
+ throw new KakaoTalkError(error instanceof Error ? error.message : String(error), 'login_failed', { cause: error })
346
351
  }
347
352
  }
348
353
 
@@ -461,7 +466,10 @@ export class KakaoTalkClient {
461
466
  for (let page = 0; page < MAX_PAGES; page++) {
462
467
  const response = await session.syncMessages(cid, 80, cur, maxLogId)
463
468
  const batch = (response.body.chatLogs ?? []) as Array<Record<string, unknown>>
464
- if (batch.length === 0) { reachedEnd = true; break }
469
+ if (batch.length === 0) {
470
+ reachedEnd = true
471
+ break
472
+ }
465
473
 
466
474
  for (const log of batch) {
467
475
  const lid = longToString(log.logId)
@@ -473,7 +481,10 @@ export class KakaoTalkClient {
473
481
 
474
482
  const maxLog = findMaxLogId(batch, 'logId')
475
483
 
476
- if (!maxLog || maxLog.equals(cur) || response.body.isOK) { reachedEnd = true; break }
484
+ if (!maxLog || maxLog.equals(cur) || response.body.isOK) {
485
+ reachedEnd = true
486
+ break
487
+ }
477
488
  cur = maxLog
478
489
  }
479
490
  if (!reachedEnd) {
@@ -532,7 +543,7 @@ export class KakaoTalkClient {
532
543
  throw new KakaoTalkError(`Profile request failed: ${profileRes.status}`, 'profile_request_failed')
533
544
  }
534
545
 
535
- const profileData = await profileRes.json() as Record<string, unknown>
546
+ const profileData = (await profileRes.json()) as Record<string, unknown>
536
547
  const profile = profileData.profile as Record<string, unknown> | undefined
537
548
 
538
549
  let accountDisplayId: string | null = null
@@ -540,7 +551,7 @@ export class KakaoTalkClient {
540
551
  let pstnNumber: string | null = null
541
552
  let emailVerified: boolean | null = null
542
553
  if (settingsRes.ok) {
543
- const settingsData = await settingsRes.json() as Record<string, unknown>
554
+ const settingsData = (await settingsRes.json()) as Record<string, unknown>
544
555
  accountDisplayId = (settingsData.accountDisplayId as string) || null
545
556
  accountEmail = (settingsData.accountEmail as string) || null
546
557
  pstnNumber = (settingsData.pstnNumber as string) || null
@@ -2,9 +2,7 @@ import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
5
- const mockLoad = mock(() =>
6
- Promise.resolve({ current_account: null, accounts: {} }),
7
- )
5
+ const mockLoad = mock(() => Promise.resolve({ current_account: null, accounts: {} }))
8
6
  const mockGetAccount = mock(() => Promise.resolve(null))
9
7
  const mockListAccounts = mock(() => Promise.resolve([]))
10
8
  const mockSetAccount = mock(() => Promise.resolve())
@@ -48,9 +46,7 @@ describe('auth commands', () => {
48
46
  mockRemoveAccount.mockReset()
49
47
  mockLoadPendingLogin.mockReset()
50
48
 
51
- mockLoad.mockImplementation(() =>
52
- Promise.resolve({ current_account: null, accounts: {} }),
53
- )
49
+ mockLoad.mockImplementation(() => Promise.resolve({ current_account: null, accounts: {} }))
54
50
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
55
51
  mockListAccounts.mockImplementation(() => Promise.resolve([]))
56
52
  mockSetAccount.mockImplementation(() => Promise.resolve())
@@ -145,9 +141,7 @@ describe('auth commands', () => {
145
141
  test('outputs error and exits when account not found', async () => {
146
142
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
147
143
 
148
- await expect(
149
- authCommand.parseAsync(['use', 'nonexistent'], { from: 'user' }),
150
- ).rejects.toThrow('process.exit')
144
+ await expect(authCommand.parseAsync(['use', 'nonexistent'], { from: 'user' })).rejects.toThrow('process.exit')
151
145
 
152
146
  expect(processExitSpy).toHaveBeenCalledWith(1)
153
147
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -159,9 +153,7 @@ describe('auth commands', () => {
159
153
  test('outputs error and exits when no account configured', async () => {
160
154
  mockGetAccount.mockImplementation(() => Promise.resolve(null))
161
155
 
162
- await expect(
163
- authCommand.parseAsync(['status'], { from: 'user' }),
164
- ).rejects.toThrow('process.exit')
156
+ await expect(authCommand.parseAsync(['status'], { from: 'user' })).rejects.toThrow('process.exit')
165
157
 
166
158
  expect(processExitSpy).toHaveBeenCalledWith(1)
167
159
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -283,13 +275,9 @@ describe('auth commands', () => {
283
275
  })
284
276
 
285
277
  test('outputs error and exits when no account configured', async () => {
286
- mockLoad.mockImplementation(() =>
287
- Promise.resolve({ current_account: null, accounts: {} }),
288
- )
278
+ mockLoad.mockImplementation(() => Promise.resolve({ current_account: null, accounts: {} }))
289
279
 
290
- await expect(
291
- authCommand.parseAsync(['logout'], { from: 'user' }),
292
- ).rejects.toThrow('process.exit')
280
+ await expect(authCommand.parseAsync(['logout'], { from: 'user' })).rejects.toThrow('process.exit')
293
281
 
294
282
  expect(processExitSpy).toHaveBeenCalledWith(1)
295
283
  const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
@@ -9,12 +9,7 @@ import { info, error, debug } from '@/shared/utils/stderr'
9
9
  import { loginFlow } from '../auth/kakao-login'
10
10
  import { CredentialManager } from '../credential-manager'
11
11
  import { KakaoTokenExtractor } from '../token-extractor'
12
- import {
13
- KAKAO_NEXT_ACTIONS,
14
- type KakaoAuthOptions,
15
- type KakaoDeviceType,
16
- type KakaoLoginResult,
17
- } from '../types'
12
+ import { KAKAO_NEXT_ACTIONS, type KakaoAuthOptions, type KakaoDeviceType, type KakaoLoginResult } from '../types'
18
13
 
19
14
  function isInteractiveSession(): boolean {
20
15
  return Boolean(process.stdin.isTTY && process.stdout.isTTY)
@@ -28,14 +23,13 @@ function hasTTY(): boolean {
28
23
  const fd = openSync(ttyDevice, 'r')
29
24
  closeSync(fd)
30
25
  return true
31
- } catch { return false }
26
+ } catch {
27
+ return false
28
+ }
32
29
  }
33
30
 
34
31
  async function promptPasswordGUI(email?: string): Promise<string | undefined> {
35
32
  const { execSync } = require('node:child_process') as typeof import('node:child_process')
36
- const label = email
37
- ? `agent-messenger wants to log in to KakaoTalk as ${email}.\\n\\nEnter your password:`
38
- : 'agent-messenger wants to log in to KakaoTalk.\\n\\nEnter your password:'
39
33
 
40
34
  if (process.platform === 'darwin') {
41
35
  try {
@@ -43,9 +37,10 @@ async function promptPasswordGUI(email?: string): Promise<string | undefined> {
43
37
  const { tmpdir } = require('node:os') as typeof import('node:os')
44
38
  const { join } = require('node:path') as typeof import('node:path')
45
39
  const scriptPath = join(tmpdir(), `kakao-pw-${Date.now()}.swift`)
46
- const infoText = email ? `Enter password for ${email}` : 'Enter your KakaoTalk password'
47
40
  const escapedEmail = (email ?? '').replace(/\\/g, '\\\\').replace(/"/g, '\\"')
48
- writeFileSync(scriptPath, `
41
+ writeFileSync(
42
+ scriptPath,
43
+ `
49
44
  import AppKit
50
45
  let app = NSApplication.shared
51
46
  app.setActivationPolicy(.accessory)
@@ -88,14 +83,23 @@ if response == .alertFirstButtonReturn {
88
83
  } else {
89
84
  exit(1)
90
85
  }
91
- `)
86
+ `,
87
+ )
92
88
  try {
93
- const result = execSync(`swift ${scriptPath}`, { encoding: 'utf-8', timeout: 120_000, stdio: ['pipe', 'pipe', 'pipe'] })
89
+ const result = execSync(`swift ${scriptPath}`, {
90
+ encoding: 'utf-8',
91
+ timeout: 120_000,
92
+ stdio: ['pipe', 'pipe', 'pipe'],
93
+ })
94
94
  return result.trim() || undefined
95
95
  } finally {
96
- try { unlinkSync(scriptPath) } catch {}
96
+ try {
97
+ unlinkSync(scriptPath)
98
+ } catch {}
97
99
  }
98
- } catch { return undefined }
100
+ } catch {
101
+ return undefined
102
+ }
99
103
  }
100
104
 
101
105
  if (process.platform === 'win32') {
@@ -118,7 +122,9 @@ if response == .alertFirstButtonReturn {
118
122
  ].join(' ')
119
123
  const result = execSync(`powershell -Command "${ps}"`, { encoding: 'utf-8', timeout: 120_000 })
120
124
  return result.trim() || undefined
121
- } catch { return undefined }
125
+ } catch {
126
+ return undefined
127
+ }
122
128
  }
123
129
 
124
130
  if (process.platform === 'linux') {
@@ -129,14 +135,18 @@ if response == .alertFirstButtonReturn {
129
135
  { encoding: 'utf-8', timeout: 120_000 },
130
136
  )
131
137
  return result.trim() || undefined
132
- } catch { /* zenity not available or cancelled */ }
138
+ } catch {
139
+ /* zenity not available or cancelled */
140
+ }
133
141
  try {
134
142
  const result = execSync(
135
143
  `kdialog --password "agent-messenger · KakaoTalk\\n${escapedEmail}" --title "KakaoTalk Login" 2>/dev/null`,
136
144
  { encoding: 'utf-8', timeout: 120_000 },
137
145
  )
138
146
  return result.trim() || undefined
139
- } catch { /* kdialog not available or cancelled */ }
147
+ } catch {
148
+ /* kdialog not available or cancelled */
149
+ }
140
150
  }
141
151
 
142
152
  return undefined
@@ -191,7 +201,9 @@ async function promptHiddenTTY(message: string): Promise<string | undefined> {
191
201
  stdio: ['inherit', 'pipe', 'inherit'],
192
202
  })
193
203
  return result.trim() || undefined
194
- } catch { return undefined }
204
+ } catch {
205
+ return undefined
206
+ }
195
207
  }
196
208
 
197
209
  const { createReadStream } = await import('node:fs')
@@ -257,16 +269,26 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
257
269
  password = await promptHidden(passwordPrompt)
258
270
  } else if (hasTTY()) {
259
271
  info(` One-time setup: password is needed to register this device.`)
260
- try { password = await promptHiddenTTY(passwordPrompt) } catch { /* /dev/tty open failed */ }
272
+ try {
273
+ password = await promptHiddenTTY(passwordPrompt)
274
+ } catch {
275
+ /* /dev/tty open failed */
276
+ }
261
277
  }
262
278
  if (!password) {
263
279
  password = await promptPasswordGUI(email)
264
280
  }
265
281
  if (!password) {
266
- console.log(formatOutput({
267
- next_action: 'run_interactive',
268
- message: 'One-time device registration required. Run `agent-kakaotalk auth login` in a terminal so the user can enter their password securely.',
269
- }, options.pretty))
282
+ console.log(
283
+ formatOutput(
284
+ {
285
+ next_action: 'run_interactive',
286
+ message:
287
+ 'One-time device registration required. Run `agent-kakaotalk auth login` in a terminal so the user can enter their password securely.',
288
+ },
289
+ options.pretty,
290
+ ),
291
+ )
270
292
  return
271
293
  }
272
294
  }
@@ -279,7 +301,10 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
279
301
  return
280
302
  }
281
303
  email = await promptText('KakaoTalk email')
282
- if (!email) { error('Email is required.'); process.exit(1) }
304
+ if (!email) {
305
+ error('Email is required.')
306
+ process.exit(1)
307
+ }
283
308
  }
284
309
 
285
310
  if (!password) {
@@ -288,7 +313,10 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
288
313
  return
289
314
  }
290
315
  password = await promptHidden('Password')
291
- if (!password) { error('Password is required.'); process.exit(1) }
316
+ if (!password) {
317
+ error('Password is required.')
318
+ process.exit(1)
319
+ }
292
320
  }
293
321
 
294
322
  const existing = await credManager.getAccount()
@@ -319,10 +347,15 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
319
347
 
320
348
  if (result.next_action === 'choose_device') {
321
349
  if (!interactive) {
322
- console.log(formatOutput({
323
- ...KAKAO_NEXT_ACTIONS.choose_device,
324
- warning: result.warning,
325
- }, options.pretty))
350
+ console.log(
351
+ formatOutput(
352
+ {
353
+ ...KAKAO_NEXT_ACTIONS.choose_device,
354
+ warning: result.warning,
355
+ },
356
+ options.pretty,
357
+ ),
358
+ )
326
359
  return
327
360
  }
328
361
 
@@ -336,7 +369,10 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
336
369
  console.log('')
337
370
 
338
371
  const choice = await promptText('Choice (1/2/3)')
339
- if (choice !== '1' && choice !== '2') { console.log('Cancelled.'); return }
372
+ if (choice !== '1' && choice !== '2') {
373
+ console.log('Cancelled.')
374
+ return
375
+ }
340
376
 
341
377
  const chosenType: KakaoDeviceType = choice === '1' ? 'pc' : 'tablet'
342
378
  const forceResult = await loginFlow({
@@ -359,7 +395,15 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
359
395
  }
360
396
 
361
397
  async function handleLoginResult(
362
- result: KakaoLoginResult & { credentials?: { access_token: string; refresh_token: string; user_id: string; device_uuid: string; device_type: KakaoDeviceType } },
398
+ result: KakaoLoginResult & {
399
+ credentials?: {
400
+ access_token: string
401
+ refresh_token: string
402
+ user_id: string
403
+ device_uuid: string
404
+ device_type: KakaoDeviceType
405
+ }
406
+ },
363
407
  credManager: CredentialManager,
364
408
  options: KakaoAuthOptions,
365
409
  ): Promise<void> {
@@ -379,11 +423,16 @@ async function handleLoginResult(
379
423
  await credManager.setCurrentAccount(result.credentials.user_id || 'default')
380
424
  await credManager.clearPendingLogin()
381
425
 
382
- console.log(formatOutput({
383
- authenticated: true,
384
- account_id: result.credentials.user_id,
385
- device_type: result.credentials.device_type,
386
- }, options.pretty))
426
+ console.log(
427
+ formatOutput(
428
+ {
429
+ authenticated: true,
430
+ account_id: result.credentials.user_id,
431
+ device_type: result.credentials.device_type,
432
+ },
433
+ options.pretty,
434
+ ),
435
+ )
387
436
  } else {
388
437
  console.log(formatOutput(result, options.pretty))
389
438
  if (result.error) process.exit(1)
@@ -444,15 +493,20 @@ async function statusAction(options: { account?: string; pretty?: boolean }): Pr
444
493
  process.exit(1)
445
494
  }
446
495
 
447
- console.log(formatOutput({
448
- account_id: account.account_id,
449
- user_id: account.user_id,
450
- device_type: account.device_type,
451
- has_refresh_token: !!account.refresh_token,
452
- has_device_uuid: !!account.device_uuid,
453
- created_at: account.created_at,
454
- updated_at: account.updated_at,
455
- }, options.pretty))
496
+ console.log(
497
+ formatOutput(
498
+ {
499
+ account_id: account.account_id,
500
+ user_id: account.user_id,
501
+ device_type: account.device_type,
502
+ has_refresh_token: !!account.refresh_token,
503
+ has_device_uuid: !!account.device_uuid,
504
+ created_at: account.created_at,
505
+ updated_at: account.updated_at,
506
+ },
507
+ options.pretty,
508
+ ),
509
+ )
456
510
  } catch (error) {
457
511
  handleError(error as Error)
458
512
  }
@@ -2,11 +2,9 @@ import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
5
- const mockWithKakaoClient = mock(
6
- async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
7
- return fn(mockClient)
8
- },
9
- )
5
+ const mockWithKakaoClient = mock(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
6
+ return fn(mockClient)
7
+ })
10
8
 
11
9
  const mockGetChats = mock(() =>
12
10
  Promise.resolve([
@@ -32,11 +30,9 @@ describe('chat commands', () => {
32
30
  mockWithKakaoClient.mockReset()
33
31
  mockGetChats.mockReset()
34
32
 
35
- mockWithKakaoClient.mockImplementation(
36
- async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
37
- return fn(mockClient)
38
- },
39
- )
33
+ mockWithKakaoClient.mockImplementation(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
34
+ return fn(mockClient)
35
+ })
40
36
  mockGetChats.mockImplementation(() =>
41
37
  Promise.resolve([
42
38
  { chat_id: 'chat-1', name: 'General', type: 'group', member_count: 5 },
@@ -44,7 +40,8 @@ describe('chat commands', () => {
44
40
  ]),
45
41
  )
46
42
 
47
- consoleLogSpy = mock((..._args: unknown[]) => {}); console.log = consoleLogSpy
43
+ consoleLogSpy = mock((..._args: unknown[]) => {})
44
+ console.log = consoleLogSpy
48
45
  })
49
46
 
50
47
  afterEach(() => {
@@ -2,21 +2,15 @@ import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
5
- const mockWithKakaoClient = mock(
6
- async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
7
- return fn(mockClient)
8
- },
9
- )
5
+ const mockWithKakaoClient = mock(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
6
+ return fn(mockClient)
7
+ })
10
8
 
11
9
  const mockGetMessages = mock(() =>
12
- Promise.resolve([
13
- { log_id: '1', message: 'Hello', sender_id: 'user-1', created_at: 1000 },
14
- ]),
10
+ Promise.resolve([{ log_id: '1', message: 'Hello', sender_id: 'user-1', created_at: 1000 }]),
15
11
  )
16
12
 
17
- const mockSendMessage = mock(() =>
18
- Promise.resolve({ log_id: '2', message: 'Hi there', created_at: 2000 }),
19
- )
13
+ const mockSendMessage = mock(() => Promise.resolve({ log_id: '2', message: 'Hi there', created_at: 2000 }))
20
14
 
21
15
  const mockClient = {
22
16
  getMessages: mockGetMessages,
@@ -37,21 +31,16 @@ describe('message commands', () => {
37
31
  mockGetMessages.mockReset()
38
32
  mockSendMessage.mockReset()
39
33
 
40
- mockWithKakaoClient.mockImplementation(
41
- async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
42
- return fn(mockClient)
43
- },
44
- )
34
+ mockWithKakaoClient.mockImplementation(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
35
+ return fn(mockClient)
36
+ })
45
37
  mockGetMessages.mockImplementation(() =>
46
- Promise.resolve([
47
- { log_id: '1', message: 'Hello', sender_id: 'user-1', created_at: 1000 },
48
- ]),
49
- )
50
- mockSendMessage.mockImplementation(() =>
51
- Promise.resolve({ log_id: '2', message: 'Hi there', created_at: 2000 }),
38
+ Promise.resolve([{ log_id: '1', message: 'Hello', sender_id: 'user-1', created_at: 1000 }]),
52
39
  )
40
+ mockSendMessage.mockImplementation(() => Promise.resolve({ log_id: '2', message: 'Hi there', created_at: 2000 }))
53
41
 
54
- consoleLogSpy = mock((..._args: unknown[]) => {}); console.log = consoleLogSpy
42
+ consoleLogSpy = mock((..._args: unknown[]) => {})
43
+ console.log = consoleLogSpy
55
44
  })
56
45
 
57
46
  afterEach(() => {
@@ -82,7 +71,9 @@ describe('message commands', () => {
82
71
  })
83
72
 
84
73
  test('passes account option to withKakaoClient', async () => {
85
- await messageCommand.parseAsync(['list', 'chat-123', '--count', '20', '--account', 'my-account'], { from: 'user' })
74
+ await messageCommand.parseAsync(['list', 'chat-123', '--count', '20', '--account', 'my-account'], {
75
+ from: 'user',
76
+ })
86
77
 
87
78
  expect(mockWithKakaoClient).toHaveBeenCalledWith(
88
79
  expect.objectContaining({ account: 'my-account' }),
@@ -1,4 +1,5 @@
1
1
  import { formatOutput } from '@/shared/utils/output'
2
+
2
3
  import { KakaoTalkClient } from '../client'
3
4
  import { KakaoCredentialManager } from '../credential-manager'
4
5
 
@@ -2,11 +2,9 @@ import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
5
- const mockWithKakaoClient = mock(
6
- async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
7
- return fn(mockClient)
8
- },
9
- )
5
+ const mockWithKakaoClient = mock(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
6
+ return fn(mockClient)
7
+ })
10
8
 
11
9
  const mockGetProfile = mock(() =>
12
10
  Promise.resolve({
@@ -42,11 +40,9 @@ describe('whoami command', () => {
42
40
  mockWithKakaoClient.mockReset()
43
41
  mockGetProfile.mockReset()
44
42
 
45
- mockWithKakaoClient.mockImplementation(
46
- async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
47
- return fn(mockClient)
48
- },
49
- )
43
+ mockWithKakaoClient.mockImplementation(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
44
+ return fn(mockClient)
45
+ })
50
46
  mockGetProfile.mockImplementation(() =>
51
47
  Promise.resolve({
52
48
  user_id: 'user-1',
@@ -8,10 +8,7 @@ import type { KakaoAccountCredentials } from './types'
8
8
  const testDirs: string[] = []
9
9
 
10
10
  function setup(): KakaoCredentialManager {
11
- const testConfigDir = join(
12
- import.meta.dir,
13
- `.test-kakao-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
14
- )
11
+ const testConfigDir = join(import.meta.dir, `.test-kakao-config-${Date.now()}-${Math.random().toString(36).slice(2)}`)
15
12
  testDirs.push(testConfigDir)
16
13
  return new KakaoCredentialManager(testConfigDir)
17
14
  }
@@ -1,4 +1,5 @@
1
1
  import { expect, test } from 'bun:test'
2
+
2
3
  import {
3
4
  CredentialManager,
4
5
  KakaoAccountCredentialsSchema,
@@ -29,5 +29,3 @@ export {
29
29
  KakaoTalkPushMessageEventSchema,
30
30
  KakaoTalkPushReadEventSchema,
31
31
  } from './types'
32
-
33
-
@@ -21,6 +21,7 @@ class MockLocoSession {
21
21
  close = mockSessionClose
22
22
 
23
23
  constructor() {
24
+ // oxlint-disable-next-line typescript-eslint/no-this-alias
24
25
  mockSessionInstance = this
25
26
  }
26
27
 
@@ -45,7 +46,12 @@ mock.module('./protocol/session', () => ({ LocoSession: MockLocoSession }))
45
46
 
46
47
  function createMockClient(overrides: Record<string, unknown> = {}) {
47
48
  return {
48
- getCredentials: mock(() => ({ oauthToken: 'token', userId: 'user1', deviceUuid: 'device1', deviceType: 'tablet' as const })),
49
+ getCredentials: mock(() => ({
50
+ oauthToken: 'token',
51
+ userId: 'user1',
52
+ deviceUuid: 'device1',
53
+ deviceType: 'tablet' as const,
54
+ })),
49
55
  ...overrides,
50
56
  } as any
51
57
  }
@@ -15,7 +15,10 @@ export class LocoConnection {
15
15
  private buffer = Buffer.alloc(0)
16
16
  private decryptedBuffer = Buffer.alloc(0)
17
17
  private packetIdCounter = 0
18
- private pendingResolvers = new Map<number, { resolve: (packet: LocoPacket) => void; timer: ReturnType<typeof setTimeout> }>()
18
+ private pendingResolvers = new Map<
19
+ number,
20
+ { resolve: (packet: LocoPacket) => void; timer: ReturnType<typeof setTimeout> }
21
+ >()
19
22
  private timedOutIds = new Set<number>()
20
23
  private pushHandler: ((packet: LocoPacket) => void) | null = null
21
24
  private closeHandler: (() => void) | null = null
@@ -1,5 +1,6 @@
1
1
  import { constants, createCipheriv, createDecipheriv, createPublicKey, publicEncrypt, randomBytes } from 'node:crypto'
2
2
 
3
+ import { LOCO_RSA_PUBLIC_KEY_DER_B64 } from './config'
3
4
  import {
4
5
  GCM_NONCE_SIZE,
5
6
  GCM_TAG_SIZE,
@@ -7,7 +8,6 @@ import {
7
8
  HANDSHAKE_KEY_ENCRYPT_TYPE,
8
9
  HANDSHAKE_KEY_SIZE,
9
10
  } from './types'
10
- import { LOCO_RSA_PUBLIC_KEY_DER_B64 } from './config'
11
11
 
12
12
  export class LocoCrypto {
13
13
  private aesKey: Buffer