agent-messenger 2.31.0 → 2.32.1
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/plugin.json +1 -1
- package/README.md +14 -1
- package/bun.lock +7 -0
- package/dist/package.json +2 -1
- package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/token-extractor.js +67 -18
- package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
- package/dist/src/platforms/discord/client.d.ts +11 -2
- package/dist/src/platforms/discord/client.d.ts.map +1 -1
- package/dist/src/platforms/discord/client.js +109 -4
- package/dist/src/platforms/discord/client.js.map +1 -1
- package/dist/src/platforms/discord/commands/channel.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/channel.js +3 -2
- package/dist/src/platforms/discord/commands/channel.js.map +1 -1
- package/dist/src/platforms/discord/commands/mention.d.ts +5 -0
- package/dist/src/platforms/discord/commands/mention.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/mention.js +60 -4
- package/dist/src/platforms/discord/commands/mention.js.map +1 -1
- package/dist/src/platforms/discord/commands/reaction.js +1 -1
- package/dist/src/platforms/discord/commands/reaction.js.map +1 -1
- package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/snapshot.js +7 -6
- package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/discord/index.d.ts +1 -1
- package/dist/src/platforms/discord/index.d.ts.map +1 -1
- package/dist/src/platforms/discord/index.js.map +1 -1
- package/dist/src/platforms/discord/listener.d.ts +4 -1
- package/dist/src/platforms/discord/listener.d.ts.map +1 -1
- package/dist/src/platforms/discord/listener.js +28 -1
- package/dist/src/platforms/discord/listener.js.map +1 -1
- package/dist/src/platforms/discord/types.d.ts +60 -9
- package/dist/src/platforms/discord/types.d.ts.map +1 -1
- package/dist/src/platforms/discord/types.js +58 -7
- package/dist/src/platforms/discord/types.js.map +1 -1
- package/dist/src/platforms/slack/index.d.ts +1 -0
- package/dist/src/platforms/slack/index.d.ts.map +1 -1
- package/dist/src/platforms/slack/index.js.map +1 -1
- package/dist/src/platforms/slack/qr-confirmation.d.ts +19 -0
- package/dist/src/platforms/slack/qr-confirmation.d.ts.map +1 -0
- package/dist/src/platforms/slack/qr-confirmation.js +68 -0
- package/dist/src/platforms/slack/qr-confirmation.js.map +1 -0
- package/dist/src/platforms/slack/qr-cookie-jar.d.ts +7 -0
- package/dist/src/platforms/slack/qr-cookie-jar.d.ts.map +1 -0
- package/dist/src/platforms/slack/qr-cookie-jar.js +48 -0
- package/dist/src/platforms/slack/qr-cookie-jar.js.map +1 -0
- package/dist/src/platforms/slack/qr-http-login.d.ts +2 -1
- package/dist/src/platforms/slack/qr-http-login.d.ts.map +1 -1
- package/dist/src/platforms/slack/qr-http-login.js +88 -53
- package/dist/src/platforms/slack/qr-http-login.js.map +1 -1
- package/docs/content/docs/cli/channeltalk.mdx +4 -4
- package/docs/content/docs/cli/discord.mdx +7 -0
- package/docs/content/docs/sdk/discord.mdx +38 -0
- package/e2e/README.md +2 -2
- package/e2e/discord.e2e.test.ts +16 -2
- package/package.json +2 -1
- package/skills/agent-channeltalk/SKILL.md +5 -5
- package/skills/agent-channeltalk/references/authentication.md +9 -5
- package/skills/agent-channeltalkbot/SKILL.md +1 -1
- package/skills/agent-discord/SKILL.md +26 -4
- package/skills/agent-discord/references/common-patterns.md +7 -3
- package/skills/agent-discordbot/SKILL.md +1 -1
- package/skills/agent-imessage/SKILL.md +1 -1
- package/skills/agent-instagram/SKILL.md +1 -1
- package/skills/agent-kakaotalk/SKILL.md +1 -1
- package/skills/agent-line/SKILL.md +1 -1
- package/skills/agent-slack/SKILL.md +25 -2
- package/skills/agent-slackbot/SKILL.md +1 -1
- package/skills/agent-teams/SKILL.md +1 -1
- package/skills/agent-telegram/SKILL.md +1 -1
- package/skills/agent-telegrambot/SKILL.md +1 -1
- package/skills/agent-webex/SKILL.md +1 -1
- package/skills/agent-webexbot/SKILL.md +1 -1
- package/skills/agent-wechatbot/SKILL.md +1 -1
- package/skills/agent-whatsapp/SKILL.md +1 -1
- package/skills/agent-whatsappbot/SKILL.md +1 -1
- package/src/platforms/channeltalk/token-extractor.test.ts +235 -0
- package/src/platforms/channeltalk/token-extractor.ts +81 -22
- package/src/platforms/discord/client.test.ts +230 -9
- package/src/platforms/discord/client.ts +122 -5
- package/src/platforms/discord/commands/channel.test.ts +33 -23
- package/src/platforms/discord/commands/channel.ts +3 -2
- package/src/platforms/discord/commands/mention.test.ts +84 -0
- package/src/platforms/discord/commands/mention.ts +78 -15
- package/src/platforms/discord/commands/reaction.test.ts +1 -1
- package/src/platforms/discord/commands/reaction.ts +1 -1
- package/src/platforms/discord/commands/snapshot.test.ts +80 -2
- package/src/platforms/discord/commands/snapshot.ts +7 -6
- package/src/platforms/discord/index.ts +3 -0
- package/src/platforms/discord/listener.test.ts +69 -2
- package/src/platforms/discord/listener.ts +31 -2
- package/src/platforms/discord/types.test.ts +56 -0
- package/src/platforms/discord/types.ts +91 -10
- package/src/platforms/slack/index.ts +1 -0
- package/src/platforms/slack/qr-confirmation.ts +86 -0
- package/src/platforms/slack/qr-cookie-jar.ts +54 -0
- package/src/platforms/slack/qr-http-login-2fa.test.ts +398 -0
- package/src/platforms/slack/qr-http-login.test.ts +10 -18
- package/src/platforms/slack/qr-http-login.ts +109 -52
|
@@ -2,6 +2,42 @@
|
|
|
2
2
|
* Core type definitions for Discord platform
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
+
// https://discord.com/developers/docs/resources/channel#channel-object-channel-types
|
|
6
|
+
export const DiscordChannelType = {
|
|
7
|
+
GUILD_TEXT: 0,
|
|
8
|
+
DM: 1,
|
|
9
|
+
GUILD_VOICE: 2,
|
|
10
|
+
GROUP_DM: 3,
|
|
11
|
+
GUILD_CATEGORY: 4,
|
|
12
|
+
GUILD_ANNOUNCEMENT: 5,
|
|
13
|
+
ANNOUNCEMENT_THREAD: 10,
|
|
14
|
+
PUBLIC_THREAD: 11,
|
|
15
|
+
PRIVATE_THREAD: 12,
|
|
16
|
+
GUILD_STAGE_VOICE: 13,
|
|
17
|
+
GUILD_DIRECTORY: 14,
|
|
18
|
+
GUILD_FORUM: 15,
|
|
19
|
+
GUILD_MEDIA: 16,
|
|
20
|
+
};
|
|
21
|
+
const THREAD_CHANNEL_TYPES = new Set([
|
|
22
|
+
DiscordChannelType.ANNOUNCEMENT_THREAD,
|
|
23
|
+
DiscordChannelType.PUBLIC_THREAD,
|
|
24
|
+
DiscordChannelType.PRIVATE_THREAD,
|
|
25
|
+
]);
|
|
26
|
+
// Channels with no directly fetchable message timeline:
|
|
27
|
+
// forum/media messages live in child posts/threads, and directory channels
|
|
28
|
+
// are hub listings, not message channels. Fetching messages from these aborts.
|
|
29
|
+
const NON_MESSAGE_CHANNEL_TYPES = new Set([
|
|
30
|
+
DiscordChannelType.GUILD_FORUM,
|
|
31
|
+
DiscordChannelType.GUILD_MEDIA,
|
|
32
|
+
DiscordChannelType.GUILD_DIRECTORY,
|
|
33
|
+
]);
|
|
34
|
+
// Voice/stage channels are listed too because they carry embedded text chat.
|
|
35
|
+
export function isListableChannel(channel) {
|
|
36
|
+
return channel.type !== DiscordChannelType.GUILD_CATEGORY && !THREAD_CHANNEL_TYPES.has(channel.type);
|
|
37
|
+
}
|
|
38
|
+
export function isMessageReadableChannel(channel) {
|
|
39
|
+
return isListableChannel(channel) && !NON_MESSAGE_CHANNEL_TYPES.has(channel.type);
|
|
40
|
+
}
|
|
5
41
|
// Zod validation schemas
|
|
6
42
|
export const DiscordGuildSchema = z.object({
|
|
7
43
|
id: z.string(),
|
|
@@ -17,6 +53,13 @@ export const DiscordChannelSchema = z.object({
|
|
|
17
53
|
topic: z.string().optional(),
|
|
18
54
|
position: z.number().optional(),
|
|
19
55
|
});
|
|
56
|
+
export const DiscordReactionSchema = z.object({
|
|
57
|
+
emoji: z.object({
|
|
58
|
+
id: z.string().nullish(),
|
|
59
|
+
name: z.string().nullable(),
|
|
60
|
+
}),
|
|
61
|
+
count: z.number(),
|
|
62
|
+
});
|
|
20
63
|
export const DiscordMessageSchema = z.object({
|
|
21
64
|
id: z.string(),
|
|
22
65
|
channel_id: z.string(),
|
|
@@ -28,6 +71,7 @@ export const DiscordMessageSchema = z.object({
|
|
|
28
71
|
timestamp: z.string(),
|
|
29
72
|
edited_timestamp: z.string().optional(),
|
|
30
73
|
thread_id: z.string().optional(),
|
|
74
|
+
reactions: z.array(DiscordReactionSchema).optional(),
|
|
31
75
|
});
|
|
32
76
|
export const DiscordUserSchema = z.object({
|
|
33
77
|
id: z.string(),
|
|
@@ -43,13 +87,6 @@ export const DiscordDMChannelSchema = z.object({
|
|
|
43
87
|
recipients: z.array(DiscordUserSchema),
|
|
44
88
|
name: z.string().optional(),
|
|
45
89
|
});
|
|
46
|
-
export const DiscordReactionSchema = z.object({
|
|
47
|
-
emoji: z.object({
|
|
48
|
-
id: z.string().optional(),
|
|
49
|
-
name: z.string(),
|
|
50
|
-
}),
|
|
51
|
-
count: z.number(),
|
|
52
|
-
});
|
|
53
90
|
export const DiscordFileSchema = z.object({
|
|
54
91
|
id: z.string(),
|
|
55
92
|
filename: z.string(),
|
|
@@ -139,6 +176,20 @@ export const DiscordIntent = {
|
|
|
139
176
|
DirectMessageTyping: 1 << 14,
|
|
140
177
|
MessageContent: 1 << 15, // privileged
|
|
141
178
|
};
|
|
179
|
+
// read_state_type 0 = channel read state (carries last_message_id); non-zero types
|
|
180
|
+
// carry last_acked_id instead and must be filtered out for mention correlation.
|
|
181
|
+
export const DiscordRawReadStateSchema = z.object({
|
|
182
|
+
id: z.string(),
|
|
183
|
+
read_state_type: z.number().optional(),
|
|
184
|
+
last_message_id: z.string().nullish(),
|
|
185
|
+
mention_count: z.number().optional(),
|
|
186
|
+
});
|
|
187
|
+
// READY sends read_state as a raw array, or as { entries, version } when the
|
|
188
|
+
// VERSIONED_READ_STATES gateway capability is negotiated.
|
|
189
|
+
export const DiscordReadyReadStateSchema = z.union([
|
|
190
|
+
z.array(z.unknown()),
|
|
191
|
+
z.object({ entries: z.array(z.unknown()), version: z.number().optional() }),
|
|
192
|
+
]);
|
|
142
193
|
export class DiscordError extends Error {
|
|
143
194
|
code;
|
|
144
195
|
constructor(message, code) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/platforms/discord/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/platforms/discord/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ export { SlackCredentialManager, CredentialManager } from './credential-manager.
|
|
|
3
3
|
export { SlackListener } from './listener.js';
|
|
4
4
|
export { loginWithQr } from './qr-http-login.js';
|
|
5
5
|
export type { QrLoginOptions, QrSession } from './qr-http-login.js';
|
|
6
|
+
export type { SlackConfirmationChallenge, SlackConfirmationCodeRequest } from './qr-confirmation.js';
|
|
6
7
|
export { decodeSlackQr } from './qr-login.js';
|
|
7
8
|
export type { SlackQrLogin } from './qr-login.js';
|
|
8
9
|
export type { SlackBookmark, SlackChannel, SlackMessage, SlackPin, SlackReminder, SlackScheduledMessage, SlackUser, SlackUserProfile, SlackUsergroup, SlackReaction, SlackFile, SlackSearchResult, SlackUnreadCounts, SlackThreadView, SlackSavedItem, SlackActivityItem, SlackDM, SlackDraft, SlackChannelSection, SlackRTMEvent, SlackRTMMessageEvent, SlackRTMReactionEvent, SlackRTMMemberEvent, SlackRTMChannelEvent, SlackRTMPresenceEvent, SlackRTMUserTypingEvent, SlackRTMGenericEvent, SlackListenerEventMap, WorkspaceCredentials, Config, } from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,OAAO,EACP,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,GACP,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,YAAY,GACb,MAAM,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,OAAO,EACP,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,MAAM,GACP,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,YAAY,GACb,MAAM,SAAS,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platforms/slack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platforms/slack/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAkC1C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,YAAY,GACb,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SlackQrLogin } from './qr-login.js';
|
|
2
|
+
export interface SlackConfirmationChallenge {
|
|
3
|
+
readonly email: string;
|
|
4
|
+
readonly type: string | null;
|
|
5
|
+
}
|
|
6
|
+
export type SlackConfirmationCodeRequest = (challenge: SlackConfirmationChallenge) => Promise<string>;
|
|
7
|
+
type SigninProps = {
|
|
8
|
+
readonly magicLogin: string;
|
|
9
|
+
readonly emailAddress: string;
|
|
10
|
+
readonly twoFactorType: string | null;
|
|
11
|
+
};
|
|
12
|
+
export declare function parseConfirmationPage(html: string): SigninProps | null;
|
|
13
|
+
export declare function buildConfirmationRequest(login: SlackQrLogin, finalUrl: string, props: SigninProps, code: string): {
|
|
14
|
+
readonly url: string;
|
|
15
|
+
readonly body: string;
|
|
16
|
+
} | null;
|
|
17
|
+
export declare function expectedConfirmationPath(login: SlackQrLogin): string | null;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=qr-confirmation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-confirmation.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/qr-confirmation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,MAAM,4BAA4B,GAAG,CAAC,SAAS,EAAE,0BAA0B,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAErG,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CACtC,CAAA;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAsBtE;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,MAAM,GACX;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsBxD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAI3E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export function parseConfirmationPage(html) {
|
|
2
|
+
const match = html.match(/id="props_node"[^>]*\bdata-props="([^"]*)"/i);
|
|
3
|
+
const encoded = match?.[1];
|
|
4
|
+
if (!encoded)
|
|
5
|
+
return null;
|
|
6
|
+
let parsed;
|
|
7
|
+
try {
|
|
8
|
+
parsed = JSON.parse(decodeHtml(encoded));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
if (!isRecord(parsed))
|
|
14
|
+
return null;
|
|
15
|
+
const magicLogin = parsed.magicLogin;
|
|
16
|
+
const emailAddress = parsed.emailAddress;
|
|
17
|
+
if (typeof magicLogin !== 'string' || magicLogin === '')
|
|
18
|
+
return null;
|
|
19
|
+
if (typeof emailAddress !== 'string' || emailAddress === '')
|
|
20
|
+
return null;
|
|
21
|
+
return {
|
|
22
|
+
magicLogin,
|
|
23
|
+
emailAddress,
|
|
24
|
+
twoFactorType: typeof parsed.twoFactorType === 'string' ? parsed.twoFactorType : null,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function buildConfirmationRequest(login, finalUrl, props, code) {
|
|
28
|
+
const expected = expectedConfirmationPath(login);
|
|
29
|
+
if (!expected)
|
|
30
|
+
return null;
|
|
31
|
+
const url = new URL(finalUrl);
|
|
32
|
+
if (url.hostname !== `${login.workspace}.slack.com`)
|
|
33
|
+
return null;
|
|
34
|
+
if (url.pathname !== expected)
|
|
35
|
+
return null;
|
|
36
|
+
url.search = '';
|
|
37
|
+
url.searchParams.set('domain', login.workspace);
|
|
38
|
+
url.searchParams.set('domainLogin', '1');
|
|
39
|
+
url.searchParams.set('email', props.emailAddress);
|
|
40
|
+
return {
|
|
41
|
+
url: url.toString(),
|
|
42
|
+
body: new URLSearchParams({
|
|
43
|
+
'2fa_magiclogin': props.magicLogin,
|
|
44
|
+
remember: '0',
|
|
45
|
+
has_remember: 'false',
|
|
46
|
+
'2fa_code': code.trim(),
|
|
47
|
+
'2fa_action': 'submit_primary',
|
|
48
|
+
}).toString(),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function expectedConfirmationPath(login) {
|
|
52
|
+
const qrSecret = new URL(login.url).pathname.split('/').at(-1);
|
|
53
|
+
if (!qrSecret || !qrSecret.startsWith('z-app-'))
|
|
54
|
+
return null;
|
|
55
|
+
return `/login/${qrSecret}`;
|
|
56
|
+
}
|
|
57
|
+
function decodeHtml(value) {
|
|
58
|
+
return value
|
|
59
|
+
.replaceAll('"', '"')
|
|
60
|
+
.replaceAll(''', "'")
|
|
61
|
+
.replaceAll('<', '<')
|
|
62
|
+
.replaceAll('>', '>')
|
|
63
|
+
.replaceAll('&', '&');
|
|
64
|
+
}
|
|
65
|
+
function isRecord(value) {
|
|
66
|
+
return typeof value === 'object' && value !== null;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=qr-confirmation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-confirmation.js","sourceRoot":"","sources":["../../../../src/platforms/slack/qr-confirmation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare class SlackCookieJar {
|
|
2
|
+
#private;
|
|
3
|
+
fetch(doFetch: typeof fetch, url: string, init?: RequestInit): Promise<Response>;
|
|
4
|
+
sessionCookie(url: string): Promise<string | null>;
|
|
5
|
+
}
|
|
6
|
+
export declare function setCookieNames(response: Response): readonly string[];
|
|
7
|
+
//# sourceMappingURL=qr-cookie-jar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-cookie-jar.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/qr-cookie-jar.ts"],"names":[],"mappings":"AAQA,qBAAa,cAAc;;IAGnB,KAAK,CAAC,OAAO,EAAE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBzF;IAEK,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQvD;CACF;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,CAKpE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CookieJar } from 'tough-cookie';
|
|
2
|
+
const BROWSER_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36';
|
|
3
|
+
const SESSION_COOKIE_NAME = 'd';
|
|
4
|
+
const SESSION_COOKIE_PREFIX = 'xoxd-';
|
|
5
|
+
export class SlackCookieJar {
|
|
6
|
+
#jar = new CookieJar();
|
|
7
|
+
async fetch(doFetch, url, init = {}) {
|
|
8
|
+
const cookie = await this.#jar.getCookieString(url);
|
|
9
|
+
const response = await doFetch(url, {
|
|
10
|
+
...init,
|
|
11
|
+
redirect: 'manual',
|
|
12
|
+
headers: {
|
|
13
|
+
'User-Agent': BROWSER_USER_AGENT,
|
|
14
|
+
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
15
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
16
|
+
...init.headers,
|
|
17
|
+
...(cookie ? { Cookie: cookie } : {}),
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
for (const setCookie of getSetCookies(response)) {
|
|
21
|
+
await this.#jar.setCookie(setCookie, url, { ignoreError: true });
|
|
22
|
+
}
|
|
23
|
+
return response;
|
|
24
|
+
}
|
|
25
|
+
async sessionCookie(url) {
|
|
26
|
+
const cookies = await this.#jar.getCookies(url);
|
|
27
|
+
for (const cookie of cookies) {
|
|
28
|
+
if (cookie.key === SESSION_COOKIE_NAME && cookie.value.startsWith(SESSION_COOKIE_PREFIX)) {
|
|
29
|
+
return cookie.value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function setCookieNames(response) {
|
|
36
|
+
return getSetCookies(response).flatMap((setCookie) => {
|
|
37
|
+
const name = setCookie.split('=')[0]?.trim();
|
|
38
|
+
return name ? [name] : [];
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function getSetCookies(response) {
|
|
42
|
+
const withGetter = response.headers;
|
|
43
|
+
if (typeof withGetter.getSetCookie === 'function')
|
|
44
|
+
return withGetter.getSetCookie();
|
|
45
|
+
const single = response.headers.get('set-cookie');
|
|
46
|
+
return single ? [single] : [];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=qr-cookie-jar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr-cookie-jar.js","sourceRoot":"","sources":["../../../../src/platforms/slack/qr-cookie-jar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,MAAM,kBAAkB,GACtB,uHAAuH,CAAA;AAEzH,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAC/B,MAAM,qBAAqB,GAAG,OAAO,CAAA;AAErC,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,IAAI,SAAS,EAAE,CAAA;IAE/B,KAAK,CAAC,KAAK,CAAC,OAAqB,EAAE,GAAW,EAAE,IAAI,GAAgB,EAAE;QACpE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;YAClC,GAAG,IAAI;YACP,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE;gBACP,YAAY,EAAE,kBAAkB;gBAChC,MAAM,EAAE,iEAAiE;gBACzE,iBAAiB,EAAE,gBAAgB;gBACnC,GAAG,IAAI,CAAC,OAAO;gBACf,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtC;SACF,CAAC,CAAA;QACF,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;QAClE,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAW;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QAC/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,GAAG,KAAK,mBAAmB,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBACzF,OAAO,MAAM,CAAC,KAAK,CAAA;YACrB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;QAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAkB;IACvC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAsD,CAAA;IAClF,IAAI,OAAO,UAAU,CAAC,YAAY,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC,YAAY,EAAE,CAAA;IACnF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACjD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC/B,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SlackConfirmationCodeRequest } from './qr-confirmation.js';
|
|
1
2
|
export interface QrSession {
|
|
2
3
|
token: string;
|
|
3
4
|
cookie: string;
|
|
@@ -7,8 +8,8 @@ export interface QrLoginOptions {
|
|
|
7
8
|
fetchImpl?: typeof fetch;
|
|
8
9
|
maxRedirects?: number;
|
|
9
10
|
debug?: (message: string) => void;
|
|
11
|
+
requestConfirmationCode?: SlackConfirmationCodeRequest;
|
|
10
12
|
}
|
|
11
13
|
export declare function loginWithQr(dataUrl: string, options?: QrLoginOptions): Promise<QrSession>;
|
|
12
14
|
export declare function isSlackHost(rawUrl: string): boolean;
|
|
13
|
-
export declare function parseDCookie(setCookieHeader: string): string | null;
|
|
14
15
|
//# sourceMappingURL=qr-http-login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qr-http-login.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/qr-http-login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"qr-http-login.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/qr-http-login.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,4BAA4B,EAClC,MAAM,mBAAmB,CAAA;AAI1B,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,uBAAuB,CAAC,EAAE,4BAA4B,CAAA;CACvD;AAID,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAwBnG;AA+ND,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQnD"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { SlackError } from './client.js';
|
|
2
2
|
import { refreshTokenFromWeb } from './ensure-auth.js';
|
|
3
|
+
import { buildConfirmationRequest, expectedConfirmationPath, parseConfirmationPage, } from './qr-confirmation.js';
|
|
4
|
+
import { setCookieNames, SlackCookieJar } from './qr-cookie-jar.js';
|
|
3
5
|
import { decodeSlackQr } from './qr-login.js';
|
|
4
|
-
const BROWSER_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36';
|
|
5
6
|
const DEFAULT_MAX_REDIRECTS = 10;
|
|
6
7
|
export async function loginWithQr(dataUrl, options = {}) {
|
|
7
8
|
const login = decodeSlackQr(dataUrl.trim());
|
|
8
9
|
const debug = options.debug;
|
|
9
10
|
debug?.(`Decoded QR for workspace ${login.workspace}`);
|
|
10
|
-
const { cookie, denialReason, ssoProvider } = await captureDCookie(login
|
|
11
|
+
const { cookie, denialReason, ssoProvider } = await captureDCookie(login, options);
|
|
11
12
|
if (!cookie) {
|
|
12
13
|
throw new SlackError(qrSessionFailureMessage(denialReason, { workspace: login.workspace, ssoProvider }), 'qr_session_failed');
|
|
13
14
|
}
|
|
@@ -65,15 +66,16 @@ function qrSessionFailureMessage(denialReason, context = {}) {
|
|
|
65
66
|
'to Slack.',
|
|
66
67
|
].join('\n');
|
|
67
68
|
}
|
|
68
|
-
async function captureDCookie(
|
|
69
|
+
async function captureDCookie(login, options) {
|
|
69
70
|
const doFetch = options.fetchImpl ?? fetch;
|
|
70
71
|
const maxRedirects = options.maxRedirects ?? DEFAULT_MAX_REDIRECTS;
|
|
71
72
|
const debug = options.debug;
|
|
72
|
-
let url =
|
|
73
|
+
let url = login.url;
|
|
73
74
|
let dCookie = null;
|
|
74
75
|
let sessionDenialReason = null;
|
|
75
76
|
let ssoProvider = null;
|
|
76
|
-
const cookieJar =
|
|
77
|
+
const cookieJar = new SlackCookieJar();
|
|
78
|
+
const sessionCookieUrl = tokenUrl(login.workspace);
|
|
77
79
|
for (let hop = 0; hop < maxRedirects; hop++) {
|
|
78
80
|
// Only ever send captured cookies (including the d session cookie) to Slack
|
|
79
81
|
// hosts. A redirect to an off-domain host (e.g. an SSO IdP) must never
|
|
@@ -82,32 +84,48 @@ async function captureDCookie(startUrl, options) {
|
|
|
82
84
|
debug?.(`hop ${hop}: refusing non-Slack host`);
|
|
83
85
|
break;
|
|
84
86
|
}
|
|
85
|
-
const response = await doFetch
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
'User-Agent': BROWSER_USER_AGENT,
|
|
89
|
-
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
90
|
-
'Accept-Language': 'en-US,en;q=0.9',
|
|
91
|
-
...(cookieJar.length ? { Cookie: cookieJar.join('; ') } : {}),
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
const cookieNames = [];
|
|
95
|
-
for (const setCookie of getSetCookies(response)) {
|
|
96
|
-
const value = parseDCookie(setCookie);
|
|
97
|
-
if (value)
|
|
98
|
-
dCookie = value;
|
|
99
|
-
const name = setCookie.split('=')[0]?.trim();
|
|
100
|
-
if (name)
|
|
101
|
-
cookieNames.push(name);
|
|
102
|
-
const pair = setCookie.split(';')[0]?.trim();
|
|
103
|
-
if (pair)
|
|
104
|
-
cookieJar.push(pair);
|
|
105
|
-
}
|
|
87
|
+
const response = await cookieJar.fetch(doFetch, url);
|
|
88
|
+
dCookie = await cookieJar.sessionCookie(sessionCookieUrl);
|
|
89
|
+
const cookieNames = setCookieNames(response);
|
|
106
90
|
debug?.(`hop ${hop}: ${response.status} set-cookie=[${cookieNames.join(',') || 'none'}]`);
|
|
107
91
|
const location = response.status >= 300 && response.status < 400 ? response.headers.get('location') : null;
|
|
108
92
|
if (!location) {
|
|
109
|
-
if (!dCookie)
|
|
110
|
-
|
|
93
|
+
if (!dCookie) {
|
|
94
|
+
const body = await response.text();
|
|
95
|
+
const props = parseConfirmationPage(body);
|
|
96
|
+
if (props && options.requestConfirmationCode) {
|
|
97
|
+
const request = buildConfirmationRequest(login, url, props, '');
|
|
98
|
+
if (!request) {
|
|
99
|
+
sessionDenialReason = 'invalid_confirmation_origin';
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
const code = await options.requestConfirmationCode({
|
|
103
|
+
email: props.emailAddress,
|
|
104
|
+
type: props.twoFactorType,
|
|
105
|
+
});
|
|
106
|
+
if (code.trim() === '') {
|
|
107
|
+
sessionDenialReason = 'confirmation_failed';
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
const confirmedRequest = buildConfirmationRequest(login, url, props, code);
|
|
111
|
+
if (!confirmedRequest) {
|
|
112
|
+
sessionDenialReason = 'invalid_confirmation_origin';
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
const confirmed = await cookieJar.fetch(doFetch, confirmedRequest.url, {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
body: confirmedRequest.body,
|
|
118
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
119
|
+
});
|
|
120
|
+
debug?.(`confirmation submit: ${confirmed.status}`);
|
|
121
|
+
dCookie = await followConfirmationRedirects(confirmed, confirmedRequest.url, sessionCookieUrl, cookieJar, doFetch, maxRedirects, debug);
|
|
122
|
+
if (!dCookie)
|
|
123
|
+
sessionDenialReason = 'confirmation_failed';
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
sessionDenialReason = classifySessionDenialBody(body);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
111
129
|
break;
|
|
112
130
|
}
|
|
113
131
|
const next = new URL(location, url).toString();
|
|
@@ -122,10 +140,46 @@ async function captureDCookie(startUrl, options) {
|
|
|
122
140
|
debug?.(`hop ${hop}: redirect target is not a Slack host (${new URL(next).hostname}), stopping`);
|
|
123
141
|
break;
|
|
124
142
|
}
|
|
143
|
+
if (!dCookie && options.requestConfirmationCode && isWorkspaceConfirmationUrl(next, login) === false) {
|
|
144
|
+
sessionDenialReason = 'invalid_confirmation_origin';
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
125
147
|
url = next;
|
|
126
148
|
}
|
|
127
149
|
return { cookie: dCookie, denialReason: sessionDenialReason, ssoProvider };
|
|
128
150
|
}
|
|
151
|
+
function isWorkspaceConfirmationUrl(rawUrl, login) {
|
|
152
|
+
const expected = expectedConfirmationPath(login);
|
|
153
|
+
if (!expected)
|
|
154
|
+
return null;
|
|
155
|
+
const url = new URL(rawUrl);
|
|
156
|
+
if (url.pathname !== expected)
|
|
157
|
+
return null;
|
|
158
|
+
return url.hostname === `${login.workspace}.slack.com`;
|
|
159
|
+
}
|
|
160
|
+
async function followConfirmationRedirects(response, responseUrl, sessionCookieUrl, cookieJar, doFetch, maxRedirects, debug) {
|
|
161
|
+
let currentResponse = response;
|
|
162
|
+
let currentUrl = responseUrl;
|
|
163
|
+
let currentSessionCookie = await cookieJar.sessionCookie(sessionCookieUrl);
|
|
164
|
+
for (let hop = 0; hop < maxRedirects; hop++) {
|
|
165
|
+
if (currentSessionCookie)
|
|
166
|
+
return currentSessionCookie;
|
|
167
|
+
const location = currentResponse.status >= 300 && currentResponse.status < 400 ? currentResponse.headers.get('location') : null;
|
|
168
|
+
if (!location)
|
|
169
|
+
return null;
|
|
170
|
+
const next = new URL(location, currentUrl).toString();
|
|
171
|
+
if (!isSlackHost(next))
|
|
172
|
+
return null;
|
|
173
|
+
currentUrl = next;
|
|
174
|
+
currentResponse = await cookieJar.fetch(doFetch, currentUrl);
|
|
175
|
+
currentSessionCookie = await cookieJar.sessionCookie(sessionCookieUrl);
|
|
176
|
+
debug?.(`confirmation hop ${hop}: ${currentResponse.status}`);
|
|
177
|
+
}
|
|
178
|
+
return currentSessionCookie;
|
|
179
|
+
}
|
|
180
|
+
function tokenUrl(workspace) {
|
|
181
|
+
return `https://${workspace}.slack.com/ssb/redirect`;
|
|
182
|
+
}
|
|
129
183
|
function ssoProviderFromUrl(rawUrl) {
|
|
130
184
|
let hostname;
|
|
131
185
|
try {
|
|
@@ -148,20 +202,13 @@ function ssoProviderFromUrl(rawUrl) {
|
|
|
148
202
|
return 'Auth0';
|
|
149
203
|
return null;
|
|
150
204
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
if (/sign in on your other device/i.test(body) || /open Slack/i.test(body) || /confirm/i.test(body)) {
|
|
158
|
-
return 'awaiting_device_confirmation';
|
|
159
|
-
}
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
catch {
|
|
163
|
-
return null;
|
|
205
|
+
function classifySessionDenialBody(body) {
|
|
206
|
+
if (/Link Expired/i.test(body) || /trouble signing you in/i.test(body))
|
|
207
|
+
return 'link_expired';
|
|
208
|
+
if (/sign in on your other device/i.test(body) || /open Slack/i.test(body) || /confirm/i.test(body)) {
|
|
209
|
+
return 'awaiting_device_confirmation';
|
|
164
210
|
}
|
|
211
|
+
return null;
|
|
165
212
|
}
|
|
166
213
|
export function isSlackHost(rawUrl) {
|
|
167
214
|
try {
|
|
@@ -174,16 +221,4 @@ export function isSlackHost(rawUrl) {
|
|
|
174
221
|
return false;
|
|
175
222
|
}
|
|
176
223
|
}
|
|
177
|
-
export function parseDCookie(setCookieHeader) {
|
|
178
|
-
const match = setCookieHeader.match(/(?:^|,\s*)d=(xoxd-[^;]+)/);
|
|
179
|
-
return match ? match[1] : null;
|
|
180
|
-
}
|
|
181
|
-
function getSetCookies(response) {
|
|
182
|
-
const withGetter = response.headers;
|
|
183
|
-
if (typeof withGetter.getSetCookie === 'function') {
|
|
184
|
-
return withGetter.getSetCookie();
|
|
185
|
-
}
|
|
186
|
-
const single = response.headers.get('set-cookie');
|
|
187
|
-
return single ? [single] : [];
|
|
188
|
-
}
|
|
189
224
|
//# sourceMappingURL=qr-http-login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qr-http-login.js","sourceRoot":"","sources":["../../../../src/platforms/slack/qr-http-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"qr-http-login.js","sourceRoot":"","sources":["../../../../src/platforms/slack/qr-http-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -238,16 +238,16 @@ Use **agent-channeltalk** when you want zero-config access acting as yourself. U
|
|
|
238
238
|
|
|
239
239
|
### Channel Talk desktop app not found
|
|
240
240
|
|
|
241
|
-
The CLI looks for the
|
|
241
|
+
The CLI looks for the desktop app's cookie database in the locations below. The app was rebranded from Channel Talk to Channel Works, so both names are probed, `Channel Works` first.
|
|
242
242
|
|
|
243
243
|
**macOS:**
|
|
244
244
|
|
|
245
|
-
1. `~/Library/Containers/com.zoyi.channel.desk.osx/Data/Library/Application Support/Channel Talk/Cookies` (Mac App Store)
|
|
246
|
-
2. `~/Library/Application Support/Channel Talk/Cookies` (Electron version)
|
|
245
|
+
1. `~/Library/Containers/com.zoyi.channel.desk.osx/Data/Library/Application Support/{Channel Works,Channel Talk}/Cookies` (Mac App Store)
|
|
246
|
+
2. `~/Library/Application Support/{Channel Works,Channel Talk}/Cookies` (Electron version)
|
|
247
247
|
|
|
248
248
|
**Windows:**
|
|
249
249
|
|
|
250
|
-
1. `%APPDATA%\Channel Talk\Network\Cookies`
|
|
250
|
+
1. `%APPDATA%\{Channel Works,Channel Talk}\Network\Cookies`
|
|
251
251
|
|
|
252
252
|
If none exist, either install the Channel Talk desktop app and log in, or log in via a Chromium browser (Chrome, Edge, Arc, Brave, etc.) — the CLI will fall back to browser extraction automatically.
|
|
253
253
|
|
|
@@ -244,8 +244,15 @@ agent-discord mention list --limit 10
|
|
|
244
244
|
|
|
245
245
|
# Filter by guild
|
|
246
246
|
agent-discord mention list --guild <guild-id>
|
|
247
|
+
|
|
248
|
+
# List only unread mentions (the app's unread-mention badge)
|
|
249
|
+
agent-discord mention unread
|
|
250
|
+
agent-discord mention unread --guild <guild-id>
|
|
251
|
+
agent-discord mention unread --limit 200
|
|
247
252
|
```
|
|
248
253
|
|
|
254
|
+
`mention unread` correlates your recent mention history (last 7 days) with Discord's per-channel read state, returning only mentions newer than each channel's read marker. Output includes `count` (enumerated unread mentions), `badge_count` (Discord's own account-wide unread-mention badge total — not narrowed by `--guild`), and `complete` (whether the scan reached the end of history within the 7-day window). `badge_count` can exceed `count` when unread mentions fall outside the 7-day window.
|
|
255
|
+
|
|
249
256
|
### Member Commands
|
|
250
257
|
|
|
251
258
|
```bash
|