agent-messenger 1.0.0 → 1.2.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 (512) hide show
  1. package/.claude/commands/release.md +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.github/workflows/ci.yml +1 -1
  4. package/.github/workflows/e2e.yml.disabled +69 -0
  5. package/CONTRIBUTING.md +2 -2
  6. package/README.md +18 -15
  7. package/biome.json +34 -2
  8. package/bun.lock +63 -0
  9. package/dist/package.json +8 -4
  10. package/dist/src/cli.d.ts.map +1 -1
  11. package/dist/src/cli.js +4 -1
  12. package/dist/src/cli.js.map +1 -1
  13. package/dist/src/platforms/discord/cli.js +4 -4
  14. package/dist/src/platforms/discord/cli.js.map +1 -1
  15. package/dist/src/platforms/discord/client.d.ts +26 -5
  16. package/dist/src/platforms/discord/client.d.ts.map +1 -1
  17. package/dist/src/platforms/discord/client.js +115 -17
  18. package/dist/src/platforms/discord/client.js.map +1 -1
  19. package/dist/src/platforms/discord/commands/auth.js +16 -16
  20. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  21. package/dist/src/platforms/discord/commands/channel.js +4 -4
  22. package/dist/src/platforms/discord/commands/channel.js.map +1 -1
  23. package/dist/src/platforms/discord/commands/dm.d.ts +9 -0
  24. package/dist/src/platforms/discord/commands/dm.d.ts.map +1 -0
  25. package/dist/src/platforms/discord/commands/dm.js +68 -0
  26. package/dist/src/platforms/discord/commands/dm.js.map +1 -0
  27. package/dist/src/platforms/discord/commands/friend.d.ts +3 -0
  28. package/dist/src/platforms/discord/commands/friend.d.ts.map +1 -0
  29. package/dist/src/platforms/discord/commands/friend.js +39 -0
  30. package/dist/src/platforms/discord/commands/friend.js.map +1 -0
  31. package/dist/src/platforms/discord/commands/index.d.ts +1 -1
  32. package/dist/src/platforms/discord/commands/index.d.ts.map +1 -1
  33. package/dist/src/platforms/discord/commands/index.js +1 -1
  34. package/dist/src/platforms/discord/commands/index.js.map +1 -1
  35. package/dist/src/platforms/discord/commands/member.d.ts +3 -0
  36. package/dist/src/platforms/discord/commands/member.d.ts.map +1 -0
  37. package/dist/src/platforms/discord/commands/member.js +47 -0
  38. package/dist/src/platforms/discord/commands/member.js.map +1 -0
  39. package/dist/src/platforms/discord/commands/mention.d.ts +8 -0
  40. package/dist/src/platforms/discord/commands/mention.d.ts.map +1 -0
  41. package/dist/src/platforms/discord/commands/mention.js +47 -0
  42. package/dist/src/platforms/discord/commands/mention.js.map +1 -0
  43. package/dist/src/platforms/discord/commands/message.d.ts +13 -0
  44. package/dist/src/platforms/discord/commands/message.d.ts.map +1 -1
  45. package/dist/src/platforms/discord/commands/message.js +95 -1
  46. package/dist/src/platforms/discord/commands/message.js.map +1 -1
  47. package/dist/src/platforms/discord/commands/note.d.ts +3 -0
  48. package/dist/src/platforms/discord/commands/note.d.ts.map +1 -0
  49. package/dist/src/platforms/discord/commands/note.js +56 -0
  50. package/dist/src/platforms/discord/commands/note.js.map +1 -0
  51. package/dist/src/platforms/discord/commands/profile.d.ts +3 -0
  52. package/dist/src/platforms/discord/commands/profile.d.ts.map +1 -0
  53. package/dist/src/platforms/discord/commands/profile.js +47 -0
  54. package/dist/src/platforms/discord/commands/profile.js.map +1 -0
  55. package/dist/src/platforms/discord/commands/server.d.ts +15 -0
  56. package/dist/src/platforms/discord/commands/server.d.ts.map +1 -0
  57. package/dist/src/platforms/discord/commands/server.js +102 -0
  58. package/dist/src/platforms/discord/commands/server.js.map +1 -0
  59. package/dist/src/platforms/discord/commands/snapshot.js +10 -10
  60. package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
  61. package/dist/src/platforms/discord/commands/thread.d.ts +10 -0
  62. package/dist/src/platforms/discord/commands/thread.d.ts.map +1 -0
  63. package/dist/src/platforms/discord/commands/thread.js +67 -0
  64. package/dist/src/platforms/discord/commands/thread.js.map +1 -0
  65. package/dist/src/platforms/discord/commands/user.d.ts.map +1 -1
  66. package/dist/src/platforms/discord/commands/user.js +14 -5
  67. package/dist/src/platforms/discord/commands/user.js.map +1 -1
  68. package/dist/src/platforms/discord/credential-manager.d.ts +13 -13
  69. package/dist/src/platforms/discord/credential-manager.d.ts.map +1 -1
  70. package/dist/src/platforms/discord/credential-manager.js +28 -22
  71. package/dist/src/platforms/discord/credential-manager.js.map +1 -1
  72. package/dist/src/platforms/discord/super-properties.d.ts +4 -0
  73. package/dist/src/platforms/discord/super-properties.d.ts.map +1 -0
  74. package/dist/src/platforms/discord/super-properties.js +50 -0
  75. package/dist/src/platforms/discord/super-properties.js.map +1 -0
  76. package/dist/src/platforms/discord/token-extractor.d.ts +6 -1
  77. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  78. package/dist/src/platforms/discord/token-extractor.js +27 -2
  79. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  80. package/dist/src/platforms/discord/types.d.ts +389 -22
  81. package/dist/src/platforms/discord/types.d.ts.map +1 -1
  82. package/dist/src/platforms/discord/types.js +46 -4
  83. package/dist/src/platforms/discord/types.js.map +1 -1
  84. package/dist/src/platforms/slack/cli.d.ts.map +1 -1
  85. package/dist/src/platforms/slack/cli.js +7 -2
  86. package/dist/src/platforms/slack/cli.js.map +1 -1
  87. package/dist/src/platforms/slack/client.d.ts +19 -1
  88. package/dist/src/platforms/slack/client.d.ts.map +1 -1
  89. package/dist/src/platforms/slack/client.js +134 -0
  90. package/dist/src/platforms/slack/client.js.map +1 -1
  91. package/dist/src/platforms/slack/commands/activity.d.ts +3 -0
  92. package/dist/src/platforms/slack/commands/activity.d.ts.map +1 -0
  93. package/dist/src/platforms/slack/commands/activity.js +40 -0
  94. package/dist/src/platforms/slack/commands/activity.js.map +1 -0
  95. package/dist/src/platforms/slack/commands/drafts.d.ts +3 -0
  96. package/dist/src/platforms/slack/commands/drafts.d.ts.map +1 -0
  97. package/dist/src/platforms/slack/commands/drafts.js +45 -0
  98. package/dist/src/platforms/slack/commands/drafts.js.map +1 -0
  99. package/dist/src/platforms/slack/commands/index.d.ts +5 -0
  100. package/dist/src/platforms/slack/commands/index.d.ts.map +1 -1
  101. package/dist/src/platforms/slack/commands/index.js +5 -0
  102. package/dist/src/platforms/slack/commands/index.js.map +1 -1
  103. package/dist/src/platforms/slack/commands/saved.d.ts +3 -0
  104. package/dist/src/platforms/slack/commands/saved.d.ts.map +1 -0
  105. package/dist/src/platforms/slack/commands/saved.js +54 -0
  106. package/dist/src/platforms/slack/commands/saved.js.map +1 -0
  107. package/dist/src/platforms/slack/commands/sections.d.ts +3 -0
  108. package/dist/src/platforms/slack/commands/sections.d.ts.map +1 -0
  109. package/dist/src/platforms/slack/commands/sections.js +37 -0
  110. package/dist/src/platforms/slack/commands/sections.js.map +1 -0
  111. package/dist/src/platforms/slack/commands/unread.d.ts +12 -0
  112. package/dist/src/platforms/slack/commands/unread.d.ts.map +1 -0
  113. package/dist/src/platforms/slack/commands/unread.js +89 -0
  114. package/dist/src/platforms/slack/commands/unread.js.map +1 -0
  115. package/dist/src/platforms/slack/credential-manager.d.ts.map +1 -1
  116. package/dist/src/platforms/slack/credential-manager.js +20 -6
  117. package/dist/src/platforms/slack/credential-manager.js.map +1 -1
  118. package/dist/src/platforms/slack/token-extractor.d.ts +8 -1
  119. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  120. package/dist/src/platforms/slack/token-extractor.js +83 -11
  121. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  122. package/dist/src/platforms/slack/types.d.ts +52 -0
  123. package/dist/src/platforms/slack/types.d.ts.map +1 -1
  124. package/dist/src/platforms/slack/types.js.map +1 -1
  125. package/dist/src/platforms/teams/cli.d.ts.map +1 -0
  126. package/dist/{cli.js → src/platforms/teams/cli.js} +11 -10
  127. package/dist/src/platforms/teams/cli.js.map +1 -0
  128. package/dist/src/platforms/teams/client.d.ts +32 -0
  129. package/dist/src/platforms/teams/client.d.ts.map +1 -0
  130. package/dist/src/platforms/teams/client.js +202 -0
  131. package/dist/src/platforms/teams/client.js.map +1 -0
  132. package/dist/src/platforms/teams/commands/auth.d.ts +14 -0
  133. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -0
  134. package/dist/src/platforms/teams/commands/auth.js +176 -0
  135. package/dist/src/platforms/teams/commands/auth.js.map +1 -0
  136. package/dist/src/platforms/teams/commands/channel.d.ts +13 -0
  137. package/dist/src/platforms/teams/commands/channel.d.ts.map +1 -0
  138. package/dist/src/platforms/teams/commands/channel.js +97 -0
  139. package/dist/src/platforms/teams/commands/channel.js.map +1 -0
  140. package/dist/src/platforms/teams/commands/file.d.ts +12 -0
  141. package/dist/src/platforms/teams/commands/file.d.ts.map +1 -0
  142. package/dist/src/platforms/teams/commands/file.js +104 -0
  143. package/dist/src/platforms/teams/commands/file.js.map +1 -0
  144. package/dist/{commands → src/platforms/teams/commands}/index.d.ts +5 -2
  145. package/dist/src/platforms/teams/commands/index.d.ts.map +1 -0
  146. package/dist/{commands → src/platforms/teams/commands}/index.js +5 -2
  147. package/dist/src/platforms/teams/commands/index.js.map +1 -0
  148. package/dist/src/platforms/teams/commands/message.d.ts +17 -0
  149. package/dist/src/platforms/teams/commands/message.d.ts.map +1 -0
  150. package/dist/src/platforms/teams/commands/message.js +133 -0
  151. package/dist/src/platforms/teams/commands/message.js.map +1 -0
  152. package/dist/src/platforms/teams/commands/reaction.d.ts +9 -0
  153. package/dist/src/platforms/teams/commands/reaction.d.ts.map +1 -0
  154. package/dist/src/platforms/teams/commands/reaction.js +68 -0
  155. package/dist/src/platforms/teams/commands/reaction.js.map +1 -0
  156. package/dist/src/platforms/teams/commands/snapshot.d.ts +10 -0
  157. package/dist/src/platforms/teams/commands/snapshot.d.ts.map +1 -0
  158. package/dist/src/platforms/teams/commands/snapshot.js +85 -0
  159. package/dist/src/platforms/teams/commands/snapshot.js.map +1 -0
  160. package/dist/src/platforms/teams/commands/team.d.ts +18 -0
  161. package/dist/src/platforms/teams/commands/team.d.ts.map +1 -0
  162. package/dist/src/platforms/teams/commands/team.js +130 -0
  163. package/dist/src/platforms/teams/commands/team.js.map +1 -0
  164. package/dist/src/platforms/teams/commands/user.d.ts.map +1 -0
  165. package/dist/src/platforms/teams/commands/user.js +88 -0
  166. package/dist/src/platforms/teams/commands/user.js.map +1 -0
  167. package/dist/src/platforms/teams/credential-manager.d.ts +18 -0
  168. package/dist/src/platforms/teams/credential-manager.d.ts.map +1 -0
  169. package/dist/src/platforms/teams/credential-manager.js +81 -0
  170. package/dist/src/platforms/teams/credential-manager.js.map +1 -0
  171. package/dist/src/platforms/teams/index.d.ts +4 -0
  172. package/dist/src/platforms/teams/index.d.ts.map +1 -0
  173. package/dist/src/platforms/teams/index.js +6 -0
  174. package/dist/src/platforms/teams/index.js.map +1 -0
  175. package/dist/src/platforms/teams/token-extractor.d.ts +41 -0
  176. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -0
  177. package/dist/src/platforms/teams/token-extractor.js +360 -0
  178. package/dist/src/platforms/teams/token-extractor.js.map +1 -0
  179. package/dist/src/platforms/teams/types.d.ts +209 -0
  180. package/dist/src/platforms/teams/types.d.ts.map +1 -0
  181. package/dist/src/platforms/teams/types.js +65 -0
  182. package/dist/src/platforms/teams/types.js.map +1 -0
  183. package/dist/src/shared/utils/derived-key-cache.d.ts +20 -0
  184. package/dist/src/shared/utils/derived-key-cache.d.ts.map +1 -0
  185. package/dist/src/shared/utils/derived-key-cache.js +52 -0
  186. package/dist/src/shared/utils/derived-key-cache.js.map +1 -0
  187. package/docs/README.md +113 -0
  188. package/docs/biome.json +8 -0
  189. package/docs/bun.lock +1426 -0
  190. package/docs/content/docs/agent-skills.mdx +98 -0
  191. package/docs/content/docs/index.mdx +124 -0
  192. package/docs/{discord.md → content/docs/integrations/discord.mdx} +46 -21
  193. package/docs/content/docs/integrations/meta.json +5 -0
  194. package/docs/{slack.md → content/docs/integrations/slack.mdx} +5 -4
  195. package/docs/content/docs/integrations/teams.mdx +322 -0
  196. package/docs/content/docs/meta.json +8 -0
  197. package/docs/content/docs/quick-start.mdx +103 -0
  198. package/docs/eslint.config.mjs +30 -0
  199. package/docs/next.config.ts +10 -0
  200. package/docs/package.json +42 -0
  201. package/docs/postcss.config.mjs +7 -0
  202. package/docs/public/file.svg +1 -0
  203. package/docs/public/globe.svg +1 -0
  204. package/docs/public/next.svg +1 -0
  205. package/docs/public/vercel.svg +1 -0
  206. package/docs/public/window.svg +1 -0
  207. package/docs/source.config.ts +11 -0
  208. package/docs/src/app/api/search/route.ts +4 -0
  209. package/docs/src/app/docs/[[...slug]]/page.tsx +53 -0
  210. package/docs/src/app/docs/layout.tsx +21 -0
  211. package/docs/src/app/globals.css +10 -0
  212. package/docs/src/app/icon.png +0 -0
  213. package/docs/src/app/layout.config.tsx +7 -0
  214. package/docs/src/app/layout.tsx +35 -0
  215. package/docs/src/app/page.tsx +489 -0
  216. package/docs/src/lib/source.ts +15 -0
  217. package/docs/src/mdx-components.tsx +18 -0
  218. package/docs/tsconfig.json +36 -0
  219. package/e2e/README.md +256 -0
  220. package/e2e/config.ts +51 -0
  221. package/e2e/discord.e2e.test.ts +252 -0
  222. package/e2e/helpers.ts +107 -0
  223. package/e2e/slack.e2e.test.ts +309 -0
  224. package/package.json +8 -4
  225. package/scripts/postbuild.ts +15 -0
  226. package/skills/agent-discord/SKILL.md +96 -30
  227. package/skills/agent-discord/references/authentication.md +27 -27
  228. package/skills/agent-discord/references/common-patterns.md +15 -15
  229. package/skills/agent-discord/templates/post-message.sh +6 -6
  230. package/skills/agent-discord/templates/{guild-summary.sh → server-summary.sh} +20 -20
  231. package/skills/agent-slack/SKILL.md +53 -0
  232. package/skills/agent-teams/SKILL.md +292 -0
  233. package/skills/agent-teams/references/authentication.md +375 -0
  234. package/skills/agent-teams/references/common-patterns.md +596 -0
  235. package/skills/agent-teams/templates/monitor-channel.sh +239 -0
  236. package/skills/agent-teams/templates/post-message.sh +224 -0
  237. package/skills/agent-teams/templates/team-summary.sh +210 -0
  238. package/src/cli.ts +4 -0
  239. package/src/platforms/discord/cli.ts +3 -3
  240. package/src/platforms/discord/client.test.ts +15 -15
  241. package/src/platforms/discord/client.ts +163 -17
  242. package/src/platforms/discord/commands/auth.test.ts +53 -37
  243. package/src/platforms/discord/commands/auth.ts +16 -16
  244. package/src/platforms/discord/commands/channel.test.ts +58 -46
  245. package/src/platforms/discord/commands/channel.ts +4 -4
  246. package/src/platforms/discord/commands/dm.test.ts +146 -0
  247. package/src/platforms/discord/commands/dm.ts +85 -0
  248. package/src/platforms/discord/commands/file.test.ts +40 -53
  249. package/src/platforms/discord/commands/friend.test.ts +134 -0
  250. package/src/platforms/discord/commands/friend.ts +45 -0
  251. package/src/platforms/discord/commands/index.ts +1 -1
  252. package/src/platforms/discord/commands/member.test.ts +98 -0
  253. package/src/platforms/discord/commands/member.ts +59 -0
  254. package/src/platforms/discord/commands/mention.test.ts +129 -0
  255. package/src/platforms/discord/commands/mention.ts +59 -0
  256. package/src/platforms/discord/commands/message.test.ts +139 -44
  257. package/src/platforms/discord/commands/message.ts +134 -1
  258. package/src/platforms/discord/commands/note.test.ts +84 -0
  259. package/src/platforms/discord/commands/note.ts +73 -0
  260. package/src/platforms/discord/commands/profile.test.ts +107 -0
  261. package/src/platforms/discord/commands/profile.ts +55 -0
  262. package/src/platforms/discord/commands/reaction.test.ts +54 -42
  263. package/src/platforms/discord/commands/server.test.ts +137 -0
  264. package/src/platforms/discord/commands/{guild.ts → server.ts} +31 -31
  265. package/src/platforms/discord/commands/snapshot.test.ts +1 -1
  266. package/src/platforms/discord/commands/snapshot.ts +10 -10
  267. package/src/platforms/discord/commands/thread.test.ts +121 -0
  268. package/src/platforms/discord/commands/thread.ts +92 -0
  269. package/src/platforms/discord/commands/user.test.ts +8 -8
  270. package/src/platforms/discord/commands/user.ts +16 -5
  271. package/src/platforms/discord/credential-manager.test.ts +137 -136
  272. package/src/platforms/discord/credential-manager.ts +35 -26
  273. package/src/platforms/discord/super-properties.ts +55 -0
  274. package/src/platforms/discord/token-extractor.test.ts +133 -383
  275. package/src/platforms/discord/token-extractor.ts +37 -3
  276. package/src/platforms/discord/types.test.ts +8 -8
  277. package/src/platforms/discord/types.ts +144 -8
  278. package/{tests → src/platforms/slack}/cli.test.ts +3 -3
  279. package/src/platforms/slack/cli.ts +10 -0
  280. package/{tests/slack-client.test.ts → src/platforms/slack/client.test.ts} +1 -1
  281. package/src/platforms/slack/client.ts +172 -1
  282. package/src/platforms/slack/commands/activity.test.ts +147 -0
  283. package/src/platforms/slack/commands/activity.ts +65 -0
  284. package/{tests → src/platforms/slack}/commands/auth.test.ts +25 -13
  285. package/{tests → src/platforms/slack}/commands/channel.test.ts +2 -2
  286. package/src/platforms/slack/commands/drafts.test.ts +136 -0
  287. package/src/platforms/slack/commands/drafts.ts +62 -0
  288. package/{tests → src/platforms/slack}/commands/file.test.ts +2 -2
  289. package/src/platforms/slack/commands/index.ts +5 -0
  290. package/{tests → src/platforms/slack}/commands/message.test.ts +2 -2
  291. package/{tests → src/platforms/slack}/commands/reaction.test.ts +1 -1
  292. package/src/platforms/slack/commands/saved.test.ts +140 -0
  293. package/src/platforms/slack/commands/saved.ts +71 -0
  294. package/src/platforms/slack/commands/sections.test.ts +80 -0
  295. package/src/platforms/slack/commands/sections.ts +50 -0
  296. package/{tests → src/platforms/slack}/commands/snapshot.test.ts +117 -105
  297. package/src/platforms/slack/commands/unread.test.ts +139 -0
  298. package/src/platforms/slack/commands/unread.ts +129 -0
  299. package/{tests → src/platforms/slack}/commands/user.test.ts +3 -3
  300. package/{tests → src/platforms/slack}/commands/workspace.test.ts +44 -95
  301. package/{tests → src/platforms/slack}/credential-manager.test.ts +2 -2
  302. package/src/platforms/slack/credential-manager.ts +22 -7
  303. package/src/platforms/slack/token-extractor-node-test.ts +40 -0
  304. package/src/platforms/slack/token-extractor-node.test.ts +10 -0
  305. package/src/platforms/slack/token-extractor.ts +93 -12
  306. package/{tests → src/platforms/slack}/types.test.ts +1 -1
  307. package/src/platforms/slack/types.ts +58 -0
  308. package/src/platforms/teams/cli.ts +36 -0
  309. package/src/platforms/teams/client.test.ts +500 -0
  310. package/src/platforms/teams/client.ts +365 -0
  311. package/src/platforms/teams/commands/auth.test.ts +99 -0
  312. package/src/platforms/teams/commands/auth.ts +232 -0
  313. package/src/platforms/teams/commands/channel.test.ts +147 -0
  314. package/src/platforms/teams/commands/channel.ts +129 -0
  315. package/src/platforms/teams/commands/file.test.ts +88 -0
  316. package/src/platforms/teams/commands/file.ts +144 -0
  317. package/src/platforms/teams/commands/index.ts +12 -0
  318. package/src/platforms/teams/commands/message.test.ts +110 -0
  319. package/src/platforms/teams/commands/message.ts +188 -0
  320. package/src/platforms/teams/commands/reaction.test.ts +87 -0
  321. package/src/platforms/teams/commands/reaction.ts +104 -0
  322. package/src/platforms/teams/commands/snapshot.test.ts +35 -0
  323. package/src/platforms/teams/commands/snapshot.ts +115 -0
  324. package/src/platforms/teams/commands/team.test.ts +157 -0
  325. package/src/platforms/teams/commands/team.ts +164 -0
  326. package/src/platforms/teams/commands/user.test.ts +83 -0
  327. package/src/platforms/teams/commands/user.ts +112 -0
  328. package/src/platforms/teams/credential-manager.test.ts +178 -0
  329. package/src/platforms/teams/credential-manager.ts +92 -0
  330. package/src/platforms/teams/index.ts +5 -0
  331. package/src/platforms/teams/token-extractor.test.ts +429 -0
  332. package/src/platforms/teams/token-extractor.ts +490 -0
  333. package/src/platforms/teams/types.test.ts +226 -0
  334. package/src/platforms/teams/types.ts +140 -0
  335. package/src/shared/utils/derived-key-cache.test.ts +136 -0
  336. package/src/shared/utils/derived-key-cache.ts +63 -0
  337. package/tsconfig.json +1 -1
  338. package/dist/cli.d.ts.map +0 -1
  339. package/dist/cli.js.map +0 -1
  340. package/dist/commands/auth.d.ts +0 -3
  341. package/dist/commands/auth.d.ts.map +0 -1
  342. package/dist/commands/auth.js +0 -140
  343. package/dist/commands/auth.js.map +0 -1
  344. package/dist/commands/channel.d.ts +0 -3
  345. package/dist/commands/channel.d.ts.map +0 -1
  346. package/dist/commands/channel.js +0 -118
  347. package/dist/commands/channel.js.map +0 -1
  348. package/dist/commands/file.d.ts +0 -3
  349. package/dist/commands/file.d.ts.map +0 -1
  350. package/dist/commands/file.js +0 -113
  351. package/dist/commands/file.js.map +0 -1
  352. package/dist/commands/index.d.ts.map +0 -1
  353. package/dist/commands/index.js.map +0 -1
  354. package/dist/commands/message.d.ts +0 -3
  355. package/dist/commands/message.d.ts.map +0 -1
  356. package/dist/commands/message.js +0 -214
  357. package/dist/commands/message.js.map +0 -1
  358. package/dist/commands/reaction.d.ts +0 -3
  359. package/dist/commands/reaction.d.ts.map +0 -1
  360. package/dist/commands/reaction.js +0 -100
  361. package/dist/commands/reaction.js.map +0 -1
  362. package/dist/commands/snapshot.d.ts +0 -3
  363. package/dist/commands/snapshot.d.ts.map +0 -1
  364. package/dist/commands/snapshot.js +0 -88
  365. package/dist/commands/snapshot.js.map +0 -1
  366. package/dist/commands/user.d.ts.map +0 -1
  367. package/dist/commands/user.js +0 -96
  368. package/dist/commands/user.js.map +0 -1
  369. package/dist/commands/workspace.d.ts +0 -3
  370. package/dist/commands/workspace.d.ts.map +0 -1
  371. package/dist/commands/workspace.js +0 -89
  372. package/dist/commands/workspace.js.map +0 -1
  373. package/dist/lib/credential-manager.d.ts +0 -13
  374. package/dist/lib/credential-manager.d.ts.map +0 -1
  375. package/dist/lib/credential-manager.js +0 -58
  376. package/dist/lib/credential-manager.js.map +0 -1
  377. package/dist/lib/index.d.ts +0 -3
  378. package/dist/lib/index.d.ts.map +0 -1
  379. package/dist/lib/index.js +0 -3
  380. package/dist/lib/index.js.map +0 -1
  381. package/dist/lib/ref-manager.d.ts +0 -26
  382. package/dist/lib/ref-manager.d.ts.map +0 -1
  383. package/dist/lib/ref-manager.js +0 -92
  384. package/dist/lib/ref-manager.js.map +0 -1
  385. package/dist/lib/slack-client.d.ts +0 -37
  386. package/dist/lib/slack-client.d.ts.map +0 -1
  387. package/dist/lib/slack-client.js +0 -379
  388. package/dist/lib/slack-client.js.map +0 -1
  389. package/dist/lib/token-extractor.d.ts +0 -28
  390. package/dist/lib/token-extractor.d.ts.map +0 -1
  391. package/dist/lib/token-extractor.js +0 -401
  392. package/dist/lib/token-extractor.js.map +0 -1
  393. package/dist/src/platforms/discord/client.test.d.ts +0 -2
  394. package/dist/src/platforms/discord/client.test.d.ts.map +0 -1
  395. package/dist/src/platforms/discord/client.test.js +0 -367
  396. package/dist/src/platforms/discord/client.test.js.map +0 -1
  397. package/dist/src/platforms/discord/commands/auth.test.d.ts +0 -2
  398. package/dist/src/platforms/discord/commands/auth.test.d.ts.map +0 -1
  399. package/dist/src/platforms/discord/commands/auth.test.js +0 -65
  400. package/dist/src/platforms/discord/commands/auth.test.js.map +0 -1
  401. package/dist/src/platforms/discord/commands/channel.test.d.ts +0 -2
  402. package/dist/src/platforms/discord/commands/channel.test.d.ts.map +0 -1
  403. package/dist/src/platforms/discord/commands/channel.test.js +0 -136
  404. package/dist/src/platforms/discord/commands/channel.test.js.map +0 -1
  405. package/dist/src/platforms/discord/commands/file.test.d.ts +0 -2
  406. package/dist/src/platforms/discord/commands/file.test.d.ts.map +0 -1
  407. package/dist/src/platforms/discord/commands/file.test.js +0 -83
  408. package/dist/src/platforms/discord/commands/file.test.js.map +0 -1
  409. package/dist/src/platforms/discord/commands/guild.test.d.ts +0 -2
  410. package/dist/src/platforms/discord/commands/guild.test.d.ts.map +0 -1
  411. package/dist/src/platforms/discord/commands/guild.test.js +0 -100
  412. package/dist/src/platforms/discord/commands/guild.test.js.map +0 -1
  413. package/dist/src/platforms/discord/commands/message.test.d.ts +0 -2
  414. package/dist/src/platforms/discord/commands/message.test.d.ts.map +0 -1
  415. package/dist/src/platforms/discord/commands/message.test.js +0 -91
  416. package/dist/src/platforms/discord/commands/message.test.js.map +0 -1
  417. package/dist/src/platforms/discord/commands/reaction.test.d.ts +0 -2
  418. package/dist/src/platforms/discord/commands/reaction.test.d.ts.map +0 -1
  419. package/dist/src/platforms/discord/commands/reaction.test.js +0 -115
  420. package/dist/src/platforms/discord/commands/reaction.test.js.map +0 -1
  421. package/dist/src/platforms/discord/commands/snapshot.test.d.ts +0 -2
  422. package/dist/src/platforms/discord/commands/snapshot.test.d.ts.map +0 -1
  423. package/dist/src/platforms/discord/commands/snapshot.test.js +0 -25
  424. package/dist/src/platforms/discord/commands/snapshot.test.js.map +0 -1
  425. package/dist/src/platforms/discord/commands/user.test.d.ts +0 -2
  426. package/dist/src/platforms/discord/commands/user.test.d.ts.map +0 -1
  427. package/dist/src/platforms/discord/commands/user.test.js +0 -103
  428. package/dist/src/platforms/discord/commands/user.test.js.map +0 -1
  429. package/dist/src/platforms/discord/credential-manager.test.d.ts +0 -2
  430. package/dist/src/platforms/discord/credential-manager.test.d.ts.map +0 -1
  431. package/dist/src/platforms/discord/credential-manager.test.js +0 -136
  432. package/dist/src/platforms/discord/credential-manager.test.js.map +0 -1
  433. package/dist/src/platforms/discord/token-extractor.test.d.ts +0 -2
  434. package/dist/src/platforms/discord/token-extractor.test.d.ts.map +0 -1
  435. package/dist/src/platforms/discord/token-extractor.test.js +0 -789
  436. package/dist/src/platforms/discord/token-extractor.test.js.map +0 -1
  437. package/dist/src/platforms/discord/types.test.d.ts +0 -2
  438. package/dist/src/platforms/discord/types.test.d.ts.map +0 -1
  439. package/dist/src/platforms/discord/types.test.js +0 -211
  440. package/dist/src/platforms/discord/types.test.js.map +0 -1
  441. package/dist/src/shared/utils/concurrency.test.d.ts +0 -2
  442. package/dist/src/shared/utils/concurrency.test.d.ts.map +0 -1
  443. package/dist/src/shared/utils/concurrency.test.js +0 -39
  444. package/dist/src/shared/utils/concurrency.test.js.map +0 -1
  445. package/dist/tests/cli.test.d.ts +0 -2
  446. package/dist/tests/cli.test.d.ts.map +0 -1
  447. package/dist/tests/cli.test.js +0 -83
  448. package/dist/tests/cli.test.js.map +0 -1
  449. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/CURRENT +0 -1
  450. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOCK +0 -0
  451. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG +0 -3
  452. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/LOG.old +0 -1
  453. package/dist/tests/commands/.test-slack-data/Local Storage/leveldb/MANIFEST-000004 +0 -0
  454. package/dist/tests/commands/auth.test.d.ts +0 -2
  455. package/dist/tests/commands/auth.test.d.ts.map +0 -1
  456. package/dist/tests/commands/auth.test.js +0 -304
  457. package/dist/tests/commands/auth.test.js.map +0 -1
  458. package/dist/tests/commands/channel.test.d.ts +0 -2
  459. package/dist/tests/commands/channel.test.d.ts.map +0 -1
  460. package/dist/tests/commands/channel.test.js +0 -166
  461. package/dist/tests/commands/channel.test.js.map +0 -1
  462. package/dist/tests/commands/file.test.d.ts +0 -2
  463. package/dist/tests/commands/file.test.d.ts.map +0 -1
  464. package/dist/tests/commands/file.test.js +0 -175
  465. package/dist/tests/commands/file.test.js.map +0 -1
  466. package/dist/tests/commands/message.test.d.ts +0 -2
  467. package/dist/tests/commands/message.test.d.ts.map +0 -1
  468. package/dist/tests/commands/message.test.js +0 -293
  469. package/dist/tests/commands/message.test.js.map +0 -1
  470. package/dist/tests/commands/reaction.test.d.ts +0 -2
  471. package/dist/tests/commands/reaction.test.d.ts.map +0 -1
  472. package/dist/tests/commands/reaction.test.js +0 -84
  473. package/dist/tests/commands/reaction.test.js.map +0 -1
  474. package/dist/tests/commands/snapshot.test.d.ts +0 -2
  475. package/dist/tests/commands/snapshot.test.d.ts.map +0 -1
  476. package/dist/tests/commands/snapshot.test.js +0 -280
  477. package/dist/tests/commands/snapshot.test.js.map +0 -1
  478. package/dist/tests/commands/user.test.d.ts +0 -2
  479. package/dist/tests/commands/user.test.d.ts.map +0 -1
  480. package/dist/tests/commands/user.test.js +0 -117
  481. package/dist/tests/commands/user.test.js.map +0 -1
  482. package/dist/tests/commands/workspace.test.d.ts +0 -2
  483. package/dist/tests/commands/workspace.test.d.ts.map +0 -1
  484. package/dist/tests/commands/workspace.test.js +0 -453
  485. package/dist/tests/commands/workspace.test.js.map +0 -1
  486. package/dist/tests/credential-manager.test.d.ts +0 -2
  487. package/dist/tests/credential-manager.test.d.ts.map +0 -1
  488. package/dist/tests/credential-manager.test.js +0 -199
  489. package/dist/tests/credential-manager.test.js.map +0 -1
  490. package/dist/tests/slack-client.test.d.ts +0 -2
  491. package/dist/tests/slack-client.test.d.ts.map +0 -1
  492. package/dist/tests/slack-client.test.js +0 -741
  493. package/dist/tests/slack-client.test.js.map +0 -1
  494. package/dist/tests/types.test.d.ts +0 -2
  495. package/dist/tests/types.test.d.ts.map +0 -1
  496. package/dist/tests/types.test.js +0 -215
  497. package/dist/tests/types.test.js.map +0 -1
  498. package/dist/types/index.d.ts +0 -369
  499. package/dist/types/index.d.ts.map +0 -1
  500. package/dist/types/index.js +0 -92
  501. package/dist/types/index.js.map +0 -1
  502. package/dist/utils/error-handler.d.ts +0 -2
  503. package/dist/utils/error-handler.d.ts.map +0 -1
  504. package/dist/utils/error-handler.js +0 -5
  505. package/dist/utils/error-handler.js.map +0 -1
  506. package/dist/utils/output.d.ts +0 -2
  507. package/dist/utils/output.d.ts.map +0 -1
  508. package/dist/utils/output.js +0 -4
  509. package/dist/utils/output.js.map +0 -1
  510. package/src/platforms/discord/commands/guild.test.ts +0 -117
  511. /package/dist/{cli.d.ts → src/platforms/teams/cli.d.ts} +0 -0
  512. /package/dist/{commands → src/platforms/teams/commands}/user.d.ts +0 -0
@@ -6,9 +6,9 @@ import {
6
6
  authCommand,
7
7
  channelCommand,
8
8
  fileCommand,
9
- guildCommand,
10
9
  messageCommand,
11
10
  reactionCommand,
11
+ serverCommand,
12
12
  snapshotCommand,
13
13
  userCommand,
14
14
  } from './commands'
@@ -20,10 +20,10 @@ program
20
20
  .description('CLI tool for Discord communication')
21
21
  .version(pkg.version)
22
22
  .option('--pretty', 'Pretty-print JSON output')
23
- .option('--guild <id>', 'Use specific guild')
23
+ .option('--server <id>', 'Use specific server')
24
24
 
25
25
  program.addCommand(authCommand)
26
- program.addCommand(guildCommand)
26
+ program.addCommand(serverCommand)
27
27
  program.addCommand(channelCommand)
28
28
  program.addCommand(fileCommand)
29
29
  program.addCommand(messageCommand)
@@ -90,37 +90,37 @@ describe('DiscordClient', () => {
90
90
  })
91
91
  })
92
92
 
93
- describe('listGuilds', () => {
94
- test('returns list of guilds', async () => {
93
+ describe('listServers', () => {
94
+ test('returns list of servers', async () => {
95
95
  mockResponse([
96
- { id: '111', name: 'Guild One' },
97
- { id: '222', name: 'Guild Two' },
96
+ { id: '111', name: 'Server One' },
97
+ { id: '222', name: 'Server Two' },
98
98
  ])
99
99
 
100
100
  const client = new DiscordClient('test-token')
101
- const guilds = await client.listGuilds()
101
+ const servers = await client.listServers()
102
102
 
103
- expect(guilds).toHaveLength(2)
104
- expect(guilds[0].name).toBe('Guild One')
103
+ expect(servers).toHaveLength(2)
104
+ expect(servers[0].name).toBe('Server One')
105
105
  expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/users/@me/guilds')
106
106
  })
107
107
  })
108
108
 
109
- describe('getGuild', () => {
110
- test('returns guild info', async () => {
111
- mockResponse({ id: '111', name: 'Test Guild' })
109
+ describe('getServer', () => {
110
+ test('returns server info', async () => {
111
+ mockResponse({ id: '111', name: 'Test Server' })
112
112
 
113
113
  const client = new DiscordClient('test-token')
114
- const guild = await client.getGuild('111')
114
+ const server = await client.getServer('111')
115
115
 
116
- expect(guild.id).toBe('111')
117
- expect(guild.name).toBe('Test Guild')
116
+ expect(server.id).toBe('111')
117
+ expect(server.name).toBe('Test Server')
118
118
  expect(fetchCalls[0].url).toBe('https://discord.com/api/v10/guilds/111')
119
119
  })
120
120
  })
121
121
 
122
122
  describe('listChannels', () => {
123
- test('returns list of channels for guild', async () => {
123
+ test('returns list of channels for server', async () => {
124
124
  mockResponse([
125
125
  { id: 'ch1', guild_id: '111', name: 'general', type: 0 },
126
126
  { id: 'ch2', guild_id: '111', name: 'random', type: 0 },
@@ -257,7 +257,7 @@ describe('DiscordClient', () => {
257
257
  })
258
258
 
259
259
  describe('listUsers', () => {
260
- test('returns list of guild members', async () => {
260
+ test('returns list of server members', async () => {
261
261
  mockResponse([
262
262
  { user: { id: 'u1', username: 'user1' } },
263
263
  { user: { id: 'u2', username: 'user2' } },
@@ -1,9 +1,20 @@
1
+ import { readFile } from 'node:fs/promises'
2
+ import { getDiscordHeaders } from './super-properties'
1
3
  import type {
2
4
  DiscordChannel,
5
+ DiscordDMChannel,
3
6
  DiscordFile,
4
7
  DiscordGuild,
8
+ DiscordGuildMember,
9
+ DiscordMention,
5
10
  DiscordMessage,
11
+ DiscordRelationship,
12
+ DiscordSearchOptions,
13
+ DiscordSearchResponse,
14
+ DiscordSearchResult,
6
15
  DiscordUser,
16
+ DiscordUserNote,
17
+ DiscordUserProfile,
7
18
  } from './types'
8
19
 
9
20
  export class DiscordError extends Error {
@@ -99,10 +110,7 @@ export class DiscordClient {
99
110
  for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
100
111
  await this.waitForRateLimit(bucketKey)
101
112
 
102
- const headers: Record<string, string> = {
103
- Authorization: this.token,
104
- 'Content-Type': 'application/json',
105
- }
113
+ const headers: Record<string, string> = getDiscordHeaders(this.token)
106
114
 
107
115
  const options: RequestInit = {
108
116
  method,
@@ -110,6 +118,7 @@ export class DiscordClient {
110
118
  }
111
119
 
112
120
  if (body !== undefined) {
121
+ headers['Content-Type'] = 'application/json'
113
122
  options.body = JSON.stringify(body)
114
123
  }
115
124
 
@@ -154,11 +163,10 @@ export class DiscordClient {
154
163
 
155
164
  await this.waitForRateLimit(bucketKey)
156
165
 
166
+ const headers = getDiscordHeaders(this.token)
157
167
  const response = await fetch(url, {
158
168
  method: 'POST',
159
- headers: {
160
- Authorization: this.token,
161
- },
169
+ headers,
162
170
  body: formData,
163
171
  })
164
172
 
@@ -179,16 +187,16 @@ export class DiscordClient {
179
187
  return this.request<DiscordUser>('GET', '/users/@me')
180
188
  }
181
189
 
182
- async listGuilds(): Promise<DiscordGuild[]> {
190
+ async listServers(): Promise<DiscordGuild[]> {
183
191
  return this.request<DiscordGuild[]>('GET', '/users/@me/guilds')
184
192
  }
185
193
 
186
- async getGuild(guildId: string): Promise<DiscordGuild> {
187
- return this.request<DiscordGuild>('GET', `/guilds/${guildId}`)
194
+ async getServer(serverId: string): Promise<DiscordGuild> {
195
+ return this.request<DiscordGuild>('GET', `/guilds/${serverId}`)
188
196
  }
189
197
 
190
- async listChannels(guildId: string): Promise<DiscordChannel[]> {
191
- return this.request<DiscordChannel[]>('GET', `/guilds/${guildId}/channels`)
198
+ async listChannels(serverId: string): Promise<DiscordChannel[]> {
199
+ return this.request<DiscordChannel[]>('GET', `/guilds/${serverId}/channels`)
192
200
  }
193
201
 
194
202
  async getChannel(channelId: string): Promise<DiscordChannel> {
@@ -227,13 +235,19 @@ export class DiscordClient {
227
235
  )
228
236
  }
229
237
 
230
- async listUsers(guildId: string): Promise<DiscordUser[]> {
238
+ async ackMessage(channelId: string, messageId: string): Promise<void> {
239
+ return this.request<void>('POST', `/channels/${channelId}/messages/${messageId}/ack`, {
240
+ token: null,
241
+ })
242
+ }
243
+
244
+ async listUsers(serverId: string): Promise<DiscordUser[]> {
231
245
  interface GuildMember {
232
246
  user: DiscordUser
233
247
  }
234
248
  const members = await this.request<GuildMember[]>(
235
249
  'GET',
236
- `/guilds/${guildId}/members?limit=1000`
250
+ `/guilds/${serverId}/members?limit=1000`
237
251
  )
238
252
  return members.map((m) => m.user)
239
253
  }
@@ -243,12 +257,11 @@ export class DiscordClient {
243
257
  }
244
258
 
245
259
  async uploadFile(channelId: string, filePath: string): Promise<DiscordFile> {
246
- const file = Bun.file(filePath)
260
+ const fileBuffer = await readFile(filePath)
247
261
  const filename = filePath.split('/').pop() || 'file'
248
- const blob = await file.arrayBuffer()
249
262
 
250
263
  const formData = new FormData()
251
- formData.append('files[0]', new Blob([blob]), filename)
264
+ formData.append('files[0]', new Blob([fileBuffer]), filename)
252
265
 
253
266
  interface MessageWithAttachments extends DiscordMessage {
254
267
  attachments: DiscordFile[]
@@ -278,4 +291,137 @@ export class DiscordClient {
278
291
  }
279
292
  return files
280
293
  }
294
+
295
+ async listDMChannels(): Promise<DiscordDMChannel[]> {
296
+ return this.request<DiscordDMChannel[]>('GET', '/users/@me/channels')
297
+ }
298
+
299
+ async createDM(userId: string): Promise<DiscordDMChannel> {
300
+ return this.request<DiscordDMChannel>('POST', '/users/@me/channels', {
301
+ recipient_id: userId,
302
+ })
303
+ }
304
+
305
+ async getMentions(options?: { limit?: number; guildId?: string }): Promise<DiscordMention[]> {
306
+ const params = new URLSearchParams()
307
+ params.set('limit', (options?.limit ?? 25).toString())
308
+ params.set('roles', 'true')
309
+ params.set('everyone', 'true')
310
+
311
+ if (options?.guildId) {
312
+ params.set('guild_id', options.guildId)
313
+ }
314
+
315
+ return this.request<DiscordMention[]>('GET', `/users/@me/mentions?${params.toString()}`)
316
+ }
317
+
318
+ async getUserNote(userId: string): Promise<DiscordUserNote | null> {
319
+ try {
320
+ return await this.request<DiscordUserNote>('GET', `/users/@me/notes/${userId}`)
321
+ } catch (error) {
322
+ if (error instanceof DiscordError && error.code === 'http_404') {
323
+ return null
324
+ }
325
+ throw error
326
+ }
327
+ }
328
+
329
+ async setUserNote(userId: string, note: string): Promise<DiscordUserNote> {
330
+ return this.request<DiscordUserNote>('PUT', `/users/@me/notes/${userId}`, { note })
331
+ }
332
+
333
+ async getRelationships(): Promise<DiscordRelationship[]> {
334
+ return this.request<DiscordRelationship[]>('GET', '/users/@me/relationships')
335
+ }
336
+
337
+ async searchMembers(
338
+ guildId: string,
339
+ query: string,
340
+ limit: number = 10
341
+ ): Promise<DiscordGuildMember[]> {
342
+ const params = new URLSearchParams()
343
+ params.set('query', query)
344
+ params.set('limit', limit.toString())
345
+
346
+ return this.request<DiscordGuildMember[]>(
347
+ 'GET',
348
+ `/guilds/${guildId}/members/search?${params.toString()}`
349
+ )
350
+ }
351
+
352
+ async searchMessages(
353
+ guildId: string,
354
+ query: string,
355
+ options: DiscordSearchOptions = {}
356
+ ): Promise<{ results: DiscordSearchResult[]; total: number }> {
357
+ const params = new URLSearchParams()
358
+ params.set('content', query)
359
+
360
+ if (options.channelId) {
361
+ params.set('channel_id', options.channelId)
362
+ }
363
+ if (options.authorId) {
364
+ params.set('author_id', options.authorId)
365
+ }
366
+ if (options.has) {
367
+ params.set('has', options.has)
368
+ }
369
+ if (options.sortBy) {
370
+ params.set('sort_by', options.sortBy)
371
+ }
372
+ if (options.sortOrder) {
373
+ params.set('sort_order', options.sortOrder)
374
+ }
375
+ if (options.limit !== undefined) {
376
+ params.set('limit', Math.max(1, Math.min(options.limit, 25)).toString())
377
+ }
378
+ if (options.offset !== undefined) {
379
+ params.set('offset', options.offset.toString())
380
+ }
381
+
382
+ const response = await this.request<DiscordSearchResponse>(
383
+ 'GET',
384
+ `/guilds/${guildId}/messages/search?${params.toString()}`
385
+ )
386
+
387
+ const results = response.messages
388
+ .flat()
389
+ .filter((msg) => msg.hit)
390
+ .map((msg) => ({
391
+ id: msg.id,
392
+ channel_id: msg.channel_id,
393
+ guild_id: msg.guild_id,
394
+ content: msg.content,
395
+ author: msg.author,
396
+ timestamp: msg.timestamp,
397
+ hit: msg.hit,
398
+ }))
399
+
400
+ return {
401
+ results,
402
+ total: response.total_results,
403
+ }
404
+ }
405
+
406
+ async getUserProfile(userId: string): Promise<DiscordUserProfile> {
407
+ return this.request<DiscordUserProfile>('GET', `/users/${userId}/profile`)
408
+ }
409
+
410
+ async createThread(
411
+ channelId: string,
412
+ name: string,
413
+ options?: {
414
+ auto_archive_duration?: number
415
+ rate_limit_per_user?: number
416
+ }
417
+ ): Promise<DiscordChannel> {
418
+ return this.request<DiscordChannel>('POST', `/channels/${channelId}/threads`, {
419
+ name,
420
+ ...options,
421
+ })
422
+ }
423
+
424
+ async archiveThread(threadId: string, archived: boolean = true): Promise<DiscordChannel> {
425
+ return this.request<DiscordChannel>('PATCH', `/channels/${threadId}`, { archived })
426
+ }
281
427
  }
@@ -1,41 +1,57 @@
1
- import { expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
2
2
  import { DiscordClient } from '../client'
3
3
  import { DiscordCredentialManager } from '../credential-manager'
4
4
  import { DiscordTokenExtractor } from '../token-extractor'
5
5
 
6
- // Mock modules
7
- mock.module('../token-extractor', () => ({
8
- DiscordTokenExtractor: mock(() => ({
9
- extract: mock(async () => ({
10
- token: 'test-token-123',
11
- })),
12
- })),
13
- }))
6
+ let extractorExtractSpy: ReturnType<typeof spyOn>
7
+ let clientTestAuthSpy: ReturnType<typeof spyOn>
8
+ let clientListServersSpy: ReturnType<typeof spyOn>
9
+ let credManagerLoadSpy: ReturnType<typeof spyOn>
10
+ let credManagerSaveSpy: ReturnType<typeof spyOn>
11
+ let credManagerClearTokenSpy: ReturnType<typeof spyOn>
14
12
 
15
- mock.module('../client', () => ({
16
- DiscordClient: mock((_token: string) => ({
17
- testAuth: mock(async () => ({
18
- id: 'user-123',
19
- username: 'testuser',
20
- })),
21
- listGuilds: mock(async () => [
22
- { id: 'guild-1', name: 'Guild One' },
23
- { id: 'guild-2', name: 'Guild Two' },
24
- ]),
25
- })),
26
- }))
13
+ beforeEach(() => {
14
+ // Spy on DiscordTokenExtractor.prototype.extract
15
+ extractorExtractSpy = spyOn(DiscordTokenExtractor.prototype, 'extract').mockResolvedValue({
16
+ token: 'test-token-123',
17
+ })
27
18
 
28
- mock.module('../credential-manager', () => ({
29
- DiscordCredentialManager: mock(() => ({
30
- load: mock(async () => ({
31
- token: null,
32
- current_guild: null,
33
- guilds: {},
34
- })),
35
- save: mock(async () => {}),
36
- clearToken: mock(async () => {}),
37
- })),
38
- }))
19
+ // Spy on DiscordClient.prototype methods
20
+ clientTestAuthSpy = spyOn(DiscordClient.prototype, 'testAuth').mockResolvedValue({
21
+ id: 'user-123',
22
+ username: 'testuser',
23
+ })
24
+
25
+ clientListServersSpy = spyOn(DiscordClient.prototype, 'listServers').mockResolvedValue([
26
+ { id: 'server-1', name: 'Server One' },
27
+ { id: 'server-2', name: 'Server Two' },
28
+ ])
29
+
30
+ // Spy on DiscordCredentialManager.prototype methods
31
+ credManagerLoadSpy = spyOn(DiscordCredentialManager.prototype, 'load').mockResolvedValue({
32
+ token: null,
33
+ current_server: null,
34
+ servers: {},
35
+ })
36
+
37
+ credManagerSaveSpy = spyOn(DiscordCredentialManager.prototype, 'save').mockResolvedValue(
38
+ undefined
39
+ )
40
+
41
+ credManagerClearTokenSpy = spyOn(
42
+ DiscordCredentialManager.prototype,
43
+ 'clearToken'
44
+ ).mockResolvedValue(undefined)
45
+ })
46
+
47
+ afterEach(() => {
48
+ extractorExtractSpy?.mockRestore()
49
+ clientTestAuthSpy?.mockRestore()
50
+ clientListServersSpy?.mockRestore()
51
+ credManagerLoadSpy?.mockRestore()
52
+ credManagerSaveSpy?.mockRestore()
53
+ credManagerClearTokenSpy?.mockRestore()
54
+ })
39
55
 
40
56
  test('extract: calls DiscordTokenExtractor', async () => {
41
57
  const extractor = new DiscordTokenExtractor()
@@ -51,11 +67,11 @@ test('extract: validates token with DiscordClient', async () => {
51
67
  expect(authInfo.id).toBe('user-123')
52
68
  })
53
69
 
54
- test('extract: discovers guilds', async () => {
70
+ test('extract: discovers servers', async () => {
55
71
  const client = new DiscordClient('test-token-123')
56
- const guilds = await client.listGuilds()
57
- expect(guilds).toHaveLength(2)
58
- expect(guilds[0].id).toBe('guild-1')
72
+ const servers = await client.listServers()
73
+ expect(servers).toHaveLength(2)
74
+ expect(servers[0].id).toBe('server-1')
59
75
  })
60
76
 
61
77
  test('logout: clears credentials', async () => {
@@ -68,5 +84,5 @@ test('status: returns auth state', async () => {
68
84
  const credManager = new DiscordCredentialManager()
69
85
  const config = await credManager.load()
70
86
  expect(config.token).toBeNull()
71
- expect(config.current_guild).toBeNull()
87
+ expect(config.current_server).toBeNull()
72
88
  })
@@ -61,20 +61,20 @@ export async function extractAction(options: { pretty?: boolean; debug?: boolean
61
61
 
62
62
  if (options.debug) {
63
63
  console.error(`[debug] ✓ Token valid for user: ${authInfo.username}`)
64
- console.error(`[debug] Discovering guilds...`)
64
+ console.error(`[debug] Discovering servers...`)
65
65
  }
66
66
 
67
- const guilds = await client.listGuilds()
67
+ const servers = await client.listServers()
68
68
 
69
69
  if (options.debug) {
70
- console.error(`[debug] ✓ Found ${guilds.length} guild(s)`)
70
+ console.error(`[debug] ✓ Found ${servers.length} server(s)`)
71
71
  }
72
72
 
73
- if (guilds.length === 0) {
73
+ if (servers.length === 0) {
74
74
  console.log(
75
75
  formatOutput(
76
76
  {
77
- error: 'No guilds found. Make sure you are a member of at least one Discord server.',
77
+ error: 'No servers found. Make sure you are a member of at least one Discord server.',
78
78
  },
79
79
  options.pretty
80
80
  )
@@ -83,19 +83,19 @@ export async function extractAction(options: { pretty?: boolean; debug?: boolean
83
83
  }
84
84
 
85
85
  const credManager = new DiscordCredentialManager()
86
- const guildMap: Record<string, { guild_id: string; guild_name: string }> = {}
86
+ const serverMap: Record<string, { server_id: string; server_name: string }> = {}
87
87
 
88
- for (const guild of guilds) {
89
- guildMap[guild.id] = {
90
- guild_id: guild.id,
91
- guild_name: guild.name,
88
+ for (const server of servers) {
89
+ serverMap[server.id] = {
90
+ server_id: server.id,
91
+ server_name: server.name,
92
92
  }
93
93
  }
94
94
 
95
95
  const config = {
96
96
  token: extracted.token,
97
- current_guild: guilds[0].id,
98
- guilds: guildMap,
97
+ current_server: servers[0].id,
98
+ servers: serverMap,
99
99
  }
100
100
 
101
101
  await credManager.save(config)
@@ -105,8 +105,8 @@ export async function extractAction(options: { pretty?: boolean; debug?: boolean
105
105
  }
106
106
 
107
107
  const output = {
108
- guilds: guilds.map((g) => `${g.id}/${g.name}`),
109
- current: guilds[0].id,
108
+ servers: servers.map((g) => `${g.id}/${g.name}`),
109
+ current: servers[0].id,
110
110
  }
111
111
 
112
112
  console.log(formatOutput(output, options.pretty))
@@ -173,8 +173,8 @@ export async function statusAction(options: { pretty?: boolean }): Promise<void>
173
173
  const output = {
174
174
  authenticated: valid,
175
175
  user: authInfo?.username,
176
- current_guild: config.current_guild,
177
- guilds_count: Object.keys(config.guilds).length,
176
+ current_server: config.current_server,
177
+ servers_count: Object.keys(config.servers).length,
178
178
  }
179
179
 
180
180
  console.log(formatOutput(output, options.pretty))
@@ -1,15 +1,22 @@
1
- import { expect, mock, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
2
2
  import { DiscordClient } from '../client'
3
-
4
- // Mock modules
5
- mock.module('../client', () => ({
6
- DiscordClient: mock((_token: string) => ({
7
- listChannels: mock(async (guildId: string) => [
8
- { id: 'ch-1', guild_id: guildId, name: 'general', type: 0, topic: 'General discussion' },
9
- { id: 'ch-2', guild_id: guildId, name: 'announcements', type: 0, topic: 'Announcements' },
10
- { id: 'ch-3', guild_id: guildId, name: 'voice-channel', type: 2, topic: null },
11
- ]),
12
- getChannel: mock(async (channelId: string) => {
3
+ import { DiscordCredentialManager } from '../credential-manager'
4
+
5
+ let clientListChannelsSpy: ReturnType<typeof spyOn>
6
+ let clientGetChannelSpy: ReturnType<typeof spyOn>
7
+ let clientGetMessagesSpy: ReturnType<typeof spyOn>
8
+ let credManagerLoadSpy: ReturnType<typeof spyOn>
9
+
10
+ beforeEach(() => {
11
+ // Spy on DiscordClient.prototype methods
12
+ clientListChannelsSpy = spyOn(DiscordClient.prototype, 'listChannels').mockResolvedValue([
13
+ { id: 'ch-1', guild_id: 'guild-1', name: 'general', type: 0, topic: 'General discussion' },
14
+ { id: 'ch-2', guild_id: 'guild-1', name: 'announcements', type: 0, topic: 'Announcements' },
15
+ { id: 'ch-3', guild_id: 'guild-1', name: 'voice-channel', type: 2, topic: undefined },
16
+ ])
17
+
18
+ clientGetChannelSpy = spyOn(DiscordClient.prototype, 'getChannel').mockImplementation(
19
+ async (channelId: string) => {
13
20
  if (channelId === 'ch-1') {
14
21
  return {
15
22
  id: 'ch-1',
@@ -29,42 +36,47 @@ mock.module('../client', () => ({
29
36
  }
30
37
  }
31
38
  throw new Error('Channel not found')
32
- }),
33
- getMessages: mock(async (channelId: string, _limit: number) => [
34
- {
35
- id: 'msg-1',
36
- channel_id: channelId,
37
- author: { id: 'user-1', username: 'alice' },
38
- content: 'Hello world',
39
- timestamp: '2024-01-29T10:00:00Z',
40
- },
41
- {
42
- id: 'msg-2',
43
- channel_id: channelId,
44
- author: { id: 'user-2', username: 'bob' },
45
- content: 'Hi there',
46
- timestamp: '2024-01-29T09:00:00Z',
47
- },
48
- ]),
49
- })),
50
- }))
51
-
52
- mock.module('../credential-manager', () => ({
53
- DiscordCredentialManager: mock(() => ({
54
- load: mock(async () => ({
55
- token: 'test-token',
56
- current_guild: 'guild-1',
57
- guilds: {
58
- 'guild-1': { guild_id: 'guild-1', guild_name: 'Guild One' },
59
- },
60
- })),
61
- })),
62
- }))
63
-
64
- test('list: returns text channels (type=0) from guild', async () => {
39
+ }
40
+ )
41
+
42
+ clientGetMessagesSpy = spyOn(DiscordClient.prototype, 'getMessages').mockResolvedValue([
43
+ {
44
+ id: 'msg-1',
45
+ channel_id: 'ch-1',
46
+ author: { id: 'user-1', username: 'alice' },
47
+ content: 'Hello world',
48
+ timestamp: '2024-01-29T10:00:00Z',
49
+ },
50
+ {
51
+ id: 'msg-2',
52
+ channel_id: 'ch-1',
53
+ author: { id: 'user-2', username: 'bob' },
54
+ content: 'Hi there',
55
+ timestamp: '2024-01-29T09:00:00Z',
56
+ },
57
+ ])
58
+
59
+ // Spy on DiscordCredentialManager.prototype methods
60
+ credManagerLoadSpy = spyOn(DiscordCredentialManager.prototype, 'load').mockResolvedValue({
61
+ token: 'test-token',
62
+ current_server: 'server-1',
63
+ servers: {
64
+ 'server-1': { server_id: 'server-1', server_name: 'Server One' },
65
+ },
66
+ })
67
+ })
68
+
69
+ afterEach(() => {
70
+ clientListChannelsSpy?.mockRestore()
71
+ clientGetChannelSpy?.mockRestore()
72
+ clientGetMessagesSpy?.mockRestore()
73
+ credManagerLoadSpy?.mockRestore()
74
+ })
75
+
76
+ test('list: returns text channels (type=0) from server', async () => {
65
77
  // given: discord client with channels
66
78
  const client = new DiscordClient('test-token')
67
- const channels = await client.listChannels('guild-1')
79
+ const channels = await client.listChannels('server-1')
68
80
 
69
81
  // when: filtering text channels
70
82
  const textChannels = channels.filter((ch) => ch.type === 0)
@@ -78,7 +90,7 @@ test('list: returns text channels (type=0) from guild', async () => {
78
90
  test('list: includes channel metadata', async () => {
79
91
  // given: discord client with channels
80
92
  const client = new DiscordClient('test-token')
81
- const channels = await client.listChannels('guild-1')
93
+ const channels = await client.listChannels('server-1')
82
94
  const textChannels = channels.filter((ch) => ch.type === 0)
83
95
 
84
96
  // when: checking channel properties