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.
- package/.claude-plugin/marketplace.json +27 -1
- package/.claude-plugin/plugin.json +17 -4
- package/.env.template +3 -0
- package/.github/workflows/release.yml +80 -0
- package/AGENTS.md +48 -0
- package/README.md +25 -20
- package/biome.json +15 -39
- package/bun.lock +69 -0
- package/dist/package.json +10 -3
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +1 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/platforms/discord/client.d.ts.map +1 -1
- package/dist/src/platforms/discord/client.js.map +1 -1
- package/dist/src/platforms/discord/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/auth.js.map +1 -1
- package/dist/src/platforms/discord/commands/channel.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/channel.js.map +1 -1
- package/dist/src/platforms/discord/commands/dm.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/dm.js.map +1 -1
- package/dist/src/platforms/discord/commands/file.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/file.js +1 -4
- package/dist/src/platforms/discord/commands/file.js.map +1 -1
- package/dist/src/platforms/discord/commands/friend.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/friend.js +1 -3
- package/dist/src/platforms/discord/commands/friend.js.map +1 -1
- package/dist/src/platforms/discord/commands/member.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/member.js.map +1 -1
- package/dist/src/platforms/discord/commands/mention.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/mention.js.map +1 -1
- package/dist/src/platforms/discord/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/message.js.map +1 -1
- package/dist/src/platforms/discord/commands/note.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/note.js.map +1 -1
- package/dist/src/platforms/discord/commands/profile.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/profile.js.map +1 -1
- package/dist/src/platforms/discord/commands/reaction.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/reaction.js.map +1 -1
- package/dist/src/platforms/discord/commands/server.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/server.js.map +1 -1
- package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/discord/commands/thread.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/thread.js.map +1 -1
- package/dist/src/platforms/discord/commands/user.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/user.js.map +1 -1
- package/dist/src/platforms/discord/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/discord/credential-manager.js.map +1 -1
- package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/discord/token-extractor.js +2 -7
- package/dist/src/platforms/discord/token-extractor.js.map +1 -1
- package/dist/src/platforms/slack/client.d.ts.map +1 -1
- package/dist/src/platforms/slack/client.js +2 -0
- package/dist/src/platforms/slack/client.js.map +1 -1
- package/dist/src/platforms/slack/commands/activity.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/activity.js.map +1 -1
- package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/auth.js.map +1 -1
- package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/channel.js.map +1 -1
- package/dist/src/platforms/slack/commands/drafts.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/drafts.js.map +1 -1
- package/dist/src/platforms/slack/commands/file.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/file.js +1 -4
- package/dist/src/platforms/slack/commands/file.js.map +1 -1
- package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/message.js.map +1 -1
- package/dist/src/platforms/slack/commands/reaction.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/reaction.js +1 -2
- package/dist/src/platforms/slack/commands/reaction.js.map +1 -1
- package/dist/src/platforms/slack/commands/saved.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/saved.js.map +1 -1
- package/dist/src/platforms/slack/commands/sections.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/sections.js.map +1 -1
- package/dist/src/platforms/slack/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/slack/commands/unread.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/unread.js.map +1 -1
- package/dist/src/platforms/slack/commands/user.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/user.js.map +1 -1
- package/dist/src/platforms/slack/commands/workspace.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/workspace.js.map +1 -1
- package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/slack/token-extractor.js +4 -5
- package/dist/src/platforms/slack/token-extractor.js.map +1 -1
- package/dist/src/platforms/slack/types.d.ts +24 -0
- package/dist/src/platforms/slack/types.d.ts.map +1 -1
- package/dist/src/platforms/slack/types.js +7 -0
- package/dist/src/platforms/slack/types.js.map +1 -1
- package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/cli.js +1 -1
- package/dist/src/platforms/slackbot/cli.js.map +1 -1
- package/dist/src/platforms/slackbot/client.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/client.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/channel.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/message.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/reaction.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/reaction.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/shared.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/shared.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/user.js.map +1 -1
- package/dist/src/platforms/slackbot/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/credential-manager.js +2 -4
- package/dist/src/platforms/slackbot/credential-manager.js.map +1 -1
- package/dist/src/platforms/teams/client.d.ts.map +1 -1
- package/dist/src/platforms/teams/client.js.map +1 -1
- package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/auth.js.map +1 -1
- package/dist/src/platforms/teams/commands/channel.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/channel.js.map +1 -1
- package/dist/src/platforms/teams/commands/file.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/file.js.map +1 -1
- package/dist/src/platforms/teams/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/message.js.map +1 -1
- package/dist/src/platforms/teams/commands/reaction.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/reaction.js.map +1 -1
- package/dist/src/platforms/teams/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/teams/commands/team.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/team.js +1 -4
- package/dist/src/platforms/teams/commands/team.js.map +1 -1
- package/dist/src/platforms/teams/commands/user.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/user.js.map +1 -1
- package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/teams/token-extractor.js +3 -1
- package/dist/src/platforms/teams/token-extractor.js.map +1 -1
- package/docs/content/docs/agent-skills.mdx +4 -4
- package/docs/content/docs/index.mdx +11 -18
- package/docs/content/docs/integrations/discord.mdx +65 -1
- package/docs/content/docs/integrations/slack.mdx +51 -1
- package/docs/content/docs/integrations/slackbot.mdx +11 -1
- package/docs/content/docs/integrations/teams.mdx +4 -1
- package/docs/content/docs/quick-start.mdx +3 -2
- package/docs/src/app/icon.png +0 -0
- package/docs/src/app/layout.config.tsx +8 -1
- package/package.json +16 -9
- package/scripts/prepublish.ts +11 -0
- package/skills/agent-discord/SKILL.md +14 -0
- package/skills/agent-slack/SKILL.md +14 -0
- package/skills/agent-slackbot/SKILL.md +14 -0
- package/skills/agent-teams/SKILL.md +14 -0
- package/src/cli.ts +1 -4
- package/src/platforms/discord/client.test.ts +6 -14
- package/src/platforms/discord/client.ts +12 -34
- package/src/platforms/discord/commands/auth.test.ts +2 -7
- package/src/platforms/discord/commands/auth.ts +14 -19
- package/src/platforms/discord/commands/channel.test.ts +18 -20
- package/src/platforms/discord/commands/channel.ts +9 -18
- package/src/platforms/discord/commands/dm.test.ts +1 -3
- package/src/platforms/discord/commands/dm.ts +6 -10
- package/src/platforms/discord/commands/file.ts +10 -23
- package/src/platforms/discord/commands/friend.ts +33 -35
- package/src/platforms/discord/commands/member.ts +5 -7
- package/src/platforms/discord/commands/mention.ts +5 -11
- package/src/platforms/discord/commands/message.test.ts +1 -3
- package/src/platforms/discord/commands/message.ts +23 -61
- package/src/platforms/discord/commands/note.ts +7 -15
- package/src/platforms/discord/commands/profile.ts +4 -6
- package/src/platforms/discord/commands/reaction.test.ts +1 -3
- package/src/platforms/discord/commands/reaction.ts +19 -29
- package/src/platforms/discord/commands/server.test.ts +14 -18
- package/src/platforms/discord/commands/server.ts +9 -15
- package/src/platforms/discord/commands/snapshot.ts +5 -7
- package/src/platforms/discord/commands/thread.ts +8 -15
- package/src/platforms/discord/commands/user.ts +9 -20
- package/src/platforms/discord/credential-manager.test.ts +2 -2
- package/src/platforms/discord/credential-manager.ts +1 -3
- package/src/platforms/discord/token-extractor.test.ts +28 -57
- package/src/platforms/discord/token-extractor.ts +10 -30
- package/src/platforms/discord/types.ts +1 -1
- package/src/platforms/slack/client.test.ts +14 -20
- package/src/platforms/slack/client.ts +6 -11
- package/src/platforms/slack/commands/activity.test.ts +3 -9
- package/src/platforms/slack/commands/activity.ts +7 -12
- package/src/platforms/slack/commands/auth.test.ts +2 -2
- package/src/platforms/slack/commands/auth.ts +15 -31
- package/src/platforms/slack/commands/channel.ts +10 -32
- package/src/platforms/slack/commands/drafts.ts +5 -14
- package/src/platforms/slack/commands/file.ts +9 -29
- package/src/platforms/slack/commands/message.ts +23 -67
- package/src/platforms/slack/commands/reaction.test.ts +37 -33
- package/src/platforms/slack/commands/reaction.ts +21 -51
- package/src/platforms/slack/commands/saved.ts +5 -14
- package/src/platforms/slack/commands/sections.ts +4 -11
- package/src/platforms/slack/commands/snapshot.test.ts +1 -3
- package/src/platforms/slack/commands/snapshot.ts +5 -10
- package/src/platforms/slack/commands/unread.test.ts +6 -8
- package/src/platforms/slack/commands/unread.ts +10 -33
- package/src/platforms/slack/commands/user.test.ts +1 -4
- package/src/platforms/slack/commands/user.ts +6 -8
- package/src/platforms/slack/commands/workspace.test.ts +1 -1
- package/src/platforms/slack/commands/workspace.ts +7 -12
- package/src/platforms/slack/token-extractor-node-test.ts +1 -1
- package/src/platforms/slack/token-extractor.ts +8 -17
- package/src/platforms/slack/types.ts +11 -1
- package/src/platforms/slackbot/cli.ts +1 -7
- package/src/platforms/slackbot/client.test.ts +7 -7
- package/src/platforms/slackbot/client.ts +4 -11
- package/src/platforms/slackbot/commands/auth.test.ts +1 -1
- package/src/platforms/slackbot/commands/auth.ts +7 -7
- package/src/platforms/slackbot/commands/channel.ts +4 -4
- package/src/platforms/slackbot/commands/message.ts +16 -29
- package/src/platforms/slackbot/commands/reaction.ts +6 -16
- package/src/platforms/slackbot/commands/shared.ts +2 -4
- package/src/platforms/slackbot/commands/user.ts +4 -4
- package/src/platforms/slackbot/credential-manager.ts +2 -7
- package/src/platforms/slackbot/types.ts +1 -1
- package/src/platforms/teams/client.test.ts +15 -32
- package/src/platforms/teams/client.ts +18 -51
- package/src/platforms/teams/commands/auth.test.ts +6 -16
- package/src/platforms/teams/commands/auth.ts +16 -26
- package/src/platforms/teams/commands/channel.test.ts +2 -5
- package/src/platforms/teams/commands/channel.ts +10 -20
- package/src/platforms/teams/commands/file.test.ts +1 -4
- package/src/platforms/teams/commands/file.ts +11 -21
- package/src/platforms/teams/commands/message.test.ts +1 -3
- package/src/platforms/teams/commands/message.ts +15 -25
- package/src/platforms/teams/commands/reaction.test.ts +2 -7
- package/src/platforms/teams/commands/reaction.ts +12 -16
- package/src/platforms/teams/commands/snapshot.ts +6 -11
- package/src/platforms/teams/commands/team.test.ts +15 -26
- package/src/platforms/teams/commands/team.ts +10 -19
- package/src/platforms/teams/commands/user.ts +8 -14
- package/src/platforms/teams/credential-manager.test.ts +2 -5
- package/src/platforms/teams/token-extractor.test.ts +21 -50
- package/src/platforms/teams/token-extractor.ts +12 -20
- package/src/platforms/teams/types.ts +1 -1
- package/src/shared/utils/concurrency.test.ts +2 -2
- package/src/shared/utils/concurrency.ts +1 -1
- package/.claude/commands/release.md +0 -92
- package/dist/src/platforms/discord/commands/guild.d.ts +0 -15
- package/dist/src/platforms/discord/commands/guild.d.ts.map +0 -1
- package/dist/src/platforms/discord/commands/guild.js +0 -102
- 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
|
-
|
|
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
|
-
|
|
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 '
|
|
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
|
-
|
|
405
|
-
|
|
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
|
|
@@ -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,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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"}
|