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
@@ -16,27 +16,27 @@ export async function snapshotAction(options: {
16
16
  const credManager = new DiscordCredentialManager()
17
17
  const config = await credManager.load()
18
18
 
19
- if (!config.token || !config.current_guild) {
19
+ if (!config.token || !config.current_server) {
20
20
  console.log(
21
- formatOutput({ error: 'No current guild set. Run "guild switch" first.' }, options.pretty)
21
+ formatOutput({ error: 'No current server set. Run "server switch" first.' }, options.pretty)
22
22
  )
23
23
  process.exit(1)
24
24
  }
25
25
 
26
26
  const client = new DiscordClient(config.token as string)
27
- const guildId = config.current_guild as string
27
+ const serverId = config.current_server as string
28
28
  const messageLimit = options.limit || 20
29
29
 
30
30
  const snapshot: Record<string, any> = {}
31
31
 
32
- const guild = await client.getGuild(guildId)
33
- snapshot.guild = {
34
- id: guild.id,
35
- name: guild.name,
32
+ const server = await client.getServer(serverId)
33
+ snapshot.server = {
34
+ id: server.id,
35
+ name: server.name,
36
36
  }
37
37
 
38
38
  if (!options.usersOnly) {
39
- const channels = await client.listChannels(guildId)
39
+ const channels = await client.listChannels(serverId)
40
40
 
41
41
  snapshot.channels = channels.map((ch) => ({
42
42
  id: ch.id,
@@ -73,7 +73,7 @@ export async function snapshotAction(options: {
73
73
  }
74
74
 
75
75
  if (!options.channelsOnly) {
76
- const users = await client.listUsers(guildId)
76
+ const users = await client.listUsers(serverId)
77
77
 
78
78
  snapshot.members = users.map((u) => ({
79
79
  id: u.id,
@@ -90,7 +90,7 @@ export async function snapshotAction(options: {
90
90
 
91
91
  export const snapshotCommand = new Command()
92
92
  .name('snapshot')
93
- .description('Get comprehensive guild state for AI agents')
93
+ .description('Get comprehensive server state for AI agents')
94
94
  .option('--channels-only', 'Include only channels (exclude messages and members)')
95
95
  .option('--users-only', 'Include only members (exclude channels and messages)')
96
96
  .option('--limit <n>', 'Number of recent messages per channel (default: 20)', '20')
@@ -0,0 +1,121 @@
1
+ import { afterEach, beforeEach, expect, spyOn, test } from 'bun:test'
2
+ import { DiscordClient } from '../client'
3
+ import { DiscordCredentialManager } from '../credential-manager'
4
+
5
+ let clientCreateThreadSpy: ReturnType<typeof spyOn>
6
+ let clientArchiveThreadSpy: ReturnType<typeof spyOn>
7
+ let credManagerLoadSpy: ReturnType<typeof spyOn>
8
+
9
+ beforeEach(() => {
10
+ clientCreateThreadSpy = spyOn(DiscordClient.prototype, 'createThread').mockResolvedValue({
11
+ id: 'thread-1',
12
+ guild_id: 'guild-1',
13
+ name: 'Test Thread',
14
+ type: 11,
15
+ parent_id: 'ch-1',
16
+ })
17
+
18
+ clientArchiveThreadSpy = spyOn(DiscordClient.prototype, 'archiveThread').mockResolvedValue({
19
+ id: 'thread-1',
20
+ guild_id: 'guild-1',
21
+ name: 'Test Thread',
22
+ type: 11,
23
+ parent_id: 'ch-1',
24
+ thread_metadata: {
25
+ archived: true,
26
+ auto_archive_duration: 1440,
27
+ archive_timestamp: '2024-01-29T10:00:00Z',
28
+ },
29
+ })
30
+
31
+ credManagerLoadSpy = spyOn(DiscordCredentialManager.prototype, 'load').mockResolvedValue({
32
+ token: 'test-token',
33
+ current_server: 'server-1',
34
+ servers: {
35
+ 'server-1': { server_id: 'server-1', server_name: 'Server One' },
36
+ },
37
+ })
38
+ })
39
+
40
+ afterEach(() => {
41
+ clientCreateThreadSpy?.mockRestore()
42
+ clientArchiveThreadSpy?.mockRestore()
43
+ credManagerLoadSpy?.mockRestore()
44
+ })
45
+
46
+ test('createThread: creates thread with name', async () => {
47
+ // given: discord client
48
+ const client = new DiscordClient('test-token')
49
+
50
+ // when: creating thread
51
+ const thread = await client.createThread('ch-1', 'Test Thread')
52
+
53
+ // then: thread is created
54
+ expect(thread).toBeDefined()
55
+ expect(thread.id).toBe('thread-1')
56
+ expect(thread.name).toBe('Test Thread')
57
+ expect(thread.type).toBe(11)
58
+ expect(thread.parent_id).toBe('ch-1')
59
+ })
60
+
61
+ test('createThread: creates thread with auto_archive_duration', async () => {
62
+ // given: discord client
63
+ const client = new DiscordClient('test-token')
64
+
65
+ // when: creating thread with auto_archive_duration
66
+ await client.createThread('ch-1', 'Test Thread', { auto_archive_duration: 60 })
67
+
68
+ // then: createThread is called with options
69
+ expect(clientCreateThreadSpy).toHaveBeenCalledWith('ch-1', 'Test Thread', {
70
+ auto_archive_duration: 60,
71
+ })
72
+ })
73
+
74
+ test('createThread: creates thread with rate_limit_per_user', async () => {
75
+ // given: discord client
76
+ const client = new DiscordClient('test-token')
77
+
78
+ // when: creating thread with rate_limit_per_user
79
+ await client.createThread('ch-1', 'Test Thread', { rate_limit_per_user: 10 })
80
+
81
+ // then: createThread is called with options
82
+ expect(clientCreateThreadSpy).toHaveBeenCalledWith('ch-1', 'Test Thread', {
83
+ rate_limit_per_user: 10,
84
+ })
85
+ })
86
+
87
+ test('archiveThread: archives thread', async () => {
88
+ // given: discord client
89
+ const client = new DiscordClient('test-token')
90
+
91
+ // when: archiving thread
92
+ const thread = await client.archiveThread('thread-1')
93
+
94
+ // then: thread is archived
95
+ expect(thread).toBeDefined()
96
+ expect(thread.id).toBe('thread-1')
97
+ expect(thread.thread_metadata?.archived).toBe(true)
98
+ })
99
+
100
+ test('archiveThread: unarchives thread when archived=false', async () => {
101
+ // given: discord client with unarchive mock
102
+ clientArchiveThreadSpy.mockResolvedValue({
103
+ id: 'thread-1',
104
+ guild_id: 'guild-1',
105
+ name: 'Test Thread',
106
+ type: 11,
107
+ parent_id: 'ch-1',
108
+ thread_metadata: {
109
+ archived: false,
110
+ auto_archive_duration: 1440,
111
+ },
112
+ })
113
+ const client = new DiscordClient('test-token')
114
+
115
+ // when: unarchiving thread
116
+ const thread = await client.archiveThread('thread-1', false)
117
+
118
+ // then: thread is unarchived
119
+ expect(thread).toBeDefined()
120
+ expect(thread.thread_metadata?.archived).toBe(false)
121
+ })
@@ -0,0 +1,92 @@
1
+ import { Command } from 'commander'
2
+ import { handleError } from '../../../shared/utils/error-handler'
3
+ import { formatOutput } from '../../../shared/utils/output'
4
+ import { DiscordClient } from '../client'
5
+ import { DiscordCredentialManager } from '../credential-manager'
6
+
7
+ export async function createAction(
8
+ channelId: string,
9
+ name: string,
10
+ options: { autoArchiveDuration?: string; pretty?: boolean }
11
+ ): Promise<void> {
12
+ try {
13
+ const credManager = new DiscordCredentialManager()
14
+ const config = await credManager.load()
15
+
16
+ if (!config.token) {
17
+ console.log(
18
+ formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
19
+ )
20
+ process.exit(1)
21
+ }
22
+
23
+ const client = new DiscordClient(config.token)
24
+ const threadOptions: { auto_archive_duration?: number } = {}
25
+
26
+ if (options.autoArchiveDuration) {
27
+ threadOptions.auto_archive_duration = parseInt(options.autoArchiveDuration, 10)
28
+ }
29
+
30
+ const thread = await client.createThread(channelId, name, threadOptions)
31
+
32
+ const output = {
33
+ id: thread.id,
34
+ name: thread.name,
35
+ type: thread.type,
36
+ parent_id: thread.parent_id,
37
+ }
38
+
39
+ console.log(formatOutput(output, options.pretty))
40
+ } catch (error) {
41
+ handleError(error as Error)
42
+ }
43
+ }
44
+
45
+ export async function archiveAction(
46
+ threadId: string,
47
+ options: { pretty?: boolean }
48
+ ): Promise<void> {
49
+ try {
50
+ const credManager = new DiscordCredentialManager()
51
+ const config = await credManager.load()
52
+
53
+ if (!config.token) {
54
+ console.log(
55
+ formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
56
+ )
57
+ process.exit(1)
58
+ }
59
+
60
+ const client = new DiscordClient(config.token)
61
+ const thread = await client.archiveThread(threadId)
62
+
63
+ const output = {
64
+ id: thread.id,
65
+ name: thread.name,
66
+ archived: thread.thread_metadata?.archived || false,
67
+ }
68
+
69
+ console.log(formatOutput(output, options.pretty))
70
+ } catch (error) {
71
+ handleError(error as Error)
72
+ }
73
+ }
74
+
75
+ export const threadCommand = new Command('thread')
76
+ .description('Thread commands')
77
+ .addCommand(
78
+ new Command('create')
79
+ .description('Create a thread')
80
+ .argument('<channel-id>', 'Channel ID')
81
+ .argument('<name>', 'Thread name')
82
+ .option('--auto-archive-duration <minutes>', 'Auto archive duration in minutes')
83
+ .option('--pretty', 'Pretty print JSON output')
84
+ .action(createAction)
85
+ )
86
+ .addCommand(
87
+ new Command('archive')
88
+ .description('Archive a thread')
89
+ .argument('<thread-id>', 'Thread ID')
90
+ .option('--pretty', 'Pretty print JSON output')
91
+ .action(archiveAction)
92
+ )
@@ -16,7 +16,7 @@ const mockClient = {
16
16
  avatar: 'avatar_hash',
17
17
  bot: false,
18
18
  })),
19
- listUsers: mock(async (_guildId: string) => [
19
+ listUsers: mock(async (_serverId: string) => [
20
20
  {
21
21
  id: 'user1',
22
22
  username: 'alice',
@@ -80,12 +80,12 @@ test('info returns user details by id', async () => {
80
80
  expect(result.username).toBe('testuser')
81
81
  })
82
82
 
83
- test('list returns guild members', async () => {
84
- // given: guild id
85
- const guildId = 'guild123'
83
+ test('list returns server members', async () => {
84
+ // given: server id
85
+ const serverId = 'server123'
86
86
 
87
87
  // when: listing users
88
- const users = await mockClient.listUsers(guildId)
88
+ const users = await mockClient.listUsers(serverId)
89
89
  const result = users.map((u) => ({
90
90
  id: u.id,
91
91
  username: u.username,
@@ -102,9 +102,9 @@ test('list returns guild members', async () => {
102
102
  })
103
103
 
104
104
  test('list filters out bots when flag not set', async () => {
105
- // given: guild id and users with bots
106
- const guildId = 'guild123'
107
- const users = await mockClient.listUsers(guildId)
105
+ // given: server id and users with bots
106
+ const serverId = 'server123'
107
+ const users = await mockClient.listUsers(serverId)
108
108
 
109
109
  // when: filtering out bots
110
110
  const filtered = users.filter((u) => !u.bot)
@@ -3,6 +3,7 @@ import { handleError } from '../../../shared/utils/error-handler'
3
3
  import { formatOutput } from '../../../shared/utils/output'
4
4
  import { DiscordClient } from '../client'
5
5
  import { DiscordCredentialManager } from '../credential-manager'
6
+ import type { DiscordUser } from '../types'
6
7
 
7
8
  async function listAction(options: { pretty?: boolean }): Promise<void> {
8
9
  try {
@@ -16,10 +17,10 @@ async function listAction(options: { pretty?: boolean }): Promise<void> {
16
17
  process.exit(1)
17
18
  }
18
19
 
19
- if (!config.current_guild) {
20
+ if (!config.current_server) {
20
21
  console.log(
21
22
  formatOutput(
22
- { error: 'No current guild set. Run "guild switch <id>" first.' },
23
+ { error: 'No current server set. Run "server switch <id>" first.' },
23
24
  options.pretty
24
25
  )
25
26
  )
@@ -27,7 +28,7 @@ async function listAction(options: { pretty?: boolean }): Promise<void> {
27
28
  }
28
29
 
29
30
  const client = new DiscordClient(config.token)
30
- const users = await client.listUsers(config.current_guild)
31
+ const users = await client.listUsers(config.current_server)
31
32
 
32
33
  const output = users.map((user) => ({
33
34
  id: user.id,
@@ -56,7 +57,17 @@ async function infoAction(userId: string, options: { pretty?: boolean }): Promis
56
57
  }
57
58
 
58
59
  const client = new DiscordClient(config.token)
59
- const user = await client.getUser(userId)
60
+
61
+ // Check if requesting current user - use @me endpoint (works with user tokens)
62
+ const me = await client.testAuth()
63
+ let user: DiscordUser
64
+
65
+ if (userId === me.id) {
66
+ user = me
67
+ } else {
68
+ // For other users, try the regular endpoint (requires bot token)
69
+ user = await client.getUser(userId)
70
+ }
60
71
 
61
72
  const output = {
62
73
  id: user.id,
@@ -105,7 +116,7 @@ export const userCommand = new Command('user')
105
116
  .description('User commands')
106
117
  .addCommand(
107
118
  new Command('list')
108
- .description('List guild members')
119
+ .description('List server members')
109
120
  .option('--pretty', 'Pretty print JSON output')
110
121
  .action(listAction)
111
122
  )
@@ -1,173 +1,174 @@
1
- import { afterEach, beforeEach, expect, test } from 'bun:test'
2
- import { existsSync } from 'node:fs'
3
- import { rm } from 'node:fs/promises'
1
+ import { afterAll, describe, expect, test } from 'bun:test'
2
+ import { existsSync, rmSync } from 'node:fs'
4
3
  import { join } from 'node:path'
5
4
  import { DiscordCredentialManager } from './credential-manager'
6
5
 
7
- const TEST_CONFIG_DIR = '/tmp/discord-test-config'
6
+ const testDirs: string[] = []
8
7
 
9
- beforeEach(async () => {
10
- if (existsSync(TEST_CONFIG_DIR)) {
11
- await rm(TEST_CONFIG_DIR, { recursive: true })
12
- }
13
- })
8
+ function setup(): DiscordCredentialManager {
9
+ const testConfigDir = join(
10
+ import.meta.dir,
11
+ `.test-discord-config-${Date.now()}-${Math.random().toString(36).slice(2)}`
12
+ )
13
+ testDirs.push(testConfigDir)
14
+ return new DiscordCredentialManager(testConfigDir)
15
+ }
14
16
 
15
- afterEach(async () => {
16
- if (existsSync(TEST_CONFIG_DIR)) {
17
- await rm(TEST_CONFIG_DIR, { recursive: true })
17
+ afterAll(() => {
18
+ for (const dir of testDirs) {
19
+ rmSync(dir, { recursive: true, force: true })
18
20
  }
19
21
  })
20
22
 
21
- test('load returns default config when file does not exist', async () => {
22
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
23
- const config = await manager.load()
23
+ describe('DiscordCredentialManager', () => {
24
+ test('load returns default config when file does not exist', async () => {
25
+ const manager = setup()
26
+ const config = await manager.load()
24
27
 
25
- expect(config).toEqual({
26
- token: null,
27
- current_guild: null,
28
- guilds: {},
28
+ expect(config).toEqual({
29
+ token: null,
30
+ current_server: null,
31
+ servers: {},
32
+ })
29
33
  })
30
- })
31
-
32
- test('save creates config file with correct permissions', async () => {
33
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
34
- const config = {
35
- token: 'test-token',
36
- current_guild: 'guild-123',
37
- guilds: {
38
- 'guild-123': { guild_id: 'guild-123', guild_name: 'Test Guild' },
39
- },
40
- }
41
-
42
- await manager.save(config)
43
-
44
- const credentialsPath = join(TEST_CONFIG_DIR, 'discord-credentials.json')
45
- expect(existsSync(credentialsPath)).toBe(true)
46
-
47
- const file = Bun.file(credentialsPath)
48
- const content = await file.text()
49
- const loaded = JSON.parse(content)
50
- expect(loaded).toEqual(config)
51
- })
52
-
53
- test('getToken returns null when not authenticated', async () => {
54
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
55
- const token = await manager.getToken()
56
34
 
57
- expect(token).toBeNull()
58
- })
59
-
60
- test('setToken saves token to config', async () => {
61
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
62
- await manager.setToken('test-token-123')
63
-
64
- const token = await manager.getToken()
65
- expect(token).toBe('test-token-123')
66
- })
35
+ test('save creates config file with correct permissions', async () => {
36
+ const testConfigDir = join(
37
+ import.meta.dir,
38
+ `.test-discord-config-${Date.now()}-${Math.random().toString(36).slice(2)}`
39
+ )
40
+ testDirs.push(testConfigDir)
41
+ const manager = new DiscordCredentialManager(testConfigDir)
42
+ const config = {
43
+ token: 'test-token',
44
+ current_server: 'server-123',
45
+ servers: {
46
+ 'server-123': { server_id: 'server-123', server_name: 'Test Server' },
47
+ },
48
+ }
49
+
50
+ await manager.save(config)
51
+
52
+ const credentialsPath = join(testConfigDir, 'discord-credentials.json')
53
+ expect(existsSync(credentialsPath)).toBe(true)
54
+
55
+ const file = Bun.file(credentialsPath)
56
+ const content = await file.text()
57
+ const loaded = JSON.parse(content)
58
+ expect(loaded).toEqual(config)
59
+ })
67
60
 
68
- test('getToken returns previously set token', async () => {
69
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
70
- await manager.setToken('my-token')
61
+ test('getToken returns null when not authenticated', async () => {
62
+ const manager = setup()
63
+ const token = await manager.getToken()
64
+ expect(token).toBeNull()
65
+ })
71
66
 
72
- const token = await manager.getToken()
73
- expect(token).toBe('my-token')
74
- })
67
+ test('setToken saves token to config', async () => {
68
+ const manager = setup()
69
+ await manager.setToken('test-token-123')
75
70
 
76
- test('clearToken removes token from config', async () => {
77
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
78
- await manager.setToken('test-token')
79
- await manager.clearToken()
71
+ const token = await manager.getToken()
72
+ expect(token).toBe('test-token-123')
73
+ })
80
74
 
81
- const token = await manager.getToken()
82
- expect(token).toBeNull()
83
- })
75
+ test('getToken returns previously set token', async () => {
76
+ const manager = setup()
77
+ await manager.setToken('my-token')
84
78
 
85
- test('getCurrentGuild returns null when not set', async () => {
86
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
87
- const guild = await manager.getCurrentGuild()
79
+ const token = await manager.getToken()
80
+ expect(token).toBe('my-token')
81
+ })
88
82
 
89
- expect(guild).toBeNull()
90
- })
83
+ test('clearToken removes token from config', async () => {
84
+ const manager = setup()
85
+ await manager.setToken('test-token')
86
+ await manager.clearToken()
91
87
 
92
- test('setCurrentGuild saves guild id', async () => {
93
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
94
- await manager.setCurrentGuild('guild-456')
88
+ const token = await manager.getToken()
89
+ expect(token).toBeNull()
90
+ })
95
91
 
96
- const guild = await manager.getCurrentGuild()
97
- expect(guild).toBe('guild-456')
98
- })
92
+ test('getCurrentServer returns null when not set', async () => {
93
+ const manager = setup()
94
+ const server = await manager.getCurrentServer()
95
+ expect(server).toBeNull()
96
+ })
99
97
 
100
- test('getGuilds returns empty object when no guilds set', async () => {
101
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
102
- const guilds = await manager.getGuilds()
98
+ test('setCurrentServer saves server id', async () => {
99
+ const manager = setup()
100
+ await manager.setCurrentServer('server-456')
103
101
 
104
- expect(guilds).toEqual({})
105
- })
102
+ const server = await manager.getCurrentServer()
103
+ expect(server).toBe('server-456')
104
+ })
106
105
 
107
- test('setGuilds saves guilds to config', async () => {
108
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
109
- const guilds = {
110
- 'guild-1': { guild_id: 'guild-1', guild_name: 'Guild One' },
111
- 'guild-2': { guild_id: 'guild-2', guild_name: 'Guild Two' },
112
- }
106
+ test('getServers returns empty object when no servers set', async () => {
107
+ const manager = setup()
108
+ const servers = await manager.getServers()
109
+ expect(servers).toEqual({})
110
+ })
113
111
 
114
- await manager.setGuilds(guilds)
112
+ test('setServers saves servers to config', async () => {
113
+ const manager = setup()
114
+ const servers = {
115
+ 'server-1': { server_id: 'server-1', server_name: 'Server One' },
116
+ 'server-2': { server_id: 'server-2', server_name: 'Server Two' },
117
+ }
115
118
 
116
- const loaded = await manager.getGuilds()
117
- expect(loaded).toEqual(guilds)
118
- })
119
+ await manager.setServers(servers)
119
120
 
120
- test('getCredentials returns null when not authenticated', async () => {
121
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
122
- const creds = await manager.getCredentials()
121
+ const loaded = await manager.getServers()
122
+ expect(loaded).toEqual(servers)
123
+ })
123
124
 
124
- expect(creds).toBeNull()
125
- })
125
+ test('getCredentials returns null when not authenticated', async () => {
126
+ const manager = setup()
127
+ const creds = await manager.getCredentials()
128
+ expect(creds).toBeNull()
129
+ })
126
130
 
127
- test('getCredentials returns null when token exists but no guild selected', async () => {
128
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
129
- await manager.setToken('test-token')
131
+ test('getCredentials returns null when token exists but no server selected', async () => {
132
+ const manager = setup()
133
+ await manager.setToken('test-token')
130
134
 
131
- const creds = await manager.getCredentials()
132
- expect(creds).toBeNull()
133
- })
135
+ const creds = await manager.getCredentials()
136
+ expect(creds).toBeNull()
137
+ })
134
138
 
135
- test('getCredentials returns null when guild selected but no token', async () => {
136
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
137
- await manager.setCurrentGuild('guild-123')
139
+ test('getCredentials returns null when server selected but no token', async () => {
140
+ const manager = setup()
141
+ await manager.setCurrentServer('server-123')
138
142
 
139
- const creds = await manager.getCredentials()
140
- expect(creds).toBeNull()
141
- })
143
+ const creds = await manager.getCredentials()
144
+ expect(creds).toBeNull()
145
+ })
142
146
 
143
- test('getCredentials returns token and guildId when both are set', async () => {
144
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
145
- await manager.setToken('test-token-xyz')
146
- await manager.setCurrentGuild('guild-789')
147
+ test('getCredentials returns token and serverId when both are set', async () => {
148
+ const manager = setup()
149
+ await manager.setToken('test-token-xyz')
150
+ await manager.setCurrentServer('server-789')
147
151
 
148
- const creds = await manager.getCredentials()
149
- expect(creds).toEqual({
150
- token: 'test-token-xyz',
151
- guildId: 'guild-789',
152
+ const creds = await manager.getCredentials()
153
+ expect(creds).toEqual({
154
+ token: 'test-token-xyz',
155
+ serverId: 'server-789',
156
+ })
152
157
  })
153
- })
154
158
 
155
- test('multiple operations preserve existing data', async () => {
156
- const manager = new DiscordCredentialManager(TEST_CONFIG_DIR)
159
+ test('multiple operations preserve existing data', async () => {
160
+ const manager = setup()
161
+ await manager.setToken('token-1')
162
+ await manager.setCurrentServer('server-1')
163
+ const servers = {
164
+ 'server-1': { server_id: 'server-1', server_name: 'Server One' },
165
+ }
166
+ await manager.setServers(servers)
157
167
 
158
- // Set initial data
159
- await manager.setToken('token-1')
160
- await manager.setCurrentGuild('guild-1')
161
- const guilds = {
162
- 'guild-1': { guild_id: 'guild-1', guild_name: 'Guild One' },
163
- }
164
- await manager.setGuilds(guilds)
168
+ await manager.setToken('token-2')
165
169
 
166
- // Update token
167
- await manager.setToken('token-2')
168
-
169
- // Verify all data is preserved
170
- expect(await manager.getToken()).toBe('token-2')
171
- expect(await manager.getCurrentGuild()).toBe('guild-1')
172
- expect(await manager.getGuilds()).toEqual(guilds)
170
+ expect(await manager.getToken()).toBe('token-2')
171
+ expect(await manager.getCurrentServer()).toBe('server-1')
172
+ expect(await manager.getServers()).toEqual(servers)
173
+ })
173
174
  })