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
@@ -6,10 +6,7 @@ import { TeamsCredentialManager } from './credential-manager'
6
6
  const testDirs: string[] = []
7
7
 
8
8
  function setup(): TeamsCredentialManager {
9
- const testConfigDir = join(
10
- import.meta.dir,
11
- `.test-teams-config-${Date.now()}-${Math.random().toString(36).slice(2)}`
12
- )
9
+ const testConfigDir = join(import.meta.dir, `.test-teams-config-${Date.now()}-${Math.random().toString(36).slice(2)}`)
13
10
  testDirs.push(testConfigDir)
14
11
  return new TeamsCredentialManager(testConfigDir)
15
12
  }
@@ -31,7 +28,7 @@ describe('TeamsCredentialManager', () => {
31
28
  test('saveConfig creates config file with correct permissions', async () => {
32
29
  const testConfigDir = join(
33
30
  import.meta.dir,
34
- `.test-teams-config-${Date.now()}-${Math.random().toString(36).slice(2)}`
31
+ `.test-teams-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
35
32
  )
36
33
  testDirs.push(testConfigDir)
37
34
  const manager = new TeamsCredentialManager(testConfigDir)
@@ -29,7 +29,7 @@ describe('TeamsTokenExtractor', () => {
29
29
  'MSTeams',
30
30
  'EBWebView',
31
31
  'WV2Profile_tfw',
32
- 'Cookies'
32
+ 'Cookies',
33
33
  ),
34
34
  join(
35
35
  homedir(),
@@ -43,7 +43,7 @@ describe('TeamsTokenExtractor', () => {
43
43
  'MSTeams',
44
44
  'EBWebView',
45
45
  'WV2Profile_tfl',
46
- 'Cookies'
46
+ 'Cookies',
47
47
  ),
48
48
  join(
49
49
  homedir(),
@@ -57,7 +57,7 @@ describe('TeamsTokenExtractor', () => {
57
57
  'MSTeams',
58
58
  'EBWebView',
59
59
  'Default',
60
- 'Cookies'
60
+ 'Cookies',
61
61
  ),
62
62
  join(homedir(), 'Library', 'Application Support', 'Microsoft', 'Teams', 'Cookies'),
63
63
  ])
@@ -86,7 +86,7 @@ describe('TeamsTokenExtractor', () => {
86
86
  'MSTeams',
87
87
  'EBWebView',
88
88
  'WV2Profile_tfw',
89
- 'Cookies'
89
+ 'Cookies',
90
90
  ),
91
91
  join(
92
92
  localAppData,
@@ -97,7 +97,7 @@ describe('TeamsTokenExtractor', () => {
97
97
  'MSTeams',
98
98
  'EBWebView',
99
99
  'WV2Profile_tfl',
100
- 'Cookies'
100
+ 'Cookies',
101
101
  ),
102
102
  join(
103
103
  localAppData,
@@ -108,7 +108,7 @@ describe('TeamsTokenExtractor', () => {
108
108
  'MSTeams',
109
109
  'EBWebView',
110
110
  'Default',
111
- 'Cookies'
111
+ 'Cookies',
112
112
  ),
113
113
  join(appdata, 'Microsoft', 'Teams', 'Cookies'),
114
114
  ])
@@ -127,9 +127,7 @@ describe('TeamsTokenExtractor', () => {
127
127
  const darwinExtractor = new TeamsTokenExtractor('darwin')
128
128
  const path = darwinExtractor.getLocalStatePath()
129
129
 
130
- expect(path).toBe(
131
- join(homedir(), 'Library', 'Application Support', 'Microsoft', 'Teams', 'Local State')
132
- )
130
+ expect(path).toBe(join(homedir(), 'Library', 'Application Support', 'Microsoft', 'Teams', 'Local State'))
133
131
  })
134
132
 
135
133
  test('returns linux Local State path on Linux', () => {
@@ -166,8 +164,7 @@ describe('TeamsTokenExtractor', () => {
166
164
 
167
165
  describe('isValidSkypeToken', () => {
168
166
  test('validates JWT-like skype token format', () => {
169
- const validToken =
170
- 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.signature'
167
+ const validToken = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.signature'
171
168
  expect(extractor.isValidSkypeToken(validToken)).toBe(true)
172
169
  })
173
170
 
@@ -220,10 +217,7 @@ describe('TeamsTokenExtractor', () => {
220
217
  describe('extract', () => {
221
218
  test('returns null when cookies path does not exist', async () => {
222
219
  const linuxExtractor = new TeamsTokenExtractor('linux')
223
- const extractFromCookiesDBSpy = spyOn(
224
- linuxExtractor as any,
225
- 'extractFromCookiesDB'
226
- ).mockResolvedValue(null)
220
+ const extractFromCookiesDBSpy = spyOn(linuxExtractor as any, 'extractFromCookiesDB').mockResolvedValue(null)
227
221
 
228
222
  const result = await linuxExtractor.extract()
229
223
  expect(result).toBeNull()
@@ -232,14 +226,10 @@ describe('TeamsTokenExtractor', () => {
232
226
  })
233
227
 
234
228
  test('extracts token from cookies database when available', async () => {
235
- const mockToken =
236
- 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.signature_here'
229
+ const mockToken = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.signature_here'
237
230
 
238
231
  const linuxExtractor = new TeamsTokenExtractor('linux')
239
- const extractFromCookiesDBSpy = spyOn(
240
- linuxExtractor as any,
241
- 'extractFromCookiesDB'
242
- ).mockResolvedValue(mockToken)
232
+ const extractFromCookiesDBSpy = spyOn(linuxExtractor as any, 'extractFromCookiesDB').mockResolvedValue(mockToken)
243
233
 
244
234
  const result = await linuxExtractor.extract()
245
235
 
@@ -251,10 +241,7 @@ describe('TeamsTokenExtractor', () => {
251
241
 
252
242
  test('returns null when extraction fails', async () => {
253
243
  const darwinExtractor = new TeamsTokenExtractor('darwin')
254
- const extractFromCookiesDBSpy = spyOn(
255
- darwinExtractor as any,
256
- 'extractFromCookiesDB'
257
- ).mockResolvedValue(null)
244
+ const extractFromCookiesDBSpy = spyOn(darwinExtractor as any, 'extractFromCookiesDB').mockResolvedValue(null)
258
245
 
259
246
  const result = await darwinExtractor.extract()
260
247
  expect(result).toBeNull()
@@ -267,15 +254,9 @@ describe('TeamsTokenExtractor', () => {
267
254
  test('attempts to copy database to temp location', async () => {
268
255
  const darwinExtractor = new TeamsTokenExtractor('darwin')
269
256
 
270
- const copyFileSpy = spyOn(darwinExtractor as any, 'copyDatabaseToTemp').mockReturnValue(
271
- '/tmp/test-cookies'
272
- )
273
- const extractSpy = spyOn(darwinExtractor as any, 'extractFromSQLite').mockResolvedValue(
274
- 'test_token'
275
- )
276
- const cleanupSpy = spyOn(darwinExtractor as any, 'cleanupTempFile').mockImplementation(
277
- () => {}
278
- )
257
+ const copyFileSpy = spyOn(darwinExtractor as any, 'copyDatabaseToTemp').mockReturnValue('/tmp/test-cookies')
258
+ const extractSpy = spyOn(darwinExtractor as any, 'extractFromSQLite').mockResolvedValue('test_token')
259
+ const cleanupSpy = spyOn(darwinExtractor as any, 'cleanupTempFile').mockImplementation(() => {})
279
260
 
280
261
  const result = await (darwinExtractor as any).copyAndExtract('/path/to/Cookies')
281
262
 
@@ -292,11 +273,9 @@ describe('TeamsTokenExtractor', () => {
292
273
  test('returns null when copy fails (file locked)', async () => {
293
274
  const darwinExtractor = new TeamsTokenExtractor('darwin')
294
275
 
295
- const copyFileSpy = spyOn(darwinExtractor as any, 'copyDatabaseToTemp').mockImplementation(
296
- () => {
297
- throw new Error('EBUSY: resource busy or locked')
298
- }
299
- )
276
+ const copyFileSpy = spyOn(darwinExtractor as any, 'copyDatabaseToTemp').mockImplementation(() => {
277
+ throw new Error('EBUSY: resource busy or locked')
278
+ })
300
279
 
301
280
  const result = await (darwinExtractor as any).copyAndExtract('/path/to/Cookies')
302
281
 
@@ -349,9 +328,7 @@ describe('TeamsTokenExtractor', () => {
349
328
 
350
329
  test('returns null when all keychain variants fail', async () => {
351
330
  const darwinExtractor = new TeamsTokenExtractor('darwin')
352
- const execSyncSpy = spyOn(darwinExtractor as any, 'execSecurityCommand').mockReturnValue(
353
- null
354
- )
331
+ const execSyncSpy = spyOn(darwinExtractor as any, 'execSecurityCommand').mockReturnValue(null)
355
332
 
356
333
  const result = (darwinExtractor as any).getKeychainPassword()
357
334
 
@@ -366,10 +343,7 @@ describe('TeamsTokenExtractor', () => {
366
343
  describe('isTeamsRunning', () => {
367
344
  test('returns true when Teams process is found', async () => {
368
345
  const darwinExtractor = new TeamsTokenExtractor('darwin')
369
- const checkProcessRunningSpy = spyOn(
370
- darwinExtractor as any,
371
- 'checkProcessRunning'
372
- ).mockReturnValue(true)
346
+ const checkProcessRunningSpy = spyOn(darwinExtractor as any, 'checkProcessRunning').mockReturnValue(true)
373
347
 
374
348
  const result = await darwinExtractor.isTeamsRunning()
375
349
  expect(result).toBe(true)
@@ -379,10 +353,7 @@ describe('TeamsTokenExtractor', () => {
379
353
 
380
354
  test('returns false when no Teams process is found', async () => {
381
355
  const darwinExtractor = new TeamsTokenExtractor('darwin')
382
- const checkProcessRunningSpy = spyOn(
383
- darwinExtractor as any,
384
- 'checkProcessRunning'
385
- ).mockReturnValue(false)
356
+ const checkProcessRunningSpy = spyOn(darwinExtractor as any, 'checkProcessRunning').mockReturnValue(false)
386
357
 
387
358
  const result = await darwinExtractor.isTeamsRunning()
388
359
  expect(result).toBe(false)
@@ -3,7 +3,7 @@ import { createDecipheriv, pbkdf2Sync } from 'node:crypto'
3
3
  import { copyFileSync, existsSync, readFileSync, unlinkSync } from 'node:fs'
4
4
  import { homedir, tmpdir } from 'node:os'
5
5
  import { join } from 'node:path'
6
- import { DerivedKeyCache } from '../../shared/utils/derived-key-cache'
6
+ import { DerivedKeyCache } from '@/shared/utils/derived-key-cache'
7
7
 
8
8
  export interface ExtractedTeamsToken {
9
9
  token: string
@@ -55,7 +55,7 @@ export class TeamsTokenExtractor {
55
55
  'MSTeams',
56
56
  'EBWebView',
57
57
  'WV2Profile_tfw',
58
- 'Cookies'
58
+ 'Cookies',
59
59
  ),
60
60
  join(
61
61
  homedir(),
@@ -69,7 +69,7 @@ export class TeamsTokenExtractor {
69
69
  'MSTeams',
70
70
  'EBWebView',
71
71
  'WV2Profile_tfl',
72
- 'Cookies'
72
+ 'Cookies',
73
73
  ),
74
74
  join(
75
75
  homedir(),
@@ -83,7 +83,7 @@ export class TeamsTokenExtractor {
83
83
  'MSTeams',
84
84
  'EBWebView',
85
85
  'Default',
86
- 'Cookies'
86
+ 'Cookies',
87
87
  ),
88
88
  join(homedir(), 'Library', 'Application Support', 'Microsoft', 'Teams', 'Cookies'),
89
89
  ]
@@ -103,7 +103,7 @@ export class TeamsTokenExtractor {
103
103
  'MSTeams',
104
104
  'EBWebView',
105
105
  'WV2Profile_tfw',
106
- 'Cookies'
106
+ 'Cookies',
107
107
  ),
108
108
  join(
109
109
  localAppData,
@@ -114,7 +114,7 @@ export class TeamsTokenExtractor {
114
114
  'MSTeams',
115
115
  'EBWebView',
116
116
  'WV2Profile_tfl',
117
- 'Cookies'
117
+ 'Cookies',
118
118
  ),
119
119
  join(
120
120
  localAppData,
@@ -125,7 +125,7 @@ export class TeamsTokenExtractor {
125
125
  'MSTeams',
126
126
  'EBWebView',
127
127
  'Default',
128
- 'Cookies'
128
+ 'Cookies',
129
129
  ),
130
130
  // Classic Teams fallback
131
131
  join(appdata, 'Microsoft', 'Teams', 'Cookies'),
@@ -139,14 +139,7 @@ export class TeamsTokenExtractor {
139
139
  getLocalStatePath(): string {
140
140
  switch (this.platform) {
141
141
  case 'darwin':
142
- return join(
143
- homedir(),
144
- 'Library',
145
- 'Application Support',
146
- 'Microsoft',
147
- 'Teams',
148
- 'Local State'
149
- )
142
+ return join(homedir(), 'Library', 'Application Support', 'Microsoft', 'Teams', 'Local State')
150
143
  case 'linux':
151
144
  return join(homedir(), '.config', 'Microsoft', 'Microsoft Teams', 'Local State')
152
145
  case 'win32': {
@@ -160,7 +153,7 @@ export class TeamsTokenExtractor {
160
153
  'Microsoft',
161
154
  'MSTeams',
162
155
  'EBWebView',
163
- 'Local State'
156
+ 'Local State',
164
157
  )
165
158
  if (existsSync(newTeamsPath)) return newTeamsPath
166
159
  return join(appdata, 'Microsoft', 'Teams', 'Local State')
@@ -400,10 +393,9 @@ export class TeamsTokenExtractor {
400
393
  // Escape double quotes in service/account to prevent command injection
401
394
  const safeService = service.replace(/"/g, '\\"')
402
395
  const safeAccount = account.replace(/"/g, '\\"')
403
- const result = execSync(
404
- `security find-generic-password -s "${safeService}" -a "${safeAccount}" -w 2>/dev/null`,
405
- { encoding: 'utf8' }
406
- )
396
+ const result = execSync(`security find-generic-password -s "${safeService}" -a "${safeAccount}" -w 2>/dev/null`, {
397
+ encoding: 'utf8',
398
+ })
407
399
  return result.trim()
408
400
  } catch {
409
401
  return null
@@ -125,7 +125,7 @@ export const TeamsConfigSchema = z.object({
125
125
  z.object({
126
126
  team_id: z.string(),
127
127
  team_name: z.string(),
128
- })
128
+ }),
129
129
  ),
130
130
  })
131
131
 
@@ -16,7 +16,7 @@ describe('parallelMap', () => {
16
16
  await new Promise((r) => setTimeout(r, delay))
17
17
  return delay
18
18
  },
19
- 3
19
+ 3,
20
20
  )
21
21
  expect(results).toEqual([100, 50, 10])
22
22
  })
@@ -34,7 +34,7 @@ describe('parallelMap', () => {
34
34
  await new Promise((r) => setTimeout(r, 10))
35
35
  concurrent--
36
36
  },
37
- 2
37
+ 2,
38
38
  )
39
39
 
40
40
  expect(maxConcurrent).toBe(2)
@@ -1,7 +1,7 @@
1
1
  export async function parallelMap<T, R>(
2
2
  items: T[],
3
3
  fn: (item: T, index: number) => Promise<R>,
4
- concurrency = 5
4
+ concurrency = 5,
5
5
  ): Promise<R[]> {
6
6
  const results: R[] = new Array(items.length)
7
7
  let currentIndex = 0
@@ -1,92 +0,0 @@
1
- # Release Command
2
-
3
- Bump version and create a new release.
4
-
5
- ## Arguments
6
-
7
- - `$ARGUMENTS` - The new version number (e.g., `1.2.3`)
8
-
9
- ## Version Files to Update
10
-
11
- Update the version in these files:
12
-
13
- 1. **package.json** (line 3) - `"version": "X.X.X"`
14
- 2. **.claude-plugin/plugin.json** (line 3) - `"version": "X.X.X"`
15
- 3. **README.md** - OpenCode plugins example: `"agent-messenger@X.X.X"`
16
-
17
- Note: CLI files and tests read version from package.json automatically.
18
-
19
- ## Release Steps
20
-
21
- ### Step 1: Validate Version Argument
22
-
23
- Ensure `$ARGUMENTS` is provided and is a valid semver version (e.g., `1.2.3`).
24
- If not provided, ask the user for the version number.
25
-
26
- ### Step 2: Update Version in All Files
27
-
28
- Update the version string in each file listed above. Use the Edit tool for precise updates.
29
-
30
- ### Step 3: Build
31
-
32
- Run the build command:
33
- ```bash
34
- bun run build
35
- ```
36
-
37
- Ensure the build succeeds before proceeding.
38
-
39
- ### Step 4: Run Tests
40
-
41
- Run the test suite to ensure nothing is broken:
42
- ```bash
43
- bun test
44
- ```
45
-
46
- Ensure all tests pass before proceeding.
47
-
48
- ### Step 5: Create Commit
49
-
50
- Stage and commit all changes including:
51
- - Version file changes
52
- - Build output (dist/)
53
-
54
- Commit message format:
55
- ```
56
- $ARGUMENTS
57
- ```
58
-
59
- ### Step 6: Create Tag and Push
60
-
61
- Create a git tag **without** the `v` prefix:
62
- ```bash
63
- git tag $ARGUMENTS
64
- git push origin main
65
- git push origin $ARGUMENTS
66
- ```
67
-
68
- ### Step 7: Create GitHub Release
69
-
70
- Create a GitHub release using `gh release create`:
71
- - Tag: `$ARGUMENTS` (no `v` prefix)
72
- - Title: `$ARGUMENTS` (no `v` prefix)
73
- - Generate release notes automatically
74
-
75
- ```bash
76
- gh release create $ARGUMENTS --title "$ARGUMENTS" --generate-notes
77
- ```
78
-
79
- ### Step 8: Publish to npm
80
-
81
- Publish the package to npm registry:
82
- ```bash
83
- npm publish
84
- ```
85
-
86
- Note: The `prepublishOnly` script in package.json will run `bun run build` automatically, but since we already built in Step 3, this is redundant but harmless.
87
-
88
- ## Important Notes
89
-
90
- - **No `v` prefix**: Tags and release titles must NOT include the `v` prefix (use `1.2.3` not `v1.2.3`)
91
- - **Build artifacts**: The commit must include the build output in `dist/`
92
- - **Test validation**: Tests must pass before release
@@ -1,15 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function listAction(options: {
3
- pretty?: boolean;
4
- }): Promise<void>;
5
- export declare function infoAction(guildId: string, options: {
6
- pretty?: boolean;
7
- }): Promise<void>;
8
- export declare function switchAction(guildId: string, options: {
9
- pretty?: boolean;
10
- }): Promise<void>;
11
- export declare function currentAction(options: {
12
- pretty?: boolean;
13
- }): Promise<void>;
14
- export declare const guildCommand: Command;
15
- //# sourceMappingURL=guild.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guild.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/discord/commands/guild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7E;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B9F;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAehG;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhF;AAED,eAAO,MAAM,YAAY,SA2BtB,CAAA"}
@@ -1,102 +0,0 @@
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
- export async function listAction(options) {
7
- try {
8
- const credManager = new DiscordCredentialManager();
9
- const config = await credManager.load();
10
- const guilds = Object.values(config.guilds);
11
- const output = guilds.map((guild) => ({
12
- id: guild.guild_id,
13
- name: guild.guild_name,
14
- current: guild.guild_id === config.current_guild,
15
- }));
16
- console.log(formatOutput(output, options.pretty));
17
- }
18
- catch (error) {
19
- handleError(error);
20
- }
21
- }
22
- export async function infoAction(guildId, options) {
23
- try {
24
- const credManager = new DiscordCredentialManager();
25
- const config = await credManager.load();
26
- if (!config.token) {
27
- console.log(formatOutput({ error: 'Not authenticated. Run "auth extract" first.' }, options.pretty));
28
- process.exit(1);
29
- }
30
- const client = new DiscordClient(config.token);
31
- const guild = await client.getGuild(guildId);
32
- const output = {
33
- id: guild.id,
34
- name: guild.name,
35
- icon: guild.icon,
36
- owner: guild.owner,
37
- };
38
- console.log(formatOutput(output, options.pretty));
39
- }
40
- catch (error) {
41
- handleError(error);
42
- }
43
- }
44
- export async function switchAction(guildId, options) {
45
- try {
46
- const credManager = new DiscordCredentialManager();
47
- const config = await credManager.load();
48
- if (!config.guilds[guildId]) {
49
- console.log(formatOutput({ error: `Guild not found: ${guildId}` }, options.pretty));
50
- process.exit(1);
51
- }
52
- await credManager.setCurrentGuild(guildId);
53
- console.log(formatOutput({ current: guildId }, options.pretty));
54
- }
55
- catch (error) {
56
- handleError(error);
57
- }
58
- }
59
- export async function currentAction(options) {
60
- try {
61
- const credManager = new DiscordCredentialManager();
62
- const config = await credManager.load();
63
- if (!config.current_guild) {
64
- console.log(formatOutput({ error: 'No current guild set. Run "auth extract" first.' }, options.pretty));
65
- process.exit(1);
66
- }
67
- const guild = config.guilds[config.current_guild];
68
- if (!guild) {
69
- console.log(formatOutput({ error: 'Current guild not found in configuration.' }, options.pretty));
70
- process.exit(1);
71
- }
72
- const output = {
73
- guild_id: guild.guild_id,
74
- guild_name: guild.guild_name,
75
- };
76
- console.log(formatOutput(output, options.pretty));
77
- }
78
- catch (error) {
79
- handleError(error);
80
- }
81
- }
82
- export const guildCommand = new Command('guild')
83
- .description('Guild management commands')
84
- .addCommand(new Command('list')
85
- .description('List all guilds')
86
- .option('--pretty', 'Pretty print JSON output')
87
- .action(listAction))
88
- .addCommand(new Command('info')
89
- .description('Get guild info')
90
- .argument('<guild-id>', 'Guild ID')
91
- .option('--pretty', 'Pretty print JSON output')
92
- .action(infoAction))
93
- .addCommand(new Command('switch')
94
- .description('Switch to guild')
95
- .argument('<guild-id>', 'Guild ID')
96
- .option('--pretty', 'Pretty print JSON output')
97
- .action(switchAction))
98
- .addCommand(new Command('current')
99
- .description('Show current guild')
100
- .option('--pretty', 'Pretty print JSON output')
101
- .action(currentAction));
102
- //# sourceMappingURL=guild.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guild.js","sourceRoot":"","sources":["../../../../../src/platforms/discord/commands/guild.ts"],"names":[],"mappings":"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"}