agent-messenger 1.0.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 (394) hide show
  1. package/.claude/commands/release.md +92 -0
  2. package/.claude-plugin/README.md +144 -0
  3. package/.claude-plugin/marketplace.json +37 -0
  4. package/.claude-plugin/plugin.json +17 -0
  5. package/.github/workflows/ci.yml +30 -0
  6. package/CLAUDE.md +106 -0
  7. package/CONTRIBUTING.md +131 -0
  8. package/README.md +140 -0
  9. package/biome.json +34 -0
  10. package/bun.lock +252 -0
  11. package/dist/cli.d.ts +5 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +21 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/commands/auth.d.ts +3 -0
  16. package/dist/commands/auth.d.ts.map +1 -0
  17. package/dist/commands/auth.js +140 -0
  18. package/dist/commands/auth.js.map +1 -0
  19. package/dist/commands/channel.d.ts +3 -0
  20. package/dist/commands/channel.d.ts.map +1 -0
  21. package/dist/commands/channel.js +118 -0
  22. package/dist/commands/channel.js.map +1 -0
  23. package/dist/commands/file.d.ts +3 -0
  24. package/dist/commands/file.d.ts.map +1 -0
  25. package/dist/commands/file.js +113 -0
  26. package/dist/commands/file.js.map +1 -0
  27. package/dist/commands/index.d.ts +9 -0
  28. package/dist/commands/index.d.ts.map +1 -0
  29. package/dist/commands/index.js +9 -0
  30. package/dist/commands/index.js.map +1 -0
  31. package/dist/commands/message.d.ts +3 -0
  32. package/dist/commands/message.d.ts.map +1 -0
  33. package/dist/commands/message.js +214 -0
  34. package/dist/commands/message.js.map +1 -0
  35. package/dist/commands/reaction.d.ts +3 -0
  36. package/dist/commands/reaction.d.ts.map +1 -0
  37. package/dist/commands/reaction.js +100 -0
  38. package/dist/commands/reaction.js.map +1 -0
  39. package/dist/commands/snapshot.d.ts +3 -0
  40. package/dist/commands/snapshot.d.ts.map +1 -0
  41. package/dist/commands/snapshot.js +88 -0
  42. package/dist/commands/snapshot.js.map +1 -0
  43. package/dist/commands/user.d.ts +3 -0
  44. package/dist/commands/user.d.ts.map +1 -0
  45. package/dist/commands/user.js +96 -0
  46. package/dist/commands/user.js.map +1 -0
  47. package/dist/commands/workspace.d.ts +3 -0
  48. package/dist/commands/workspace.d.ts.map +1 -0
  49. package/dist/commands/workspace.js +89 -0
  50. package/dist/commands/workspace.js.map +1 -0
  51. package/dist/lib/credential-manager.d.ts +13 -0
  52. package/dist/lib/credential-manager.d.ts.map +1 -0
  53. package/dist/lib/credential-manager.js +58 -0
  54. package/dist/lib/credential-manager.js.map +1 -0
  55. package/dist/lib/index.d.ts +3 -0
  56. package/dist/lib/index.d.ts.map +1 -0
  57. package/dist/lib/index.js +3 -0
  58. package/dist/lib/index.js.map +1 -0
  59. package/dist/lib/ref-manager.d.ts +26 -0
  60. package/dist/lib/ref-manager.d.ts.map +1 -0
  61. package/dist/lib/ref-manager.js +92 -0
  62. package/dist/lib/ref-manager.js.map +1 -0
  63. package/dist/lib/slack-client.d.ts +37 -0
  64. package/dist/lib/slack-client.d.ts.map +1 -0
  65. package/dist/lib/slack-client.js +379 -0
  66. package/dist/lib/slack-client.js.map +1 -0
  67. package/dist/lib/token-extractor.d.ts +28 -0
  68. package/dist/lib/token-extractor.d.ts.map +1 -0
  69. package/dist/lib/token-extractor.js +401 -0
  70. package/dist/lib/token-extractor.js.map +1 -0
  71. package/dist/package.json +37 -0
  72. package/dist/src/cli.d.ts +5 -0
  73. package/dist/src/cli.d.ts.map +1 -0
  74. package/dist/src/cli.js +22 -0
  75. package/dist/src/cli.js.map +1 -0
  76. package/dist/src/platforms/discord/cli.d.ts +5 -0
  77. package/dist/src/platforms/discord/cli.d.ts.map +1 -0
  78. package/dist/src/platforms/discord/cli.js +22 -0
  79. package/dist/src/platforms/discord/cli.js.map +1 -0
  80. package/dist/src/platforms/discord/client.d.ts +34 -0
  81. package/dist/src/platforms/discord/client.d.ts.map +1 -0
  82. package/dist/src/platforms/discord/client.js +187 -0
  83. package/dist/src/platforms/discord/client.js.map +1 -0
  84. package/dist/src/platforms/discord/client.test.d.ts +2 -0
  85. package/dist/src/platforms/discord/client.test.d.ts.map +1 -0
  86. package/dist/src/platforms/discord/client.test.js +367 -0
  87. package/dist/src/platforms/discord/client.test.js.map +1 -0
  88. package/dist/src/platforms/discord/commands/auth.d.ts +13 -0
  89. package/dist/src/platforms/discord/commands/auth.d.ts.map +1 -0
  90. package/dist/src/platforms/discord/commands/auth.js +155 -0
  91. package/dist/src/platforms/discord/commands/auth.js.map +1 -0
  92. package/dist/src/platforms/discord/commands/auth.test.d.ts +2 -0
  93. package/dist/src/platforms/discord/commands/auth.test.d.ts.map +1 -0
  94. package/dist/src/platforms/discord/commands/auth.test.js +65 -0
  95. package/dist/src/platforms/discord/commands/auth.test.js.map +1 -0
  96. package/dist/src/platforms/discord/commands/channel.d.ts +13 -0
  97. package/dist/src/platforms/discord/commands/channel.d.ts.map +1 -0
  98. package/dist/src/platforms/discord/commands/channel.js +99 -0
  99. package/dist/src/platforms/discord/commands/channel.js.map +1 -0
  100. package/dist/src/platforms/discord/commands/channel.test.d.ts +2 -0
  101. package/dist/src/platforms/discord/commands/channel.test.d.ts.map +1 -0
  102. package/dist/src/platforms/discord/commands/channel.test.js +136 -0
  103. package/dist/src/platforms/discord/commands/channel.test.js.map +1 -0
  104. package/dist/src/platforms/discord/commands/file.d.ts +13 -0
  105. package/dist/src/platforms/discord/commands/file.d.ts.map +1 -0
  106. package/dist/src/platforms/discord/commands/file.js +99 -0
  107. package/dist/src/platforms/discord/commands/file.js.map +1 -0
  108. package/dist/src/platforms/discord/commands/file.test.d.ts +2 -0
  109. package/dist/src/platforms/discord/commands/file.test.d.ts.map +1 -0
  110. package/dist/src/platforms/discord/commands/file.test.js +83 -0
  111. package/dist/src/platforms/discord/commands/file.test.js.map +1 -0
  112. package/dist/src/platforms/discord/commands/guild.d.ts +15 -0
  113. package/dist/src/platforms/discord/commands/guild.d.ts.map +1 -0
  114. package/dist/src/platforms/discord/commands/guild.js +102 -0
  115. package/dist/src/platforms/discord/commands/guild.js.map +1 -0
  116. package/dist/src/platforms/discord/commands/guild.test.d.ts +2 -0
  117. package/dist/src/platforms/discord/commands/guild.test.d.ts.map +1 -0
  118. package/dist/src/platforms/discord/commands/guild.test.js +100 -0
  119. package/dist/src/platforms/discord/commands/guild.test.js.map +1 -0
  120. package/dist/src/platforms/discord/commands/index.d.ts +9 -0
  121. package/dist/src/platforms/discord/commands/index.d.ts.map +1 -0
  122. package/dist/src/platforms/discord/commands/index.js +9 -0
  123. package/dist/src/platforms/discord/commands/index.js.map +1 -0
  124. package/dist/src/platforms/discord/commands/message.d.ts +17 -0
  125. package/dist/src/platforms/discord/commands/message.d.ts.map +1 -0
  126. package/dist/src/platforms/discord/commands/message.js +131 -0
  127. package/dist/src/platforms/discord/commands/message.js.map +1 -0
  128. package/dist/src/platforms/discord/commands/message.test.d.ts +2 -0
  129. package/dist/src/platforms/discord/commands/message.test.d.ts.map +1 -0
  130. package/dist/src/platforms/discord/commands/message.test.js +91 -0
  131. package/dist/src/platforms/discord/commands/message.test.js.map +1 -0
  132. package/dist/src/platforms/discord/commands/reaction.d.ts +12 -0
  133. package/dist/src/platforms/discord/commands/reaction.d.ts.map +1 -0
  134. package/dist/src/platforms/discord/commands/reaction.js +99 -0
  135. package/dist/src/platforms/discord/commands/reaction.js.map +1 -0
  136. package/dist/src/platforms/discord/commands/reaction.test.d.ts +2 -0
  137. package/dist/src/platforms/discord/commands/reaction.test.d.ts.map +1 -0
  138. package/dist/src/platforms/discord/commands/reaction.test.js +115 -0
  139. package/dist/src/platforms/discord/commands/reaction.test.js.map +1 -0
  140. package/dist/src/platforms/discord/commands/snapshot.d.ts +9 -0
  141. package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -0
  142. package/dist/src/platforms/discord/commands/snapshot.js +80 -0
  143. package/dist/src/platforms/discord/commands/snapshot.js.map +1 -0
  144. package/dist/src/platforms/discord/commands/snapshot.test.d.ts +2 -0
  145. package/dist/src/platforms/discord/commands/snapshot.test.d.ts.map +1 -0
  146. package/dist/src/platforms/discord/commands/snapshot.test.js +25 -0
  147. package/dist/src/platforms/discord/commands/snapshot.test.js.map +1 -0
  148. package/dist/src/platforms/discord/commands/user.d.ts +3 -0
  149. package/dist/src/platforms/discord/commands/user.d.ts.map +1 -0
  150. package/dist/src/platforms/discord/commands/user.js +94 -0
  151. package/dist/src/platforms/discord/commands/user.js.map +1 -0
  152. package/dist/src/platforms/discord/commands/user.test.d.ts +2 -0
  153. package/dist/src/platforms/discord/commands/user.test.d.ts.map +1 -0
  154. package/dist/src/platforms/discord/commands/user.test.js +103 -0
  155. package/dist/src/platforms/discord/commands/user.test.js.map +1 -0
  156. package/dist/src/platforms/discord/credential-manager.d.ts +33 -0
  157. package/dist/src/platforms/discord/credential-manager.d.ts.map +1 -0
  158. package/dist/src/platforms/discord/credential-manager.js +73 -0
  159. package/dist/src/platforms/discord/credential-manager.js.map +1 -0
  160. package/dist/src/platforms/discord/credential-manager.test.d.ts +2 -0
  161. package/dist/src/platforms/discord/credential-manager.test.d.ts.map +1 -0
  162. package/dist/src/platforms/discord/credential-manager.test.js +136 -0
  163. package/dist/src/platforms/discord/credential-manager.test.js.map +1 -0
  164. package/dist/src/platforms/discord/token-extractor.d.ts +55 -0
  165. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -0
  166. package/dist/src/platforms/discord/token-extractor.js +462 -0
  167. package/dist/src/platforms/discord/token-extractor.js.map +1 -0
  168. package/dist/src/platforms/discord/token-extractor.test.d.ts +2 -0
  169. package/dist/src/platforms/discord/token-extractor.test.d.ts.map +1 -0
  170. package/dist/src/platforms/discord/token-extractor.test.js +789 -0
  171. package/dist/src/platforms/discord/token-extractor.test.js.map +1 -0
  172. package/dist/src/platforms/discord/types.d.ts +251 -0
  173. package/dist/src/platforms/discord/types.d.ts.map +1 -0
  174. package/dist/src/platforms/discord/types.js +74 -0
  175. package/dist/src/platforms/discord/types.js.map +1 -0
  176. package/dist/src/platforms/discord/types.test.d.ts +2 -0
  177. package/dist/src/platforms/discord/types.test.d.ts.map +1 -0
  178. package/dist/src/platforms/discord/types.test.js +211 -0
  179. package/dist/src/platforms/discord/types.test.js.map +1 -0
  180. package/dist/src/platforms/slack/cli.d.ts +5 -0
  181. package/dist/src/platforms/slack/cli.d.ts.map +1 -0
  182. package/dist/src/platforms/slack/cli.js +22 -0
  183. package/dist/src/platforms/slack/cli.js.map +1 -0
  184. package/dist/src/platforms/slack/client.d.ts +47 -0
  185. package/dist/src/platforms/slack/client.d.ts.map +1 -0
  186. package/dist/src/platforms/slack/client.js +412 -0
  187. package/dist/src/platforms/slack/client.js.map +1 -0
  188. package/dist/src/platforms/slack/commands/auth.d.ts +3 -0
  189. package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -0
  190. package/dist/src/platforms/slack/commands/auth.js +156 -0
  191. package/dist/src/platforms/slack/commands/auth.js.map +1 -0
  192. package/dist/src/platforms/slack/commands/channel.d.ts +3 -0
  193. package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -0
  194. package/dist/src/platforms/slack/commands/channel.js +118 -0
  195. package/dist/src/platforms/slack/commands/channel.js.map +1 -0
  196. package/dist/src/platforms/slack/commands/file.d.ts +3 -0
  197. package/dist/src/platforms/slack/commands/file.d.ts.map +1 -0
  198. package/dist/src/platforms/slack/commands/file.js +113 -0
  199. package/dist/src/platforms/slack/commands/file.js.map +1 -0
  200. package/dist/src/platforms/slack/commands/index.d.ts +9 -0
  201. package/dist/src/platforms/slack/commands/index.d.ts.map +1 -0
  202. package/dist/src/platforms/slack/commands/index.js +9 -0
  203. package/dist/src/platforms/slack/commands/index.js.map +1 -0
  204. package/dist/src/platforms/slack/commands/message.d.ts +3 -0
  205. package/dist/src/platforms/slack/commands/message.d.ts.map +1 -0
  206. package/dist/src/platforms/slack/commands/message.js +263 -0
  207. package/dist/src/platforms/slack/commands/message.js.map +1 -0
  208. package/dist/src/platforms/slack/commands/reaction.d.ts +3 -0
  209. package/dist/src/platforms/slack/commands/reaction.d.ts.map +1 -0
  210. package/dist/src/platforms/slack/commands/reaction.js +100 -0
  211. package/dist/src/platforms/slack/commands/reaction.js.map +1 -0
  212. package/dist/src/platforms/slack/commands/snapshot.d.ts +3 -0
  213. package/dist/src/platforms/slack/commands/snapshot.d.ts.map +1 -0
  214. package/dist/src/platforms/slack/commands/snapshot.js +87 -0
  215. package/dist/src/platforms/slack/commands/snapshot.js.map +1 -0
  216. package/dist/src/platforms/slack/commands/user.d.ts +3 -0
  217. package/dist/src/platforms/slack/commands/user.d.ts.map +1 -0
  218. package/dist/src/platforms/slack/commands/user.js +96 -0
  219. package/dist/src/platforms/slack/commands/user.js.map +1 -0
  220. package/dist/src/platforms/slack/commands/workspace.d.ts +3 -0
  221. package/dist/src/platforms/slack/commands/workspace.d.ts.map +1 -0
  222. package/dist/src/platforms/slack/commands/workspace.js +89 -0
  223. package/dist/src/platforms/slack/commands/workspace.js.map +1 -0
  224. package/dist/src/platforms/slack/credential-manager.d.ts +13 -0
  225. package/dist/src/platforms/slack/credential-manager.d.ts.map +1 -0
  226. package/dist/src/platforms/slack/credential-manager.js +58 -0
  227. package/dist/src/platforms/slack/credential-manager.js.map +1 -0
  228. package/dist/src/platforms/slack/index.d.ts +3 -0
  229. package/dist/src/platforms/slack/index.d.ts.map +1 -0
  230. package/dist/src/platforms/slack/index.js +3 -0
  231. package/dist/src/platforms/slack/index.js.map +1 -0
  232. package/dist/src/platforms/slack/token-extractor.d.ts +28 -0
  233. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -0
  234. package/dist/src/platforms/slack/token-extractor.js +401 -0
  235. package/dist/src/platforms/slack/token-extractor.js.map +1 -0
  236. package/dist/src/platforms/slack/types.d.ts +369 -0
  237. package/dist/src/platforms/slack/types.d.ts.map +1 -0
  238. package/dist/src/platforms/slack/types.js +92 -0
  239. package/dist/src/platforms/slack/types.js.map +1 -0
  240. package/dist/src/shared/utils/concurrency.d.ts +2 -0
  241. package/dist/src/shared/utils/concurrency.d.ts.map +1 -0
  242. package/dist/src/shared/utils/concurrency.js +14 -0
  243. package/dist/src/shared/utils/concurrency.js.map +1 -0
  244. package/dist/src/shared/utils/concurrency.test.d.ts +2 -0
  245. package/dist/src/shared/utils/concurrency.test.d.ts.map +1 -0
  246. package/dist/src/shared/utils/concurrency.test.js +39 -0
  247. package/dist/src/shared/utils/concurrency.test.js.map +1 -0
  248. package/dist/src/shared/utils/error-handler.d.ts +2 -0
  249. package/dist/src/shared/utils/error-handler.d.ts.map +1 -0
  250. package/dist/src/shared/utils/error-handler.js +5 -0
  251. package/dist/src/shared/utils/error-handler.js.map +1 -0
  252. package/dist/src/shared/utils/output.d.ts +2 -0
  253. package/dist/src/shared/utils/output.d.ts.map +1 -0
  254. package/dist/src/shared/utils/output.js +4 -0
  255. package/dist/src/shared/utils/output.js.map +1 -0
  256. package/dist/tests/cli.test.d.ts +2 -0
  257. package/dist/tests/cli.test.d.ts.map +1 -0
  258. package/dist/tests/cli.test.js +83 -0
  259. package/dist/tests/cli.test.js.map +1 -0
  260. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/CURRENT +1 -0
  261. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOCK +0 -0
  262. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG +3 -0
  263. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG.old +1 -0
  264. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/MANIFEST-000004 +0 -0
  265. package/dist/tests/commands/auth.test.d.ts +2 -0
  266. package/dist/tests/commands/auth.test.d.ts.map +1 -0
  267. package/dist/tests/commands/auth.test.js +304 -0
  268. package/dist/tests/commands/auth.test.js.map +1 -0
  269. package/dist/tests/commands/channel.test.d.ts +2 -0
  270. package/dist/tests/commands/channel.test.d.ts.map +1 -0
  271. package/dist/tests/commands/channel.test.js +166 -0
  272. package/dist/tests/commands/channel.test.js.map +1 -0
  273. package/dist/tests/commands/file.test.d.ts +2 -0
  274. package/dist/tests/commands/file.test.d.ts.map +1 -0
  275. package/dist/tests/commands/file.test.js +175 -0
  276. package/dist/tests/commands/file.test.js.map +1 -0
  277. package/dist/tests/commands/message.test.d.ts +2 -0
  278. package/dist/tests/commands/message.test.d.ts.map +1 -0
  279. package/dist/tests/commands/message.test.js +293 -0
  280. package/dist/tests/commands/message.test.js.map +1 -0
  281. package/dist/tests/commands/reaction.test.d.ts +2 -0
  282. package/dist/tests/commands/reaction.test.d.ts.map +1 -0
  283. package/dist/tests/commands/reaction.test.js +84 -0
  284. package/dist/tests/commands/reaction.test.js.map +1 -0
  285. package/dist/tests/commands/snapshot.test.d.ts +2 -0
  286. package/dist/tests/commands/snapshot.test.d.ts.map +1 -0
  287. package/dist/tests/commands/snapshot.test.js +280 -0
  288. package/dist/tests/commands/snapshot.test.js.map +1 -0
  289. package/dist/tests/commands/user.test.d.ts +2 -0
  290. package/dist/tests/commands/user.test.d.ts.map +1 -0
  291. package/dist/tests/commands/user.test.js +117 -0
  292. package/dist/tests/commands/user.test.js.map +1 -0
  293. package/dist/tests/commands/workspace.test.d.ts +2 -0
  294. package/dist/tests/commands/workspace.test.d.ts.map +1 -0
  295. package/dist/tests/commands/workspace.test.js +453 -0
  296. package/dist/tests/commands/workspace.test.js.map +1 -0
  297. package/dist/tests/credential-manager.test.d.ts +2 -0
  298. package/dist/tests/credential-manager.test.d.ts.map +1 -0
  299. package/dist/tests/credential-manager.test.js +199 -0
  300. package/dist/tests/credential-manager.test.js.map +1 -0
  301. package/dist/tests/slack-client.test.d.ts +2 -0
  302. package/dist/tests/slack-client.test.d.ts.map +1 -0
  303. package/dist/tests/slack-client.test.js +741 -0
  304. package/dist/tests/slack-client.test.js.map +1 -0
  305. package/dist/tests/types.test.d.ts +2 -0
  306. package/dist/tests/types.test.d.ts.map +1 -0
  307. package/dist/tests/types.test.js +215 -0
  308. package/dist/tests/types.test.js.map +1 -0
  309. package/dist/types/index.d.ts +369 -0
  310. package/dist/types/index.d.ts.map +1 -0
  311. package/dist/types/index.js +92 -0
  312. package/dist/types/index.js.map +1 -0
  313. package/dist/utils/error-handler.d.ts +2 -0
  314. package/dist/utils/error-handler.d.ts.map +1 -0
  315. package/dist/utils/error-handler.js +5 -0
  316. package/dist/utils/error-handler.js.map +1 -0
  317. package/dist/utils/output.d.ts +2 -0
  318. package/dist/utils/output.d.ts.map +1 -0
  319. package/dist/utils/output.js +4 -0
  320. package/dist/utils/output.js.map +1 -0
  321. package/docs/discord.md +182 -0
  322. package/docs/slack.md +160 -0
  323. package/package.json +37 -0
  324. package/skills/agent-discord/SKILL.md +273 -0
  325. package/skills/agent-discord/references/authentication.md +294 -0
  326. package/skills/agent-discord/references/common-patterns.md +455 -0
  327. package/skills/agent-discord/templates/guild-summary.sh +167 -0
  328. package/skills/agent-discord/templates/monitor-channel.sh +180 -0
  329. package/skills/agent-discord/templates/post-message.sh +173 -0
  330. package/skills/agent-slack/SKILL.md +268 -0
  331. package/skills/agent-slack/references/authentication.md +332 -0
  332. package/skills/agent-slack/references/common-patterns.md +527 -0
  333. package/skills/agent-slack/templates/monitor-channel.sh +186 -0
  334. package/skills/agent-slack/templates/post-message.sh +130 -0
  335. package/skills/agent-slack/templates/workspace-summary.sh +149 -0
  336. package/src/cli.ts +29 -0
  337. package/src/platforms/discord/cli.ts +36 -0
  338. package/src/platforms/discord/client.test.ts +456 -0
  339. package/src/platforms/discord/client.ts +281 -0
  340. package/src/platforms/discord/commands/auth.test.ts +72 -0
  341. package/src/platforms/discord/commands/auth.ts +206 -0
  342. package/src/platforms/discord/commands/channel.test.ts +153 -0
  343. package/src/platforms/discord/commands/channel.ts +127 -0
  344. package/src/platforms/discord/commands/file.test.ts +98 -0
  345. package/src/platforms/discord/commands/file.ts +134 -0
  346. package/src/platforms/discord/commands/guild.test.ts +117 -0
  347. package/src/platforms/discord/commands/guild.ts +129 -0
  348. package/src/platforms/discord/commands/index.ts +8 -0
  349. package/src/platforms/discord/commands/message.test.ts +107 -0
  350. package/src/platforms/discord/commands/message.ts +182 -0
  351. package/src/platforms/discord/commands/reaction.test.ts +123 -0
  352. package/src/platforms/discord/commands/reaction.ts +156 -0
  353. package/src/platforms/discord/commands/snapshot.test.ts +29 -0
  354. package/src/platforms/discord/commands/snapshot.ts +104 -0
  355. package/src/platforms/discord/commands/user.test.ts +115 -0
  356. package/src/platforms/discord/commands/user.ts +124 -0
  357. package/src/platforms/discord/credential-manager.test.ts +173 -0
  358. package/src/platforms/discord/credential-manager.ts +95 -0
  359. package/src/platforms/discord/token-extractor.test.ts +918 -0
  360. package/src/platforms/discord/token-extractor.ts +549 -0
  361. package/src/platforms/discord/types.test.ts +245 -0
  362. package/src/platforms/discord/types.ts +158 -0
  363. package/src/platforms/slack/cli.ts +36 -0
  364. package/src/platforms/slack/client.ts +466 -0
  365. package/src/platforms/slack/commands/auth.ts +211 -0
  366. package/src/platforms/slack/commands/channel.ts +158 -0
  367. package/src/platforms/slack/commands/file.ts +153 -0
  368. package/src/platforms/slack/commands/index.ts +8 -0
  369. package/src/platforms/slack/commands/message.ts +369 -0
  370. package/src/platforms/slack/commands/reaction.ts +166 -0
  371. package/src/platforms/slack/commands/snapshot.ts +114 -0
  372. package/src/platforms/slack/commands/user.ts +110 -0
  373. package/src/platforms/slack/commands/workspace.ts +111 -0
  374. package/src/platforms/slack/credential-manager.ts +74 -0
  375. package/src/platforms/slack/index.ts +2 -0
  376. package/src/platforms/slack/token-extractor.ts +496 -0
  377. package/src/platforms/slack/types.ts +193 -0
  378. package/src/shared/utils/concurrency.test.ts +53 -0
  379. package/src/shared/utils/concurrency.ts +20 -0
  380. package/src/shared/utils/error-handler.ts +4 -0
  381. package/src/shared/utils/output.ts +3 -0
  382. package/tests/cli.test.ts +94 -0
  383. package/tests/commands/auth.test.ts +383 -0
  384. package/tests/commands/channel.test.ts +185 -0
  385. package/tests/commands/file.test.ts +204 -0
  386. package/tests/commands/message.test.ts +344 -0
  387. package/tests/commands/reaction.test.ts +101 -0
  388. package/tests/commands/snapshot.test.ts +308 -0
  389. package/tests/commands/user.test.ts +138 -0
  390. package/tests/commands/workspace.test.ts +528 -0
  391. package/tests/credential-manager.test.ts +241 -0
  392. package/tests/slack-client.test.ts +916 -0
  393. package/tests/types.test.ts +241 -0
  394. package/tsconfig.json +36 -0
@@ -0,0 +1,187 @@
1
+ export class DiscordError extends Error {
2
+ code;
3
+ constructor(message, code) {
4
+ super(message);
5
+ this.name = 'DiscordError';
6
+ this.code = code;
7
+ }
8
+ }
9
+ const BASE_URL = 'https://discord.com/api/v10';
10
+ const MAX_RETRIES = 3;
11
+ const BASE_BACKOFF_MS = 100;
12
+ export class DiscordClient {
13
+ token;
14
+ buckets = new Map();
15
+ globalRateLimitUntil = 0;
16
+ constructor(token) {
17
+ if (!token) {
18
+ throw new DiscordError('Token is required', 'missing_token');
19
+ }
20
+ this.token = token;
21
+ }
22
+ getBucketKey(method, path) {
23
+ const normalized = path
24
+ .replace(/\/channels\/\d+/, '/channels/{channel_id}')
25
+ .replace(/\/guilds\/\d+/, '/guilds/{guild_id}')
26
+ .replace(/\/users\/\d+/, '/users/{user_id}')
27
+ .replace(/\/messages\/\d+/, '/messages/{message_id}');
28
+ return `${method}:${normalized}`;
29
+ }
30
+ async waitForRateLimit(bucketKey) {
31
+ const now = Date.now();
32
+ if (this.globalRateLimitUntil > now) {
33
+ await this.sleep(this.globalRateLimitUntil - now);
34
+ }
35
+ const bucket = this.buckets.get(bucketKey);
36
+ if (bucket && bucket.remaining === 0 && bucket.resetAt * 1000 > now) {
37
+ await this.sleep(bucket.resetAt * 1000 - now);
38
+ }
39
+ }
40
+ updateBucket(bucketKey, response) {
41
+ const remaining = response.headers.get('X-RateLimit-Remaining');
42
+ const reset = response.headers.get('X-RateLimit-Reset');
43
+ const bucketHash = response.headers.get('X-RateLimit-Bucket');
44
+ if (remaining !== null && reset !== null && bucketHash !== null) {
45
+ this.buckets.set(bucketKey, {
46
+ remaining: parseInt(remaining, 10),
47
+ resetAt: parseFloat(reset),
48
+ bucketHash,
49
+ });
50
+ }
51
+ }
52
+ async handleRateLimitResponse(response) {
53
+ const retryAfter = response.headers.get('Retry-After');
54
+ const isGlobal = response.headers.get('X-RateLimit-Global') === 'true';
55
+ const waitMs = parseFloat(retryAfter || '1') * 1000;
56
+ if (isGlobal) {
57
+ this.globalRateLimitUntil = Date.now() + waitMs;
58
+ }
59
+ await this.sleep(waitMs);
60
+ return waitMs;
61
+ }
62
+ sleep(ms) {
63
+ return new Promise((resolve) => setTimeout(resolve, ms));
64
+ }
65
+ async request(method, path, body) {
66
+ const url = `${BASE_URL}${path}`;
67
+ const bucketKey = this.getBucketKey(method, path);
68
+ let lastError;
69
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
70
+ await this.waitForRateLimit(bucketKey);
71
+ const headers = {
72
+ Authorization: this.token,
73
+ 'Content-Type': 'application/json',
74
+ };
75
+ const options = {
76
+ method,
77
+ headers,
78
+ };
79
+ if (body !== undefined) {
80
+ options.body = JSON.stringify(body);
81
+ }
82
+ const response = await fetch(url, options);
83
+ this.updateBucket(bucketKey, response);
84
+ if (response.status === 429) {
85
+ if (attempt < MAX_RETRIES) {
86
+ await this.handleRateLimitResponse(response);
87
+ continue;
88
+ }
89
+ const errorBody = await response.json().catch(() => ({}));
90
+ throw new DiscordError(errorBody.message || 'Rate limited', 'rate_limited');
91
+ }
92
+ if (response.status >= 500 && attempt < MAX_RETRIES) {
93
+ await this.sleep(BASE_BACKOFF_MS * 2 ** attempt);
94
+ continue;
95
+ }
96
+ if (!response.ok) {
97
+ const errorBody = await response.json().catch(() => ({}));
98
+ throw new DiscordError(errorBody.message || `HTTP ${response.status}`, errorBody.code?.toString() || `http_${response.status}`);
99
+ }
100
+ if (response.status === 204) {
101
+ return undefined;
102
+ }
103
+ return response.json();
104
+ }
105
+ throw lastError || new DiscordError('Request failed after retries', 'max_retries');
106
+ }
107
+ async requestFormData(path, formData) {
108
+ const url = `${BASE_URL}${path}`;
109
+ const bucketKey = this.getBucketKey('POST', path);
110
+ await this.waitForRateLimit(bucketKey);
111
+ const response = await fetch(url, {
112
+ method: 'POST',
113
+ headers: {
114
+ Authorization: this.token,
115
+ },
116
+ body: formData,
117
+ });
118
+ this.updateBucket(bucketKey, response);
119
+ if (!response.ok) {
120
+ const errorBody = await response.json().catch(() => ({}));
121
+ throw new DiscordError(errorBody.message || `HTTP ${response.status}`, errorBody.code?.toString() || `http_${response.status}`);
122
+ }
123
+ return response.json();
124
+ }
125
+ async testAuth() {
126
+ return this.request('GET', '/users/@me');
127
+ }
128
+ async listGuilds() {
129
+ return this.request('GET', '/users/@me/guilds');
130
+ }
131
+ async getGuild(guildId) {
132
+ return this.request('GET', `/guilds/${guildId}`);
133
+ }
134
+ async listChannels(guildId) {
135
+ return this.request('GET', `/guilds/${guildId}/channels`);
136
+ }
137
+ async getChannel(channelId) {
138
+ return this.request('GET', `/channels/${channelId}`);
139
+ }
140
+ async sendMessage(channelId, content) {
141
+ return this.request('POST', `/channels/${channelId}/messages`, { content });
142
+ }
143
+ async getMessages(channelId, limit = 50) {
144
+ return this.request('GET', `/channels/${channelId}/messages?limit=${limit}`);
145
+ }
146
+ async getMessage(channelId, messageId) {
147
+ return this.request('GET', `/channels/${channelId}/messages/${messageId}`);
148
+ }
149
+ async deleteMessage(channelId, messageId) {
150
+ return this.request('DELETE', `/channels/${channelId}/messages/${messageId}`);
151
+ }
152
+ async addReaction(channelId, messageId, emoji) {
153
+ const encodedEmoji = encodeURIComponent(emoji);
154
+ return this.request('PUT', `/channels/${channelId}/messages/${messageId}/reactions/${encodedEmoji}/@me`);
155
+ }
156
+ async removeReaction(channelId, messageId, emoji) {
157
+ const encodedEmoji = encodeURIComponent(emoji);
158
+ return this.request('DELETE', `/channels/${channelId}/messages/${messageId}/reactions/${encodedEmoji}/@me`);
159
+ }
160
+ async listUsers(guildId) {
161
+ const members = await this.request('GET', `/guilds/${guildId}/members?limit=1000`);
162
+ return members.map((m) => m.user);
163
+ }
164
+ async getUser(userId) {
165
+ return this.request('GET', `/users/${userId}`);
166
+ }
167
+ async uploadFile(channelId, filePath) {
168
+ const file = Bun.file(filePath);
169
+ const filename = filePath.split('/').pop() || 'file';
170
+ const blob = await file.arrayBuffer();
171
+ const formData = new FormData();
172
+ formData.append('files[0]', new Blob([blob]), filename);
173
+ const message = await this.requestFormData(`/channels/${channelId}/messages`, formData);
174
+ return message.attachments[0];
175
+ }
176
+ async listFiles(channelId) {
177
+ const messages = await this.request('GET', `/channels/${channelId}/messages?limit=100`);
178
+ const files = [];
179
+ for (const msg of messages) {
180
+ if (msg.attachments && msg.attachments.length > 0) {
181
+ files.push(...msg.attachments);
182
+ }
183
+ }
184
+ return files;
185
+ }
186
+ }
187
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/platforms/discord/client.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,IAAI,CAAQ;IAEZ,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAQD,MAAM,QAAQ,GAAG,6BAA6B,CAAA;AAC9C,MAAM,WAAW,GAAG,CAAC,CAAA;AACrB,MAAM,eAAe,GAAG,GAAG,CAAA;AAE3B,MAAM,OAAO,aAAa;IAChB,KAAK,CAAQ;IACb,OAAO,GAAiC,IAAI,GAAG,EAAE,CAAA;IACjD,oBAAoB,GAAW,CAAC,CAAA;IAExC,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,YAAY,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAA;QAC9D,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAEO,YAAY,CAAC,MAAc,EAAE,IAAY;QAC/C,MAAM,UAAU,GAAG,IAAI;aACpB,OAAO,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;aACpD,OAAO,CAAC,eAAe,EAAE,oBAAoB,CAAC;aAC9C,OAAO,CAAC,cAAc,EAAE,kBAAkB,CAAC;aAC3C,OAAO,CAAC,iBAAiB,EAAE,wBAAwB,CAAC,CAAA;QACvD,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,CAAA;IAClC,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,IAAI,IAAI,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAA;QACnD,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC1C,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;YACpE,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,SAAiB,EAAE,QAAkB;QACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;QAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QAE7D,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE;gBAC1B,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;gBAClC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;gBAC1B,UAAU;aACX,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,QAAkB;QACtD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,MAAM,CAAA;QACtE,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,IAAI,CAAA;QAEnD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAA;QACjD,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACxB,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;IAC1D,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACnE,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAA;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACjD,IAAI,SAA4B,CAAA;QAEhC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;YAEtC,MAAM,OAAO,GAA2B;gBACtC,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,cAAc,EAAE,kBAAkB;aACnC,CAAA;YAED,MAAM,OAAO,GAAgB;gBAC3B,MAAM;gBACN,OAAO;aACR,CAAA;YAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACrC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAC1C,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBAC1B,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAA;oBAC5C,SAAQ;gBACV,CAAC;gBACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBACzD,MAAM,IAAI,YAAY,CAAE,SAAiB,CAAC,OAAO,IAAI,cAAc,EAAE,cAAc,CAAC,CAAA;YACtF,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBACpD,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,IAAI,OAAO,CAAC,CAAA;gBAChD,SAAQ;YACV,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBACzD,MAAM,IAAI,YAAY,CACnB,SAAiB,CAAC,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,EACtD,SAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CACjE,CAAA;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,SAAc,CAAA;YACvB,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAA;QACtC,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,YAAY,CAAC,8BAA8B,EAAE,aAAa,CAAC,CAAA;IACpF,CAAC;IAEO,KAAK,CAAC,eAAe,CAAI,IAAY,EAAE,QAAkB;QAC/D,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAA;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAEjD,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,IAAI,CAAC,KAAK;aAC1B;YACD,IAAI,EAAE,QAAQ;SACf,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAEtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACzD,MAAM,IAAI,YAAY,CACnB,SAAiB,CAAC,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,EACtD,SAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CACjE,CAAA;QACH,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,OAAO,CAAc,KAAK,EAAE,YAAY,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,OAAO,CAAiB,KAAK,EAAE,mBAAmB,CAAC,CAAA;IACjE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAe,KAAK,EAAE,WAAW,OAAO,EAAE,CAAC,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,OAAO,IAAI,CAAC,OAAO,CAAmB,KAAK,EAAE,WAAW,OAAO,WAAW,CAAC,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAiB,KAAK,EAAE,aAAa,SAAS,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAe;QAClD,OAAO,IAAI,CAAC,OAAO,CAAiB,MAAM,EAAE,aAAa,SAAS,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IAC7F,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,QAAgB,EAAE;QACrD,OAAO,IAAI,CAAC,OAAO,CAAmB,KAAK,EAAE,aAAa,SAAS,mBAAmB,KAAK,EAAE,CAAC,CAAA;IAChG,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,SAAiB;QACnD,OAAO,IAAI,CAAC,OAAO,CAAiB,KAAK,EAAE,aAAa,SAAS,aAAa,SAAS,EAAE,CAAC,CAAA;IAC5F,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,SAAiB;QACtD,OAAO,IAAI,CAAC,OAAO,CAAO,QAAQ,EAAE,aAAa,SAAS,aAAa,SAAS,EAAE,CAAC,CAAA;IACrF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAa;QACnE,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,aAAa,SAAS,aAAa,SAAS,cAAc,YAAY,MAAM,CAC7E,CAAA;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAa;QACtE,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAC9C,OAAO,IAAI,CAAC,OAAO,CACjB,QAAQ,EACR,aAAa,SAAS,aAAa,SAAS,cAAc,YAAY,MAAM,CAC7E,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe;QAI7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAChC,KAAK,EACL,WAAW,OAAO,qBAAqB,CACxC,CAAA;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAc,KAAK,EAAE,UAAU,MAAM,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,QAAgB;QAClD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAA;QACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;QAErC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC/B,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QAKvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CACxC,aAAa,SAAS,WAAW,EACjC,QAAQ,CACT,CAAA;QAED,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB;QAI/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CACjC,KAAK,EACL,aAAa,SAAS,qBAAqB,CAC5C,CAAA;QAED,MAAM,KAAK,GAAkB,EAAE,CAAA;QAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../../../src/platforms/discord/client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,367 @@
1
+ import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
2
+ import { DiscordClient, DiscordError } from './client';
3
+ describe('DiscordClient', () => {
4
+ const originalFetch = globalThis.fetch;
5
+ let fetchCalls = [];
6
+ let fetchResponses = [];
7
+ let fetchIndex = 0;
8
+ beforeEach(() => {
9
+ fetchCalls = [];
10
+ fetchResponses = [];
11
+ fetchIndex = 0;
12
+ globalThis.fetch = async (url, options) => {
13
+ fetchCalls.push({ url: url.toString(), options });
14
+ const response = fetchResponses[fetchIndex];
15
+ fetchIndex++;
16
+ if (!response) {
17
+ throw new Error('No mock response configured');
18
+ }
19
+ return response;
20
+ };
21
+ });
22
+ afterEach(() => {
23
+ globalThis.fetch = originalFetch;
24
+ });
25
+ afterEach(() => {
26
+ globalThis.fetch = originalFetch;
27
+ });
28
+ const mockResponse = (body, status = 200, headers = {}) => {
29
+ const defaultHeaders = {
30
+ 'Content-Type': 'application/json',
31
+ 'X-RateLimit-Remaining': '10',
32
+ 'X-RateLimit-Reset': String(Date.now() / 1000 + 60),
33
+ 'X-RateLimit-Bucket': 'test-bucket',
34
+ ...headers,
35
+ };
36
+ fetchResponses.push(new Response(body === null ? null : JSON.stringify(body), {
37
+ status,
38
+ headers: defaultHeaders,
39
+ }));
40
+ };
41
+ describe('constructor', () => {
42
+ test('requires token', () => {
43
+ expect(() => new DiscordClient('')).toThrow(DiscordError);
44
+ expect(() => new DiscordClient('')).toThrow('Token is required');
45
+ });
46
+ test('accepts valid token', () => {
47
+ const client = new DiscordClient('test-token');
48
+ expect(client).toBeInstanceOf(DiscordClient);
49
+ });
50
+ });
51
+ describe('testAuth', () => {
52
+ test('returns current user info', async () => {
53
+ mockResponse({
54
+ id: '123456789',
55
+ username: 'testuser',
56
+ global_name: 'Test User',
57
+ avatar: 'abc123',
58
+ });
59
+ const client = new DiscordClient('test-token');
60
+ const user = await client.testAuth();
61
+ expect(user.id).toBe('123456789');
62
+ expect(user.username).toBe('testuser');
63
+ expect(fetchCalls.length).toBe(1);
64
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/users/@me');
65
+ expect(fetchCalls[0].options?.headers).toMatchObject({
66
+ Authorization: 'test-token',
67
+ });
68
+ });
69
+ test('throws DiscordError on API error', async () => {
70
+ mockResponse({ message: 'Unauthorized', code: 401 }, 401);
71
+ const client = new DiscordClient('bad-token');
72
+ await expect(client.testAuth()).rejects.toThrow(DiscordError);
73
+ });
74
+ });
75
+ describe('listGuilds', () => {
76
+ test('returns list of guilds', async () => {
77
+ mockResponse([
78
+ { id: '111', name: 'Guild One' },
79
+ { id: '222', name: 'Guild Two' },
80
+ ]);
81
+ const client = new DiscordClient('test-token');
82
+ const guilds = await client.listGuilds();
83
+ expect(guilds).toHaveLength(2);
84
+ expect(guilds[0].name).toBe('Guild One');
85
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/users/@me/guilds');
86
+ });
87
+ });
88
+ describe('getGuild', () => {
89
+ test('returns guild info', async () => {
90
+ mockResponse({ id: '111', name: 'Test Guild' });
91
+ const client = new DiscordClient('test-token');
92
+ const guild = await client.getGuild('111');
93
+ expect(guild.id).toBe('111');
94
+ expect(guild.name).toBe('Test Guild');
95
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/guilds/111');
96
+ });
97
+ });
98
+ describe('listChannels', () => {
99
+ test('returns list of channels for guild', async () => {
100
+ mockResponse([
101
+ { id: 'ch1', guild_id: '111', name: 'general', type: 0 },
102
+ { id: 'ch2', guild_id: '111', name: 'random', type: 0 },
103
+ ]);
104
+ const client = new DiscordClient('test-token');
105
+ const channels = await client.listChannels('111');
106
+ expect(channels).toHaveLength(2);
107
+ expect(channels[0].name).toBe('general');
108
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/guilds/111/channels');
109
+ });
110
+ });
111
+ describe('getChannel', () => {
112
+ test('returns channel info', async () => {
113
+ mockResponse({ id: 'ch1', guild_id: '111', name: 'general', type: 0 });
114
+ const client = new DiscordClient('test-token');
115
+ const channel = await client.getChannel('ch1');
116
+ expect(channel.id).toBe('ch1');
117
+ expect(channel.name).toBe('general');
118
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1');
119
+ });
120
+ });
121
+ describe('sendMessage', () => {
122
+ test('sends message to channel', async () => {
123
+ mockResponse({
124
+ id: 'msg1',
125
+ channel_id: 'ch1',
126
+ author: { id: '123', username: 'bot' },
127
+ content: 'Hello world',
128
+ timestamp: '2024-01-01T00:00:00.000Z',
129
+ });
130
+ const client = new DiscordClient('test-token');
131
+ const message = await client.sendMessage('ch1', 'Hello world');
132
+ expect(message.content).toBe('Hello world');
133
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages');
134
+ expect(fetchCalls[0].options?.method).toBe('POST');
135
+ expect(fetchCalls[0].options?.body).toBe(JSON.stringify({ content: 'Hello world' }));
136
+ });
137
+ });
138
+ describe('getMessages', () => {
139
+ test('returns messages from channel', async () => {
140
+ mockResponse([
141
+ {
142
+ id: 'msg1',
143
+ channel_id: 'ch1',
144
+ author: { id: '123', username: 'user1' },
145
+ content: 'Message 1',
146
+ timestamp: '2024-01-01T00:00:00.000Z',
147
+ },
148
+ ]);
149
+ const client = new DiscordClient('test-token');
150
+ const messages = await client.getMessages('ch1', 50);
151
+ expect(messages).toHaveLength(1);
152
+ expect(messages[0].content).toBe('Message 1');
153
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages?limit=50');
154
+ });
155
+ test('uses default limit of 50', async () => {
156
+ mockResponse([]);
157
+ const client = new DiscordClient('test-token');
158
+ await client.getMessages('ch1');
159
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages?limit=50');
160
+ });
161
+ });
162
+ describe('getMessage', () => {
163
+ test('returns single message', async () => {
164
+ mockResponse({
165
+ id: 'msg1',
166
+ channel_id: 'ch1',
167
+ author: { id: '123', username: 'user1' },
168
+ content: 'Message 1',
169
+ timestamp: '2024-01-01T00:00:00.000Z',
170
+ });
171
+ const client = new DiscordClient('test-token');
172
+ const message = await client.getMessage('ch1', 'msg1');
173
+ expect(message.id).toBe('msg1');
174
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages/msg1');
175
+ });
176
+ });
177
+ describe('deleteMessage', () => {
178
+ test('deletes message', async () => {
179
+ mockResponse(null, 204);
180
+ const client = new DiscordClient('test-token');
181
+ await client.deleteMessage('ch1', 'msg1');
182
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages/msg1');
183
+ expect(fetchCalls[0].options?.method).toBe('DELETE');
184
+ });
185
+ });
186
+ describe('addReaction', () => {
187
+ test('adds reaction to message', async () => {
188
+ mockResponse(null, 204);
189
+ const client = new DiscordClient('test-token');
190
+ await client.addReaction('ch1', 'msg1', '👍');
191
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages/msg1/reactions/%F0%9F%91%8D/@me');
192
+ expect(fetchCalls[0].options?.method).toBe('PUT');
193
+ });
194
+ });
195
+ describe('removeReaction', () => {
196
+ test('removes reaction from message', async () => {
197
+ mockResponse(null, 204);
198
+ const client = new DiscordClient('test-token');
199
+ await client.removeReaction('ch1', 'msg1', '👍');
200
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages/msg1/reactions/%F0%9F%91%8D/@me');
201
+ expect(fetchCalls[0].options?.method).toBe('DELETE');
202
+ });
203
+ });
204
+ describe('listUsers', () => {
205
+ test('returns list of guild members', async () => {
206
+ mockResponse([
207
+ { user: { id: 'u1', username: 'user1' } },
208
+ { user: { id: 'u2', username: 'user2' } },
209
+ ]);
210
+ const client = new DiscordClient('test-token');
211
+ const users = await client.listUsers('111');
212
+ expect(users).toHaveLength(2);
213
+ expect(users[0].username).toBe('user1');
214
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/guilds/111/members?limit=1000');
215
+ });
216
+ });
217
+ describe('getUser', () => {
218
+ test('returns user info', async () => {
219
+ mockResponse({ id: 'u1', username: 'testuser' });
220
+ const client = new DiscordClient('test-token');
221
+ const user = await client.getUser('u1');
222
+ expect(user.id).toBe('u1');
223
+ expect(user.username).toBe('testuser');
224
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/users/u1');
225
+ });
226
+ });
227
+ describe('uploadFile', () => {
228
+ test('uploads file to channel', async () => {
229
+ const tempFile = '/tmp/test-upload.txt';
230
+ await Bun.write(tempFile, 'test content');
231
+ mockResponse({
232
+ id: 'msg1',
233
+ channel_id: 'ch1',
234
+ author: { id: '123', username: 'bot' },
235
+ content: '',
236
+ timestamp: '2024-01-01T00:00:00.000Z',
237
+ attachments: [
238
+ {
239
+ id: 'att1',
240
+ filename: 'test-upload.txt',
241
+ size: 12,
242
+ url: 'https://cdn.discord.com/attachments/ch1/att1/test-upload.txt',
243
+ },
244
+ ],
245
+ });
246
+ const client = new DiscordClient('test-token');
247
+ const file = await client.uploadFile('ch1', tempFile);
248
+ expect(file.filename).toBe('test-upload.txt');
249
+ expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/channels/ch1/messages');
250
+ expect(fetchCalls[0].options?.method).toBe('POST');
251
+ });
252
+ });
253
+ describe('listFiles', () => {
254
+ test('returns files from recent messages', async () => {
255
+ mockResponse([
256
+ {
257
+ id: 'msg1',
258
+ channel_id: 'ch1',
259
+ author: { id: '123', username: 'user1' },
260
+ content: '',
261
+ timestamp: '2024-01-01T00:00:00.000Z',
262
+ attachments: [
263
+ { id: 'att1', filename: 'file1.txt', size: 100, url: 'https://example.com/file1.txt' },
264
+ ],
265
+ },
266
+ {
267
+ id: 'msg2',
268
+ channel_id: 'ch1',
269
+ author: { id: '456', username: 'user2' },
270
+ content: 'No attachments',
271
+ timestamp: '2024-01-01T00:00:01.000Z',
272
+ attachments: [],
273
+ },
274
+ ]);
275
+ const client = new DiscordClient('test-token');
276
+ const files = await client.listFiles('ch1');
277
+ expect(files).toHaveLength(1);
278
+ expect(files[0].filename).toBe('file1.txt');
279
+ });
280
+ });
281
+ describe('rate limiting', () => {
282
+ test('waits when bucket is exhausted before making request', async () => {
283
+ mockResponse({ id: '1', username: 'user1' }, 200, {
284
+ 'X-RateLimit-Remaining': '0',
285
+ 'X-RateLimit-Reset': String(Date.now() / 1000 + 0.1),
286
+ 'X-RateLimit-Bucket': 'user-bucket',
287
+ });
288
+ mockResponse({ id: '2', username: 'user2' }, 200, {
289
+ 'X-RateLimit-Remaining': '10',
290
+ 'X-RateLimit-Reset': String(Date.now() / 1000 + 60),
291
+ 'X-RateLimit-Bucket': 'user-bucket',
292
+ });
293
+ const client = new DiscordClient('test-token');
294
+ await client.testAuth();
295
+ const startTime = Date.now();
296
+ await client.testAuth();
297
+ const elapsed = Date.now() - startTime;
298
+ expect(elapsed).toBeGreaterThanOrEqual(50);
299
+ expect(fetchCalls.length).toBe(2);
300
+ });
301
+ test('retries on 429 with Retry-After header', async () => {
302
+ mockResponse({ message: 'Rate limited', retry_after: 0.1 }, 429, { 'Retry-After': '0.1' });
303
+ mockResponse({ id: '123', username: 'user' });
304
+ const client = new DiscordClient('test-token');
305
+ const user = await client.testAuth();
306
+ expect(user.id).toBe('123');
307
+ expect(fetchCalls.length).toBe(2);
308
+ });
309
+ test('handles global rate limit', async () => {
310
+ mockResponse({ message: 'Global rate limited', global: true }, 429, {
311
+ 'Retry-After': '0.1',
312
+ 'X-RateLimit-Global': 'true',
313
+ });
314
+ mockResponse({ id: '123', username: 'user' });
315
+ const client = new DiscordClient('test-token');
316
+ const user = await client.testAuth();
317
+ expect(user.id).toBe('123');
318
+ expect(fetchCalls.length).toBe(2);
319
+ });
320
+ test('throws after max retries exceeded', async () => {
321
+ for (let i = 0; i <= 3; i++) {
322
+ mockResponse({ message: 'Rate limited' }, 429, { 'Retry-After': '0.01' });
323
+ }
324
+ const client = new DiscordClient('test-token');
325
+ await expect(client.testAuth()).rejects.toThrow(DiscordError);
326
+ expect(fetchCalls.length).toBeLessThanOrEqual(4);
327
+ });
328
+ });
329
+ describe('retry logic', () => {
330
+ test('retries on 500 server error', async () => {
331
+ mockResponse({ message: 'Internal Server Error' }, 500);
332
+ mockResponse({ id: '123', username: 'user' });
333
+ const client = new DiscordClient('test-token');
334
+ const user = await client.testAuth();
335
+ expect(user.id).toBe('123');
336
+ expect(fetchCalls.length).toBe(2);
337
+ });
338
+ test('does not retry on 4xx client errors (except 429)', async () => {
339
+ mockResponse({ message: 'Not Found' }, 404);
340
+ const client = new DiscordClient('test-token');
341
+ await expect(client.testAuth()).rejects.toThrow(DiscordError);
342
+ expect(fetchCalls.length).toBe(1);
343
+ });
344
+ test('exponential backoff increases delay', async () => {
345
+ mockResponse({ message: 'Error' }, 500);
346
+ mockResponse({ message: 'Error' }, 500);
347
+ mockResponse({ id: '123', username: 'user' });
348
+ const client = new DiscordClient('test-token');
349
+ const startTime = Date.now();
350
+ await client.testAuth();
351
+ const elapsed = Date.now() - startTime;
352
+ expect(elapsed).toBeGreaterThanOrEqual(150);
353
+ expect(fetchCalls.length).toBe(3);
354
+ });
355
+ });
356
+ describe('bucket key normalization', () => {
357
+ test('normalizes channel IDs in routes', async () => {
358
+ mockResponse([]);
359
+ mockResponse([]);
360
+ const client = new DiscordClient('test-token');
361
+ await client.getMessages('123456789');
362
+ await client.getMessages('987654321');
363
+ expect(fetchCalls.length).toBe(2);
364
+ });
365
+ });
366
+ });
367
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../../src/platforms/discord/client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from 'commander';
2
+ export declare function extractAction(options: {
3
+ pretty?: boolean;
4
+ debug?: boolean;
5
+ }): Promise<void>;
6
+ export declare function logoutAction(options: {
7
+ pretty?: boolean;
8
+ }): Promise<void>;
9
+ export declare function statusAction(options: {
10
+ pretty?: boolean;
11
+ }): Promise<void>;
12
+ export declare const authCommand: Command;
13
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/discord/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwHjG;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/E;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC/E;AAED,eAAO,MAAM,WAAW,SAoBrB,CAAA"}