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.
Files changed (98) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +14 -1
  3. package/bun.lock +7 -0
  4. package/dist/package.json +2 -1
  5. package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
  6. package/dist/src/platforms/channeltalk/token-extractor.js +67 -18
  7. package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
  8. package/dist/src/platforms/discord/client.d.ts +11 -2
  9. package/dist/src/platforms/discord/client.d.ts.map +1 -1
  10. package/dist/src/platforms/discord/client.js +109 -4
  11. package/dist/src/platforms/discord/client.js.map +1 -1
  12. package/dist/src/platforms/discord/commands/channel.d.ts.map +1 -1
  13. package/dist/src/platforms/discord/commands/channel.js +3 -2
  14. package/dist/src/platforms/discord/commands/channel.js.map +1 -1
  15. package/dist/src/platforms/discord/commands/mention.d.ts +5 -0
  16. package/dist/src/platforms/discord/commands/mention.d.ts.map +1 -1
  17. package/dist/src/platforms/discord/commands/mention.js +60 -4
  18. package/dist/src/platforms/discord/commands/mention.js.map +1 -1
  19. package/dist/src/platforms/discord/commands/reaction.js +1 -1
  20. package/dist/src/platforms/discord/commands/reaction.js.map +1 -1
  21. package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -1
  22. package/dist/src/platforms/discord/commands/snapshot.js +7 -6
  23. package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
  24. package/dist/src/platforms/discord/index.d.ts +1 -1
  25. package/dist/src/platforms/discord/index.d.ts.map +1 -1
  26. package/dist/src/platforms/discord/index.js.map +1 -1
  27. package/dist/src/platforms/discord/listener.d.ts +4 -1
  28. package/dist/src/platforms/discord/listener.d.ts.map +1 -1
  29. package/dist/src/platforms/discord/listener.js +28 -1
  30. package/dist/src/platforms/discord/listener.js.map +1 -1
  31. package/dist/src/platforms/discord/types.d.ts +60 -9
  32. package/dist/src/platforms/discord/types.d.ts.map +1 -1
  33. package/dist/src/platforms/discord/types.js +58 -7
  34. package/dist/src/platforms/discord/types.js.map +1 -1
  35. package/dist/src/platforms/slack/index.d.ts +1 -0
  36. package/dist/src/platforms/slack/index.d.ts.map +1 -1
  37. package/dist/src/platforms/slack/index.js.map +1 -1
  38. package/dist/src/platforms/slack/qr-confirmation.d.ts +19 -0
  39. package/dist/src/platforms/slack/qr-confirmation.d.ts.map +1 -0
  40. package/dist/src/platforms/slack/qr-confirmation.js +68 -0
  41. package/dist/src/platforms/slack/qr-confirmation.js.map +1 -0
  42. package/dist/src/platforms/slack/qr-cookie-jar.d.ts +7 -0
  43. package/dist/src/platforms/slack/qr-cookie-jar.d.ts.map +1 -0
  44. package/dist/src/platforms/slack/qr-cookie-jar.js +48 -0
  45. package/dist/src/platforms/slack/qr-cookie-jar.js.map +1 -0
  46. package/dist/src/platforms/slack/qr-http-login.d.ts +2 -1
  47. package/dist/src/platforms/slack/qr-http-login.d.ts.map +1 -1
  48. package/dist/src/platforms/slack/qr-http-login.js +88 -53
  49. package/dist/src/platforms/slack/qr-http-login.js.map +1 -1
  50. package/docs/content/docs/cli/channeltalk.mdx +4 -4
  51. package/docs/content/docs/cli/discord.mdx +7 -0
  52. package/docs/content/docs/sdk/discord.mdx +38 -0
  53. package/e2e/README.md +2 -2
  54. package/e2e/discord.e2e.test.ts +16 -2
  55. package/package.json +2 -1
  56. package/skills/agent-channeltalk/SKILL.md +5 -5
  57. package/skills/agent-channeltalk/references/authentication.md +9 -5
  58. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  59. package/skills/agent-discord/SKILL.md +26 -4
  60. package/skills/agent-discord/references/common-patterns.md +7 -3
  61. package/skills/agent-discordbot/SKILL.md +1 -1
  62. package/skills/agent-imessage/SKILL.md +1 -1
  63. package/skills/agent-instagram/SKILL.md +1 -1
  64. package/skills/agent-kakaotalk/SKILL.md +1 -1
  65. package/skills/agent-line/SKILL.md +1 -1
  66. package/skills/agent-slack/SKILL.md +25 -2
  67. package/skills/agent-slackbot/SKILL.md +1 -1
  68. package/skills/agent-teams/SKILL.md +1 -1
  69. package/skills/agent-telegram/SKILL.md +1 -1
  70. package/skills/agent-telegrambot/SKILL.md +1 -1
  71. package/skills/agent-webex/SKILL.md +1 -1
  72. package/skills/agent-webexbot/SKILL.md +1 -1
  73. package/skills/agent-wechatbot/SKILL.md +1 -1
  74. package/skills/agent-whatsapp/SKILL.md +1 -1
  75. package/skills/agent-whatsappbot/SKILL.md +1 -1
  76. package/src/platforms/channeltalk/token-extractor.test.ts +235 -0
  77. package/src/platforms/channeltalk/token-extractor.ts +81 -22
  78. package/src/platforms/discord/client.test.ts +230 -9
  79. package/src/platforms/discord/client.ts +122 -5
  80. package/src/platforms/discord/commands/channel.test.ts +33 -23
  81. package/src/platforms/discord/commands/channel.ts +3 -2
  82. package/src/platforms/discord/commands/mention.test.ts +84 -0
  83. package/src/platforms/discord/commands/mention.ts +78 -15
  84. package/src/platforms/discord/commands/reaction.test.ts +1 -1
  85. package/src/platforms/discord/commands/reaction.ts +1 -1
  86. package/src/platforms/discord/commands/snapshot.test.ts +80 -2
  87. package/src/platforms/discord/commands/snapshot.ts +7 -6
  88. package/src/platforms/discord/index.ts +3 -0
  89. package/src/platforms/discord/listener.test.ts +69 -2
  90. package/src/platforms/discord/listener.ts +31 -2
  91. package/src/platforms/discord/types.test.ts +56 -0
  92. package/src/platforms/discord/types.ts +91 -10
  93. package/src/platforms/slack/index.ts +1 -0
  94. package/src/platforms/slack/qr-confirmation.ts +86 -0
  95. package/src/platforms/slack/qr-cookie-jar.ts +54 -0
  96. package/src/platforms/slack/qr-http-login-2fa.test.ts +398 -0
  97. package/src/platforms/slack/qr-http-login.test.ts +10 -18
  98. 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":"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"}
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;AAE7C,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"}
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('&quot;', '"')
60
+ .replaceAll('&#39;', "'")
61
+ .replaceAll('&lt;', '<')
62
+ .replaceAll('&gt;', '>')
63
+ .replaceAll('&amp;', '&');
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":"AAeA,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAA;IACvE,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAEzB,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAElC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;IACpC,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IACxC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IACpE,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IACxE,OAAO;QACL,UAAU;QACV,YAAY;QACZ,aAAa,EAAE,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;KACtF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAmB,EACnB,QAAgB,EAChB,KAAkB,EAClB,IAAY;IAEZ,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAA;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC7B,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,KAAK,CAAC,SAAS,YAAY;QAAE,OAAO,IAAI,CAAA;IAChE,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE1C,GAAG,CAAC,MAAM,GAAG,EAAE,CAAA;IACf,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;IAEjD,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;QACnB,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,gBAAgB,EAAE,KAAK,CAAC,UAAU;YAClC,QAAQ,EAAE,GAAG;YACb,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;YACvB,YAAY,EAAE,gBAAgB;SAC/B,CAAC,CAAC,QAAQ,EAAE;KACd,CAAA;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAmB;IAC1D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IAC5D,OAAO,UAAU,QAAQ,EAAE,CAAA;AAC7B,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC;SACzB,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC;SACxB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;SACvB,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;SACvB,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AAC7B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAA;AACpD,CAAC"}
@@ -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":"AAIA,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;CAClC;AAMD,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAwBnG;AA8JD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED,wBAAgB,YAAY,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE"}
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.url, options);
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(startUrl, options) {
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 = startUrl;
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(url, {
86
- redirect: 'manual',
87
- headers: {
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
- sessionDenialReason = await classifySessionDenial(response);
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
- async function classifySessionDenial(response) {
152
- try {
153
- const body = await response.text();
154
- if (/Link Expired/i.test(body) || /trouble signing you in/i.test(body)) {
155
- return 'link_expired';
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":"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"}
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 Channel Talk desktop app's cookie database in:
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