agent-messenger 1.3.0 → 1.3.2

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 (236) hide show
  1. package/.claude-plugin/marketplace.json +27 -1
  2. package/.claude-plugin/plugin.json +17 -4
  3. package/.env.template +3 -0
  4. package/.github/workflows/release.yml +80 -0
  5. package/AGENTS.md +48 -0
  6. package/README.md +25 -20
  7. package/biome.json +15 -39
  8. package/bun.lock +69 -0
  9. package/dist/package.json +10 -3
  10. package/dist/src/cli.d.ts.map +1 -1
  11. package/dist/src/cli.js +1 -4
  12. package/dist/src/cli.js.map +1 -1
  13. package/dist/src/platforms/discord/client.d.ts.map +1 -1
  14. package/dist/src/platforms/discord/client.js.map +1 -1
  15. package/dist/src/platforms/discord/commands/auth.d.ts.map +1 -1
  16. package/dist/src/platforms/discord/commands/auth.js.map +1 -1
  17. package/dist/src/platforms/discord/commands/channel.d.ts.map +1 -1
  18. package/dist/src/platforms/discord/commands/channel.js.map +1 -1
  19. package/dist/src/platforms/discord/commands/dm.d.ts.map +1 -1
  20. package/dist/src/platforms/discord/commands/dm.js.map +1 -1
  21. package/dist/src/platforms/discord/commands/file.d.ts.map +1 -1
  22. package/dist/src/platforms/discord/commands/file.js +1 -4
  23. package/dist/src/platforms/discord/commands/file.js.map +1 -1
  24. package/dist/src/platforms/discord/commands/friend.d.ts.map +1 -1
  25. package/dist/src/platforms/discord/commands/friend.js +1 -3
  26. package/dist/src/platforms/discord/commands/friend.js.map +1 -1
  27. package/dist/src/platforms/discord/commands/member.d.ts.map +1 -1
  28. package/dist/src/platforms/discord/commands/member.js.map +1 -1
  29. package/dist/src/platforms/discord/commands/mention.d.ts.map +1 -1
  30. package/dist/src/platforms/discord/commands/mention.js.map +1 -1
  31. package/dist/src/platforms/discord/commands/message.d.ts.map +1 -1
  32. package/dist/src/platforms/discord/commands/message.js.map +1 -1
  33. package/dist/src/platforms/discord/commands/note.d.ts.map +1 -1
  34. package/dist/src/platforms/discord/commands/note.js.map +1 -1
  35. package/dist/src/platforms/discord/commands/profile.d.ts.map +1 -1
  36. package/dist/src/platforms/discord/commands/profile.js.map +1 -1
  37. package/dist/src/platforms/discord/commands/reaction.d.ts.map +1 -1
  38. package/dist/src/platforms/discord/commands/reaction.js.map +1 -1
  39. package/dist/src/platforms/discord/commands/server.d.ts.map +1 -1
  40. package/dist/src/platforms/discord/commands/server.js.map +1 -1
  41. package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -1
  42. package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
  43. package/dist/src/platforms/discord/commands/thread.d.ts.map +1 -1
  44. package/dist/src/platforms/discord/commands/thread.js.map +1 -1
  45. package/dist/src/platforms/discord/commands/user.d.ts.map +1 -1
  46. package/dist/src/platforms/discord/commands/user.js.map +1 -1
  47. package/dist/src/platforms/discord/credential-manager.d.ts.map +1 -1
  48. package/dist/src/platforms/discord/credential-manager.js.map +1 -1
  49. package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
  50. package/dist/src/platforms/discord/token-extractor.js +2 -7
  51. package/dist/src/platforms/discord/token-extractor.js.map +1 -1
  52. package/dist/src/platforms/slack/client.d.ts.map +1 -1
  53. package/dist/src/platforms/slack/client.js +2 -0
  54. package/dist/src/platforms/slack/client.js.map +1 -1
  55. package/dist/src/platforms/slack/commands/activity.d.ts.map +1 -1
  56. package/dist/src/platforms/slack/commands/activity.js.map +1 -1
  57. package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -1
  58. package/dist/src/platforms/slack/commands/auth.js.map +1 -1
  59. package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -1
  60. package/dist/src/platforms/slack/commands/channel.js.map +1 -1
  61. package/dist/src/platforms/slack/commands/drafts.d.ts.map +1 -1
  62. package/dist/src/platforms/slack/commands/drafts.js.map +1 -1
  63. package/dist/src/platforms/slack/commands/file.d.ts.map +1 -1
  64. package/dist/src/platforms/slack/commands/file.js +1 -4
  65. package/dist/src/platforms/slack/commands/file.js.map +1 -1
  66. package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
  67. package/dist/src/platforms/slack/commands/message.js.map +1 -1
  68. package/dist/src/platforms/slack/commands/reaction.d.ts.map +1 -1
  69. package/dist/src/platforms/slack/commands/reaction.js +1 -2
  70. package/dist/src/platforms/slack/commands/reaction.js.map +1 -1
  71. package/dist/src/platforms/slack/commands/saved.d.ts.map +1 -1
  72. package/dist/src/platforms/slack/commands/saved.js.map +1 -1
  73. package/dist/src/platforms/slack/commands/sections.d.ts.map +1 -1
  74. package/dist/src/platforms/slack/commands/sections.js.map +1 -1
  75. package/dist/src/platforms/slack/commands/snapshot.d.ts.map +1 -1
  76. package/dist/src/platforms/slack/commands/snapshot.js.map +1 -1
  77. package/dist/src/platforms/slack/commands/unread.d.ts.map +1 -1
  78. package/dist/src/platforms/slack/commands/unread.js.map +1 -1
  79. package/dist/src/platforms/slack/commands/user.d.ts.map +1 -1
  80. package/dist/src/platforms/slack/commands/user.js.map +1 -1
  81. package/dist/src/platforms/slack/commands/workspace.d.ts.map +1 -1
  82. package/dist/src/platforms/slack/commands/workspace.js.map +1 -1
  83. package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
  84. package/dist/src/platforms/slack/token-extractor.js +4 -5
  85. package/dist/src/platforms/slack/token-extractor.js.map +1 -1
  86. package/dist/src/platforms/slack/types.d.ts +24 -0
  87. package/dist/src/platforms/slack/types.d.ts.map +1 -1
  88. package/dist/src/platforms/slack/types.js +7 -0
  89. package/dist/src/platforms/slack/types.js.map +1 -1
  90. package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
  91. package/dist/src/platforms/slackbot/cli.js +1 -1
  92. package/dist/src/platforms/slackbot/cli.js.map +1 -1
  93. package/dist/src/platforms/slackbot/client.d.ts.map +1 -1
  94. package/dist/src/platforms/slackbot/client.js.map +1 -1
  95. package/dist/src/platforms/slackbot/commands/auth.js.map +1 -1
  96. package/dist/src/platforms/slackbot/commands/channel.js.map +1 -1
  97. package/dist/src/platforms/slackbot/commands/message.d.ts.map +1 -1
  98. package/dist/src/platforms/slackbot/commands/message.js.map +1 -1
  99. package/dist/src/platforms/slackbot/commands/reaction.d.ts.map +1 -1
  100. package/dist/src/platforms/slackbot/commands/reaction.js.map +1 -1
  101. package/dist/src/platforms/slackbot/commands/shared.d.ts.map +1 -1
  102. package/dist/src/platforms/slackbot/commands/shared.js.map +1 -1
  103. package/dist/src/platforms/slackbot/commands/user.js.map +1 -1
  104. package/dist/src/platforms/slackbot/credential-manager.d.ts.map +1 -1
  105. package/dist/src/platforms/slackbot/credential-manager.js +2 -4
  106. package/dist/src/platforms/slackbot/credential-manager.js.map +1 -1
  107. package/dist/src/platforms/teams/client.d.ts.map +1 -1
  108. package/dist/src/platforms/teams/client.js.map +1 -1
  109. package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
  110. package/dist/src/platforms/teams/commands/auth.js.map +1 -1
  111. package/dist/src/platforms/teams/commands/channel.d.ts.map +1 -1
  112. package/dist/src/platforms/teams/commands/channel.js.map +1 -1
  113. package/dist/src/platforms/teams/commands/file.d.ts.map +1 -1
  114. package/dist/src/platforms/teams/commands/file.js.map +1 -1
  115. package/dist/src/platforms/teams/commands/message.d.ts.map +1 -1
  116. package/dist/src/platforms/teams/commands/message.js.map +1 -1
  117. package/dist/src/platforms/teams/commands/reaction.d.ts.map +1 -1
  118. package/dist/src/platforms/teams/commands/reaction.js.map +1 -1
  119. package/dist/src/platforms/teams/commands/snapshot.d.ts.map +1 -1
  120. package/dist/src/platforms/teams/commands/snapshot.js.map +1 -1
  121. package/dist/src/platforms/teams/commands/team.d.ts.map +1 -1
  122. package/dist/src/platforms/teams/commands/team.js +1 -4
  123. package/dist/src/platforms/teams/commands/team.js.map +1 -1
  124. package/dist/src/platforms/teams/commands/user.d.ts.map +1 -1
  125. package/dist/src/platforms/teams/commands/user.js.map +1 -1
  126. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  127. package/dist/src/platforms/teams/token-extractor.js +3 -1
  128. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  129. package/docs/content/docs/agent-skills.mdx +4 -4
  130. package/docs/content/docs/index.mdx +11 -18
  131. package/docs/content/docs/integrations/discord.mdx +65 -1
  132. package/docs/content/docs/integrations/slack.mdx +51 -1
  133. package/docs/content/docs/integrations/slackbot.mdx +11 -1
  134. package/docs/content/docs/integrations/teams.mdx +4 -1
  135. package/docs/content/docs/quick-start.mdx +3 -2
  136. package/docs/src/app/icon.png +0 -0
  137. package/docs/src/app/layout.config.tsx +8 -1
  138. package/package.json +16 -9
  139. package/scripts/prepublish.ts +11 -0
  140. package/skills/agent-discord/SKILL.md +14 -0
  141. package/skills/agent-slack/SKILL.md +14 -0
  142. package/skills/agent-slackbot/SKILL.md +14 -0
  143. package/skills/agent-teams/SKILL.md +14 -0
  144. package/src/cli.ts +1 -4
  145. package/src/platforms/discord/client.test.ts +6 -14
  146. package/src/platforms/discord/client.ts +12 -34
  147. package/src/platforms/discord/commands/auth.test.ts +2 -7
  148. package/src/platforms/discord/commands/auth.ts +14 -19
  149. package/src/platforms/discord/commands/channel.test.ts +18 -20
  150. package/src/platforms/discord/commands/channel.ts +9 -18
  151. package/src/platforms/discord/commands/dm.test.ts +1 -3
  152. package/src/platforms/discord/commands/dm.ts +6 -10
  153. package/src/platforms/discord/commands/file.ts +10 -23
  154. package/src/platforms/discord/commands/friend.ts +33 -35
  155. package/src/platforms/discord/commands/member.ts +5 -7
  156. package/src/platforms/discord/commands/mention.ts +5 -11
  157. package/src/platforms/discord/commands/message.test.ts +1 -3
  158. package/src/platforms/discord/commands/message.ts +23 -61
  159. package/src/platforms/discord/commands/note.ts +7 -15
  160. package/src/platforms/discord/commands/profile.ts +4 -6
  161. package/src/platforms/discord/commands/reaction.test.ts +1 -3
  162. package/src/platforms/discord/commands/reaction.ts +19 -29
  163. package/src/platforms/discord/commands/server.test.ts +14 -18
  164. package/src/platforms/discord/commands/server.ts +9 -15
  165. package/src/platforms/discord/commands/snapshot.ts +5 -7
  166. package/src/platforms/discord/commands/thread.ts +8 -15
  167. package/src/platforms/discord/commands/user.ts +9 -20
  168. package/src/platforms/discord/credential-manager.test.ts +2 -2
  169. package/src/platforms/discord/credential-manager.ts +1 -3
  170. package/src/platforms/discord/token-extractor.test.ts +28 -57
  171. package/src/platforms/discord/token-extractor.ts +10 -30
  172. package/src/platforms/discord/types.ts +1 -1
  173. package/src/platforms/slack/client.test.ts +14 -20
  174. package/src/platforms/slack/client.ts +6 -11
  175. package/src/platforms/slack/commands/activity.test.ts +3 -9
  176. package/src/platforms/slack/commands/activity.ts +7 -12
  177. package/src/platforms/slack/commands/auth.test.ts +2 -2
  178. package/src/platforms/slack/commands/auth.ts +15 -31
  179. package/src/platforms/slack/commands/channel.ts +10 -32
  180. package/src/platforms/slack/commands/drafts.ts +5 -14
  181. package/src/platforms/slack/commands/file.ts +9 -29
  182. package/src/platforms/slack/commands/message.ts +23 -67
  183. package/src/platforms/slack/commands/reaction.test.ts +37 -33
  184. package/src/platforms/slack/commands/reaction.ts +21 -51
  185. package/src/platforms/slack/commands/saved.ts +5 -14
  186. package/src/platforms/slack/commands/sections.ts +4 -11
  187. package/src/platforms/slack/commands/snapshot.test.ts +1 -3
  188. package/src/platforms/slack/commands/snapshot.ts +5 -10
  189. package/src/platforms/slack/commands/unread.test.ts +6 -8
  190. package/src/platforms/slack/commands/unread.ts +10 -33
  191. package/src/platforms/slack/commands/user.test.ts +1 -4
  192. package/src/platforms/slack/commands/user.ts +6 -8
  193. package/src/platforms/slack/commands/workspace.test.ts +1 -1
  194. package/src/platforms/slack/commands/workspace.ts +7 -12
  195. package/src/platforms/slack/token-extractor-node-test.ts +1 -1
  196. package/src/platforms/slack/token-extractor.ts +8 -17
  197. package/src/platforms/slack/types.ts +11 -1
  198. package/src/platforms/slackbot/cli.ts +1 -7
  199. package/src/platforms/slackbot/client.test.ts +7 -7
  200. package/src/platforms/slackbot/client.ts +4 -11
  201. package/src/platforms/slackbot/commands/auth.test.ts +1 -1
  202. package/src/platforms/slackbot/commands/auth.ts +7 -7
  203. package/src/platforms/slackbot/commands/channel.ts +4 -4
  204. package/src/platforms/slackbot/commands/message.ts +16 -29
  205. package/src/platforms/slackbot/commands/reaction.ts +6 -16
  206. package/src/platforms/slackbot/commands/shared.ts +2 -4
  207. package/src/platforms/slackbot/commands/user.ts +4 -4
  208. package/src/platforms/slackbot/credential-manager.ts +2 -7
  209. package/src/platforms/slackbot/types.ts +1 -1
  210. package/src/platforms/teams/client.test.ts +15 -32
  211. package/src/platforms/teams/client.ts +18 -51
  212. package/src/platforms/teams/commands/auth.test.ts +6 -16
  213. package/src/platforms/teams/commands/auth.ts +16 -26
  214. package/src/platforms/teams/commands/channel.test.ts +2 -5
  215. package/src/platforms/teams/commands/channel.ts +10 -20
  216. package/src/platforms/teams/commands/file.test.ts +1 -4
  217. package/src/platforms/teams/commands/file.ts +11 -21
  218. package/src/platforms/teams/commands/message.test.ts +1 -3
  219. package/src/platforms/teams/commands/message.ts +15 -25
  220. package/src/platforms/teams/commands/reaction.test.ts +2 -7
  221. package/src/platforms/teams/commands/reaction.ts +12 -16
  222. package/src/platforms/teams/commands/snapshot.ts +6 -11
  223. package/src/platforms/teams/commands/team.test.ts +15 -26
  224. package/src/platforms/teams/commands/team.ts +10 -19
  225. package/src/platforms/teams/commands/user.ts +8 -14
  226. package/src/platforms/teams/credential-manager.test.ts +2 -5
  227. package/src/platforms/teams/token-extractor.test.ts +21 -50
  228. package/src/platforms/teams/token-extractor.ts +12 -20
  229. package/src/platforms/teams/types.ts +1 -1
  230. package/src/shared/utils/concurrency.test.ts +2 -2
  231. package/src/shared/utils/concurrency.ts +1 -1
  232. package/.claude/commands/release.md +0 -92
  233. package/dist/src/platforms/discord/commands/guild.d.ts +0 -15
  234. package/dist/src/platforms/discord/commands/guild.d.ts.map +0 -1
  235. package/dist/src/platforms/discord/commands/guild.js +0 -102
  236. package/dist/src/platforms/discord/commands/guild.js.map +0 -1
@@ -12,9 +12,7 @@ beforeEach(() => {
12
12
  // Spy on DiscordClient.prototype methods
13
13
  clientAddReactionSpy = spyOn(DiscordClient.prototype, 'addReaction').mockResolvedValue(undefined)
14
14
 
15
- clientRemoveReactionSpy = spyOn(DiscordClient.prototype, 'removeReaction').mockResolvedValue(
16
- undefined
17
- )
15
+ clientRemoveReactionSpy = spyOn(DiscordClient.prototype, 'removeReaction').mockResolvedValue(undefined)
18
16
 
19
17
  clientGetMessageSpy = spyOn(DiscordClient.prototype, 'getMessage').mockResolvedValue({
20
18
  id: 'msg123',
@@ -1,6 +1,6 @@
1
1
  import { Command } from 'commander'
2
- import { handleError } from '../../../shared/utils/error-handler'
3
- import { formatOutput } from '../../../shared/utils/output'
2
+ import { handleError } from '@/shared/utils/error-handler'
3
+ import { formatOutput } from '@/shared/utils/output'
4
4
  import { DiscordClient } from '../client'
5
5
  import { DiscordCredentialManager } from '../credential-manager'
6
6
 
@@ -8,16 +8,14 @@ export async function addAction(
8
8
  channelId: string,
9
9
  messageId: string,
10
10
  emoji: string,
11
- options: { pretty?: boolean }
11
+ options: { pretty?: boolean },
12
12
  ): Promise<void> {
13
13
  try {
14
14
  const credManager = new DiscordCredentialManager()
15
15
  const config = await credManager.load()
16
16
 
17
17
  if (!config.token) {
18
- console.log(
19
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
20
- )
18
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
21
19
  process.exit(1)
22
20
  }
23
21
 
@@ -32,8 +30,8 @@ export async function addAction(
32
30
  message_id: messageId,
33
31
  emoji,
34
32
  },
35
- options.pretty
36
- )
33
+ options.pretty,
34
+ ),
37
35
  )
38
36
  } catch (error) {
39
37
  handleError(error as Error)
@@ -44,16 +42,14 @@ export async function removeAction(
44
42
  channelId: string,
45
43
  messageId: string,
46
44
  emoji: string,
47
- options: { pretty?: boolean }
45
+ options: { pretty?: boolean },
48
46
  ): Promise<void> {
49
47
  try {
50
48
  const credManager = new DiscordCredentialManager()
51
49
  const config = await credManager.load()
52
50
 
53
51
  if (!config.token) {
54
- console.log(
55
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
56
- )
52
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
57
53
  process.exit(1)
58
54
  }
59
55
 
@@ -68,27 +64,21 @@ export async function removeAction(
68
64
  message_id: messageId,
69
65
  emoji,
70
66
  },
71
- options.pretty
72
- )
67
+ options.pretty,
68
+ ),
73
69
  )
74
70
  } catch (error) {
75
71
  handleError(error as Error)
76
72
  }
77
73
  }
78
74
 
79
- export async function listAction(
80
- channelId: string,
81
- messageId: string,
82
- options: { pretty?: boolean }
83
- ): Promise<void> {
75
+ export async function listAction(channelId: string, messageId: string, options: { pretty?: boolean }): Promise<void> {
84
76
  try {
85
77
  const credManager = new DiscordCredentialManager()
86
78
  const config = await credManager.load()
87
79
 
88
80
  if (!config.token) {
89
- console.log(
90
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
91
- )
81
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
92
82
  process.exit(1)
93
83
  }
94
84
 
@@ -103,8 +93,8 @@ export async function listAction(
103
93
  channel_id: channelId,
104
94
  message_id: messageId,
105
95
  },
106
- options.pretty
107
- )
96
+ options.pretty,
97
+ ),
108
98
  )
109
99
  process.exit(1)
110
100
  }
@@ -118,8 +108,8 @@ export async function listAction(
118
108
  message_id: messageId,
119
109
  reactions,
120
110
  },
121
- options.pretty
122
- )
111
+ options.pretty,
112
+ ),
123
113
  )
124
114
  } catch (error) {
125
115
  handleError(error as Error)
@@ -135,7 +125,7 @@ export const reactionCommand = new Command('reaction')
135
125
  .argument('<message-id>', 'Message ID')
136
126
  .argument('<emoji>', 'Emoji name (without colons)')
137
127
  .option('--pretty', 'Pretty print JSON output')
138
- .action(addAction)
128
+ .action(addAction),
139
129
  )
140
130
  .addCommand(
141
131
  new Command('remove')
@@ -144,7 +134,7 @@ export const reactionCommand = new Command('reaction')
144
134
  .argument('<message-id>', 'Message ID')
145
135
  .argument('<emoji>', 'Emoji name (without colons)')
146
136
  .option('--pretty', 'Pretty print JSON output')
147
- .action(removeAction)
137
+ .action(removeAction),
148
138
  )
149
139
  .addCommand(
150
140
  new Command('list')
@@ -152,5 +142,5 @@ export const reactionCommand = new Command('reaction')
152
142
  .argument('<channel-id>', 'Channel ID')
153
143
  .argument('<message-id>', 'Message ID')
154
144
  .option('--pretty', 'Pretty print JSON output')
155
- .action(listAction)
145
+ .action(listAction),
156
146
  )
@@ -15,17 +15,15 @@ beforeEach(() => {
15
15
  { id: 'server-2', name: 'Server Two', icon: 'icon2', owner: false },
16
16
  ])
17
17
 
18
- clientGetServerSpy = spyOn(DiscordClient.prototype, 'getServer').mockImplementation(
19
- async (serverId: string) => {
20
- if (serverId === 'server-1') {
21
- return { id: 'server-1', name: 'Server One', icon: 'icon1', owner: true }
22
- }
23
- if (serverId === 'server-2') {
24
- return { id: 'server-2', name: 'Server Two', icon: 'icon2', owner: false }
25
- }
26
- throw new Error('Server not found')
18
+ clientGetServerSpy = spyOn(DiscordClient.prototype, 'getServer').mockImplementation(async (serverId: string) => {
19
+ if (serverId === 'server-1') {
20
+ return { id: 'server-1', name: 'Server One', icon: 'icon1', owner: true }
27
21
  }
28
- )
22
+ if (serverId === 'server-2') {
23
+ return { id: 'server-2', name: 'Server Two', icon: 'icon2', owner: false }
24
+ }
25
+ throw new Error('Server not found')
26
+ })
29
27
 
30
28
  // Spy on DiscordCredentialManager.prototype methods
31
29
  credManagerLoadSpy = spyOn(DiscordCredentialManager.prototype, 'load').mockResolvedValue({
@@ -37,15 +35,13 @@ beforeEach(() => {
37
35
  },
38
36
  })
39
37
 
40
- credManagerSetCurrentServerSpy = spyOn(
41
- DiscordCredentialManager.prototype,
42
- 'setCurrentServer'
43
- ).mockResolvedValue(undefined)
38
+ credManagerSetCurrentServerSpy = spyOn(DiscordCredentialManager.prototype, 'setCurrentServer').mockResolvedValue(
39
+ undefined,
40
+ )
44
41
 
45
- credManagerGetCurrentServerSpy = spyOn(
46
- DiscordCredentialManager.prototype,
47
- 'getCurrentServer'
48
- ).mockResolvedValue('server-1')
42
+ credManagerGetCurrentServerSpy = spyOn(DiscordCredentialManager.prototype, 'getCurrentServer').mockResolvedValue(
43
+ 'server-1',
44
+ )
49
45
  })
50
46
 
51
47
  afterEach(() => {
@@ -1,6 +1,6 @@
1
1
  import { Command } from 'commander'
2
- import { handleError } from '../../../shared/utils/error-handler'
3
- import { formatOutput } from '../../../shared/utils/output'
2
+ import { handleError } from '@/shared/utils/error-handler'
3
+ import { formatOutput } from '@/shared/utils/output'
4
4
  import { DiscordClient } from '../client'
5
5
  import { DiscordCredentialManager } from '../credential-manager'
6
6
 
@@ -28,9 +28,7 @@ export async function infoAction(serverId: string, options: { pretty?: boolean }
28
28
  const config = await credManager.load()
29
29
 
30
30
  if (!config.token) {
31
- console.log(
32
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
33
- )
31
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
34
32
  process.exit(1)
35
33
  }
36
34
 
@@ -73,18 +71,14 @@ export async function currentAction(options: { pretty?: boolean }): Promise<void
73
71
  const config = await credManager.load()
74
72
 
75
73
  if (!config.current_server) {
76
- console.log(
77
- formatOutput({ error: 'No current server set. Run "auth extract" first.' }, options.pretty)
78
- )
74
+ console.log(formatOutput({ error: 'No current server set. Run "auth extract" first.' }, options.pretty))
79
75
  process.exit(1)
80
76
  }
81
77
 
82
78
  const server = config.servers[config.current_server]
83
79
 
84
80
  if (!server) {
85
- console.log(
86
- formatOutput({ error: 'Current server not found in configuration.' }, options.pretty)
87
- )
81
+ console.log(formatOutput({ error: 'Current server not found in configuration.' }, options.pretty))
88
82
  process.exit(1)
89
83
  }
90
84
 
@@ -105,25 +99,25 @@ export const serverCommand = new Command('server')
105
99
  new Command('list')
106
100
  .description('List all servers')
107
101
  .option('--pretty', 'Pretty print JSON output')
108
- .action(listAction)
102
+ .action(listAction),
109
103
  )
110
104
  .addCommand(
111
105
  new Command('info')
112
106
  .description('Get server info')
113
107
  .argument('<server-id>', 'Server ID')
114
108
  .option('--pretty', 'Pretty print JSON output')
115
- .action(infoAction)
109
+ .action(infoAction),
116
110
  )
117
111
  .addCommand(
118
112
  new Command('switch')
119
113
  .description('Switch to server')
120
114
  .argument('<server-id>', 'Server ID')
121
115
  .option('--pretty', 'Pretty print JSON output')
122
- .action(switchAction)
116
+ .action(switchAction),
123
117
  )
124
118
  .addCommand(
125
119
  new Command('current')
126
120
  .description('Show current server')
127
121
  .option('--pretty', 'Pretty print JSON output')
128
- .action(currentAction)
122
+ .action(currentAction),
129
123
  )
@@ -1,7 +1,7 @@
1
1
  import { Command } from 'commander'
2
- import { parallelMap } from '../../../shared/utils/concurrency'
3
- import { handleError } from '../../../shared/utils/error-handler'
4
- import { formatOutput } from '../../../shared/utils/output'
2
+ import { parallelMap } from '@/shared/utils/concurrency'
3
+ import { handleError } from '@/shared/utils/error-handler'
4
+ import { formatOutput } from '@/shared/utils/output'
5
5
  import { DiscordClient } from '../client'
6
6
  import { DiscordCredentialManager } from '../credential-manager'
7
7
  import type { DiscordChannel } from '../types'
@@ -17,9 +17,7 @@ export async function snapshotAction(options: {
17
17
  const config = await credManager.load()
18
18
 
19
19
  if (!config.token || !config.current_server) {
20
- console.log(
21
- formatOutput({ error: 'No current server set. Run "server switch" first.' }, options.pretty)
22
- )
20
+ console.log(formatOutput({ error: 'No current server set. Run "server switch" first.' }, options.pretty))
23
21
  process.exit(1)
24
22
  }
25
23
 
@@ -58,7 +56,7 @@ export async function snapshotAction(options: {
58
56
  channel_name: channel.name,
59
57
  }))
60
58
  },
61
- 5
59
+ 5,
62
60
  )
63
61
 
64
62
  snapshot.recent_messages = channelMessages.flat().map((msg) => ({
@@ -1,22 +1,20 @@
1
1
  import { Command } from 'commander'
2
- import { handleError } from '../../../shared/utils/error-handler'
3
- import { formatOutput } from '../../../shared/utils/output'
2
+ import { handleError } from '@/shared/utils/error-handler'
3
+ import { formatOutput } from '@/shared/utils/output'
4
4
  import { DiscordClient } from '../client'
5
5
  import { DiscordCredentialManager } from '../credential-manager'
6
6
 
7
7
  export async function createAction(
8
8
  channelId: string,
9
9
  name: string,
10
- options: { autoArchiveDuration?: string; pretty?: boolean }
10
+ options: { autoArchiveDuration?: string; pretty?: boolean },
11
11
  ): Promise<void> {
12
12
  try {
13
13
  const credManager = new DiscordCredentialManager()
14
14
  const config = await credManager.load()
15
15
 
16
16
  if (!config.token) {
17
- console.log(
18
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
19
- )
17
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
20
18
  process.exit(1)
21
19
  }
22
20
 
@@ -42,18 +40,13 @@ export async function createAction(
42
40
  }
43
41
  }
44
42
 
45
- export async function archiveAction(
46
- threadId: string,
47
- options: { pretty?: boolean }
48
- ): Promise<void> {
43
+ export async function archiveAction(threadId: string, options: { pretty?: boolean }): Promise<void> {
49
44
  try {
50
45
  const credManager = new DiscordCredentialManager()
51
46
  const config = await credManager.load()
52
47
 
53
48
  if (!config.token) {
54
- console.log(
55
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
56
- )
49
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
57
50
  process.exit(1)
58
51
  }
59
52
 
@@ -81,12 +74,12 @@ export const threadCommand = new Command('thread')
81
74
  .argument('<name>', 'Thread name')
82
75
  .option('--auto-archive-duration <minutes>', 'Auto archive duration in minutes')
83
76
  .option('--pretty', 'Pretty print JSON output')
84
- .action(createAction)
77
+ .action(createAction),
85
78
  )
86
79
  .addCommand(
87
80
  new Command('archive')
88
81
  .description('Archive a thread')
89
82
  .argument('<thread-id>', 'Thread ID')
90
83
  .option('--pretty', 'Pretty print JSON output')
91
- .action(archiveAction)
84
+ .action(archiveAction),
92
85
  )
@@ -1,6 +1,6 @@
1
1
  import { Command } from 'commander'
2
- import { handleError } from '../../../shared/utils/error-handler'
3
- import { formatOutput } from '../../../shared/utils/output'
2
+ import { handleError } from '@/shared/utils/error-handler'
3
+ import { formatOutput } from '@/shared/utils/output'
4
4
  import { DiscordClient } from '../client'
5
5
  import { DiscordCredentialManager } from '../credential-manager'
6
6
  import type { DiscordUser } from '../types'
@@ -11,19 +11,12 @@ async function listAction(options: { pretty?: boolean }): Promise<void> {
11
11
  const config = await credManager.load()
12
12
 
13
13
  if (!config.token) {
14
- console.log(
15
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
16
- )
14
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
17
15
  process.exit(1)
18
16
  }
19
17
 
20
18
  if (!config.current_server) {
21
- console.log(
22
- formatOutput(
23
- { error: 'No current server set. Run "server switch <id>" first.' },
24
- options.pretty
25
- )
26
- )
19
+ console.log(formatOutput({ error: 'No current server set. Run "server switch <id>" first.' }, options.pretty))
27
20
  process.exit(1)
28
21
  }
29
22
 
@@ -50,9 +43,7 @@ async function infoAction(userId: string, options: { pretty?: boolean }): Promis
50
43
  const config = await credManager.load()
51
44
 
52
45
  if (!config.token) {
53
- console.log(
54
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
55
- )
46
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
56
47
  process.exit(1)
57
48
  }
58
49
 
@@ -89,9 +80,7 @@ async function meAction(options: { pretty?: boolean }): Promise<void> {
89
80
  const config = await credManager.load()
90
81
 
91
82
  if (!config.token) {
92
- console.log(
93
- formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty)
94
- )
83
+ console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty))
95
84
  process.exit(1)
96
85
  }
97
86
 
@@ -118,18 +107,18 @@ export const userCommand = new Command('user')
118
107
  new Command('list')
119
108
  .description('List server members')
120
109
  .option('--pretty', 'Pretty print JSON output')
121
- .action(listAction)
110
+ .action(listAction),
122
111
  )
123
112
  .addCommand(
124
113
  new Command('info')
125
114
  .description('Get user info')
126
115
  .argument('<user-id>', 'User ID')
127
116
  .option('--pretty', 'Pretty print JSON output')
128
- .action(infoAction)
117
+ .action(infoAction),
129
118
  )
130
119
  .addCommand(
131
120
  new Command('me')
132
121
  .description('Show current authenticated user')
133
122
  .option('--pretty', 'Pretty print JSON output')
134
- .action(meAction)
123
+ .action(meAction),
135
124
  )
@@ -8,7 +8,7 @@ const testDirs: string[] = []
8
8
  function setup(): DiscordCredentialManager {
9
9
  const testConfigDir = join(
10
10
  import.meta.dir,
11
- `.test-discord-config-${Date.now()}-${Math.random().toString(36).slice(2)}`
11
+ `.test-discord-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
12
12
  )
13
13
  testDirs.push(testConfigDir)
14
14
  return new DiscordCredentialManager(testConfigDir)
@@ -35,7 +35,7 @@ describe('DiscordCredentialManager', () => {
35
35
  test('save creates config file with correct permissions', async () => {
36
36
  const testConfigDir = join(
37
37
  import.meta.dir,
38
- `.test-discord-config-${Date.now()}-${Math.random().toString(36).slice(2)}`
38
+ `.test-discord-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
39
39
  )
40
40
  testDirs.push(testConfigDir)
41
41
  const manager = new DiscordCredentialManager(testConfigDir)
@@ -83,9 +83,7 @@ export class DiscordCredentialManager {
83
83
  return config.servers
84
84
  }
85
85
 
86
- async setServers(
87
- servers: Record<string, { server_id: string; server_name: string }>
88
- ): Promise<void> {
86
+ async setServers(servers: Record<string, { server_id: string; server_name: string }>): Promise<void> {
89
87
  const config = await this.load()
90
88
  config.servers = servers
91
89
  await this.save(config)
@@ -82,10 +82,7 @@ describe('DiscordTokenExtractor', () => {
82
82
  describe('extract', () => {
83
83
  test('returns null when no Discord directories exist on linux', async () => {
84
84
  const linuxExtractor = new DiscordTokenExtractor('linux')
85
- const extractFromLevelDBSpy = spyOn(
86
- linuxExtractor as any,
87
- 'extractFromLevelDB'
88
- ).mockResolvedValue(null)
85
+ const extractFromLevelDBSpy = spyOn(linuxExtractor as any, 'extractFromLevelDB').mockResolvedValue(null)
89
86
 
90
87
  const result = await linuxExtractor.extract()
91
88
  expect(result).toBeNull()
@@ -97,10 +94,9 @@ describe('DiscordTokenExtractor', () => {
97
94
  const mockToken = 'XXXXXXXXXXXXXXXXXXXXXXXX.YYYYYY.ZZZZZZZZZZZZZZZZZZZZZZZZZ'
98
95
 
99
96
  const linuxExtractor = new DiscordTokenExtractor('linux')
100
- const extractFromLevelDBSpy = spyOn(
101
- linuxExtractor as any,
102
- 'extractFromLevelDB'
103
- ).mockResolvedValue({ token: mockToken })
97
+ const extractFromLevelDBSpy = spyOn(linuxExtractor as any, 'extractFromLevelDB').mockResolvedValue({
98
+ token: mockToken,
99
+ })
104
100
 
105
101
  const result = await linuxExtractor.extract()
106
102
 
@@ -114,14 +110,8 @@ describe('DiscordTokenExtractor', () => {
114
110
  const mockToken = 'XXXXXXXXXXXXXXXXXXXXXXXX.YYYYYY.cdp_token_12345678901234567'
115
111
 
116
112
  const darwinExtractor = new DiscordTokenExtractor('darwin', 0)
117
- const extractFromLevelDBSpy = spyOn(
118
- darwinExtractor as any,
119
- 'extractFromLevelDB'
120
- ).mockResolvedValue(null)
121
- const tryExtractViaCDPSpy = spyOn(
122
- darwinExtractor as any,
123
- 'tryExtractViaCDP'
124
- ).mockResolvedValue(mockToken)
113
+ const extractFromLevelDBSpy = spyOn(darwinExtractor as any, 'extractFromLevelDB').mockResolvedValue(null)
114
+ const tryExtractViaCDPSpy = spyOn(darwinExtractor as any, 'tryExtractViaCDP').mockResolvedValue(mockToken)
125
115
 
126
116
  const result = await darwinExtractor.extract()
127
117
 
@@ -136,10 +126,9 @@ describe('DiscordTokenExtractor', () => {
136
126
  const mockToken = 'XXXXXXXXXXXXXXXXXXXXXXXX.YYYYYY.first_token_found_1234567'
137
127
 
138
128
  const linuxExtractor = new DiscordTokenExtractor('linux')
139
- const extractFromLevelDBSpy = spyOn(
140
- linuxExtractor as any,
141
- 'extractFromLevelDB'
142
- ).mockResolvedValue({ token: mockToken })
129
+ const extractFromLevelDBSpy = spyOn(linuxExtractor as any, 'extractFromLevelDB').mockResolvedValue({
130
+ token: mockToken,
131
+ })
143
132
 
144
133
  const result = await linuxExtractor.extract()
145
134
 
@@ -186,10 +175,7 @@ describe('DiscordTokenExtractor', () => {
186
175
  describe('isDiscordRunning', () => {
187
176
  test('returns true when Discord process is found', async () => {
188
177
  const darwinExtractor = new DiscordTokenExtractor('darwin', 0, 0)
189
- const checkProcessRunningSpy = spyOn(
190
- darwinExtractor as any,
191
- 'checkProcessRunning'
192
- ).mockReturnValue(true)
178
+ const checkProcessRunningSpy = spyOn(darwinExtractor as any, 'checkProcessRunning').mockReturnValue(true)
193
179
 
194
180
  const result = await darwinExtractor.isDiscordRunning('stable')
195
181
  expect(result).toBe(true)
@@ -199,10 +185,7 @@ describe('DiscordTokenExtractor', () => {
199
185
 
200
186
  test('returns false when no Discord process is found', async () => {
201
187
  const darwinExtractor = new DiscordTokenExtractor('darwin', 0, 0)
202
- const checkProcessRunningSpy = spyOn(
203
- darwinExtractor as any,
204
- 'checkProcessRunning'
205
- ).mockReturnValue(false)
188
+ const checkProcessRunningSpy = spyOn(darwinExtractor as any, 'checkProcessRunning').mockReturnValue(false)
206
189
 
207
190
  const result = await darwinExtractor.isDiscordRunning('stable')
208
191
  expect(result).toBe(false)
@@ -213,13 +196,12 @@ describe('DiscordTokenExtractor', () => {
213
196
  test('checks all variants when no specific variant provided', async () => {
214
197
  const darwinExtractor = new DiscordTokenExtractor('darwin', 0, 0)
215
198
  const checkedProcesses: string[] = []
216
- const checkProcessRunningSpy = spyOn(
217
- darwinExtractor as any,
218
- 'checkProcessRunning'
219
- ).mockImplementation((name: string) => {
220
- checkedProcesses.push(name)
221
- return false
222
- })
199
+ const checkProcessRunningSpy = spyOn(darwinExtractor as any, 'checkProcessRunning').mockImplementation(
200
+ (name: string) => {
201
+ checkedProcesses.push(name)
202
+ return false
203
+ },
204
+ )
223
205
 
224
206
  await darwinExtractor.isDiscordRunning()
225
207
 
@@ -235,11 +217,9 @@ describe('DiscordTokenExtractor', () => {
235
217
  test('kills Discord process', async () => {
236
218
  const darwinExtractor = new DiscordTokenExtractor('darwin', 0, 0)
237
219
  const killedProcesses: string[] = []
238
- const killProcessSpy = spyOn(darwinExtractor as any, 'killProcess').mockImplementation(
239
- (name: string) => {
240
- killedProcesses.push(name)
241
- }
242
- )
220
+ const killProcessSpy = spyOn(darwinExtractor as any, 'killProcess').mockImplementation((name: string) => {
221
+ killedProcesses.push(name)
222
+ })
243
223
 
244
224
  await darwinExtractor.killDiscord('stable')
245
225
 
@@ -251,11 +231,9 @@ describe('DiscordTokenExtractor', () => {
251
231
  test('kills all variants when no specific variant provided', async () => {
252
232
  const darwinExtractor = new DiscordTokenExtractor('darwin', 0, 0)
253
233
  const killedProcesses: string[] = []
254
- const killProcessSpy = spyOn(darwinExtractor as any, 'killProcess').mockImplementation(
255
- (name: string) => {
256
- killedProcesses.push(name)
257
- }
258
- )
234
+ const killProcessSpy = spyOn(darwinExtractor as any, 'killProcess').mockImplementation((name: string) => {
235
+ killedProcesses.push(name)
236
+ })
259
237
 
260
238
  await darwinExtractor.killDiscord()
261
239
 
@@ -270,13 +248,9 @@ describe('DiscordTokenExtractor', () => {
270
248
  describe('launchDiscordWithDebug', () => {
271
249
  test('throws error when Discord app not found', async () => {
272
250
  const darwinExtractor = new DiscordTokenExtractor('darwin', 0, 0)
273
- const getAppPathSpy = spyOn(darwinExtractor as any, 'getAppPath').mockReturnValue(
274
- '/nonexistent/path'
275
- )
251
+ const getAppPathSpy = spyOn(darwinExtractor as any, 'getAppPath').mockReturnValue('/nonexistent/path')
276
252
 
277
- await expect(darwinExtractor.launchDiscordWithDebug('stable')).rejects.toThrow(
278
- 'Discord stable not found'
279
- )
253
+ await expect(darwinExtractor.launchDiscordWithDebug('stable')).rejects.toThrow('Discord stable not found')
280
254
 
281
255
  getAppPathSpy.mockRestore()
282
256
  })
@@ -429,10 +403,7 @@ describe('DiscordTokenExtractor', () => {
429
403
  globalThis.WebSocket = mockWebSocket as unknown as typeof WebSocket
430
404
 
431
405
  const extractor = new DiscordTokenExtractor('darwin')
432
- const result = await extractor.executeJSViaCDP(
433
- 'ws://localhost:9222/devtools/page/1',
434
- TOKEN_EXTRACTION_JS
435
- )
406
+ const result = await extractor.executeJSViaCDP('ws://localhost:9222/devtools/page/1', TOKEN_EXTRACTION_JS)
436
407
  expect(result).toBe(mockToken)
437
408
  })
438
409
 
@@ -467,7 +438,7 @@ describe('DiscordTokenExtractor', () => {
467
438
 
468
439
  const extractor = new DiscordTokenExtractor('darwin')
469
440
  await expect(
470
- extractor.executeJSViaCDP('ws://localhost:9222/devtools/page/1', TOKEN_EXTRACTION_JS)
441
+ extractor.executeJSViaCDP('ws://localhost:9222/devtools/page/1', TOKEN_EXTRACTION_JS),
471
442
  ).rejects.toThrow('Evaluation failed')
472
443
  })
473
444
 
@@ -491,7 +462,7 @@ describe('DiscordTokenExtractor', () => {
491
462
 
492
463
  const extractor = new DiscordTokenExtractor('darwin')
493
464
  await expect(
494
- extractor.executeJSViaCDP('ws://localhost:9222/devtools/page/1', TOKEN_EXTRACTION_JS)
465
+ extractor.executeJSViaCDP('ws://localhost:9222/devtools/page/1', TOKEN_EXTRACTION_JS),
495
466
  ).rejects.toThrow()
496
467
  })
497
468
  })