linkpress 0.1.0

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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/dist/ai.d.ts +31 -0
  4. package/dist/ai.d.ts.map +1 -0
  5. package/dist/ai.js +428 -0
  6. package/dist/ai.js.map +1 -0
  7. package/dist/commands/add.d.ts +3 -0
  8. package/dist/commands/add.d.ts.map +1 -0
  9. package/dist/commands/add.js +38 -0
  10. package/dist/commands/add.js.map +1 -0
  11. package/dist/commands/clear.d.ts +3 -0
  12. package/dist/commands/clear.d.ts.map +1 -0
  13. package/dist/commands/clear.js +25 -0
  14. package/dist/commands/clear.js.map +1 -0
  15. package/dist/commands/generate.d.ts +3 -0
  16. package/dist/commands/generate.d.ts.map +1 -0
  17. package/dist/commands/generate.js +38 -0
  18. package/dist/commands/generate.js.map +1 -0
  19. package/dist/commands/index.d.ts +9 -0
  20. package/dist/commands/index.d.ts.map +1 -0
  21. package/dist/commands/index.js +9 -0
  22. package/dist/commands/index.js.map +1 -0
  23. package/dist/commands/init.d.ts +3 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +129 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/list.d.ts +3 -0
  28. package/dist/commands/list.d.ts.map +1 -0
  29. package/dist/commands/list.js +33 -0
  30. package/dist/commands/list.js.map +1 -0
  31. package/dist/commands/serve.d.ts +3 -0
  32. package/dist/commands/serve.d.ts.map +1 -0
  33. package/dist/commands/serve.js +122 -0
  34. package/dist/commands/serve.js.map +1 -0
  35. package/dist/commands/source.d.ts +3 -0
  36. package/dist/commands/source.d.ts.map +1 -0
  37. package/dist/commands/source.js +48 -0
  38. package/dist/commands/source.js.map +1 -0
  39. package/dist/commands/sync.d.ts +3 -0
  40. package/dist/commands/sync.d.ts.map +1 -0
  41. package/dist/commands/sync.js +24 -0
  42. package/dist/commands/sync.js.map +1 -0
  43. package/dist/config.d.ts +8 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +47 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/db.d.ts +14 -0
  48. package/dist/db.d.ts.map +1 -0
  49. package/dist/db.js +140 -0
  50. package/dist/db.js.map +1 -0
  51. package/dist/i18n.d.ts +4 -0
  52. package/dist/i18n.d.ts.map +1 -0
  53. package/dist/i18n.js +139 -0
  54. package/dist/i18n.js.map +1 -0
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +17 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/magazine.d.ts +6 -0
  60. package/dist/magazine.d.ts.map +1 -0
  61. package/dist/magazine.js +1751 -0
  62. package/dist/magazine.js.map +1 -0
  63. package/dist/process.d.ts +16 -0
  64. package/dist/process.d.ts.map +1 -0
  65. package/dist/process.js +77 -0
  66. package/dist/process.js.map +1 -0
  67. package/dist/scraper.d.ts +11 -0
  68. package/dist/scraper.d.ts.map +1 -0
  69. package/dist/scraper.js +159 -0
  70. package/dist/scraper.js.map +1 -0
  71. package/dist/slack/auth.d.ts +6 -0
  72. package/dist/slack/auth.d.ts.map +1 -0
  73. package/dist/slack/auth.js +373 -0
  74. package/dist/slack/auth.js.map +1 -0
  75. package/dist/slack/browser-auth.d.ts +6 -0
  76. package/dist/slack/browser-auth.d.ts.map +1 -0
  77. package/dist/slack/browser-auth.js +236 -0
  78. package/dist/slack/browser-auth.js.map +1 -0
  79. package/dist/slack/client.d.ts +45 -0
  80. package/dist/slack/client.d.ts.map +1 -0
  81. package/dist/slack/client.js +98 -0
  82. package/dist/slack/client.js.map +1 -0
  83. package/dist/slack/index.d.ts +6 -0
  84. package/dist/slack/index.d.ts.map +1 -0
  85. package/dist/slack/index.js +4 -0
  86. package/dist/slack/index.js.map +1 -0
  87. package/dist/slack/sync.d.ts +12 -0
  88. package/dist/slack/sync.d.ts.map +1 -0
  89. package/dist/slack/sync.js +182 -0
  90. package/dist/slack/sync.js.map +1 -0
  91. package/dist/types.d.ts +64 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +2 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/utils.d.ts +3 -0
  96. package/dist/utils.d.ts.map +1 -0
  97. package/dist/utils.js +15 -0
  98. package/dist/utils.js.map +1 -0
  99. package/package.json +71 -0
@@ -0,0 +1,373 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { SlackClient } from './client.js';
5
+ import { extractSlackTokens } from './browser-auth.js';
6
+ import { loadConfig, saveConfig } from '../config.js';
7
+ export async function addSlackSource() {
8
+ console.log(chalk.bold('\n🔗 Add Slack Workspace\n'));
9
+ const { method } = await inquirer.prompt([{
10
+ type: 'list',
11
+ name: 'method',
12
+ message: 'How would you like to authenticate?',
13
+ choices: [
14
+ { name: '🤖 Automatic (opens browser, extracts tokens after login)', value: 'auto' },
15
+ { name: '📋 Manual (paste tokens from DevTools)', value: 'manual' },
16
+ ],
17
+ }]);
18
+ let token;
19
+ let cookie;
20
+ if (method === 'auto') {
21
+ const tokens = await extractSlackTokens();
22
+ if (!tokens) {
23
+ console.log(chalk.yellow('\nFalling back to manual method...\n'));
24
+ const manualTokens = await promptManualTokens();
25
+ token = manualTokens.token;
26
+ cookie = manualTokens.cookie;
27
+ }
28
+ else {
29
+ token = tokens.token;
30
+ cookie = tokens.cookie;
31
+ }
32
+ }
33
+ else {
34
+ const manualTokens = await promptManualTokens();
35
+ token = manualTokens.token;
36
+ cookie = manualTokens.cookie;
37
+ }
38
+ await connectWithTokens(token, cookie);
39
+ }
40
+ async function promptManualTokens() {
41
+ console.log(chalk.cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
42
+ console.log(chalk.bold('\n📋 How to get your Slack tokens:\n'));
43
+ console.log('1. Open Slack in your browser (app.slack.com)');
44
+ console.log('2. Open Developer Tools (F12 or Cmd+Option+I)');
45
+ console.log('3. Go to the ' + chalk.cyan('Network') + ' tab');
46
+ console.log('4. Type ' + chalk.cyan('api') + ' in the filter box');
47
+ console.log('5. Click any request and find the ' + chalk.cyan('Request Headers'));
48
+ console.log('');
49
+ console.log(chalk.bold(' Token (xoxc-...):'));
50
+ console.log(' - Look for ' + chalk.cyan('Authorization: Bearer xoxc-...'));
51
+ console.log(' - Copy the value starting with ' + chalk.yellow('xoxc-'));
52
+ console.log('');
53
+ console.log(chalk.bold(' Cookie (xoxd-...):'));
54
+ console.log(' - Look for ' + chalk.cyan('Cookie:') + ' header');
55
+ console.log(' - Find ' + chalk.yellow('d=xoxd-...') + ' and copy the value after ' + chalk.cyan('d='));
56
+ console.log(chalk.cyan('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
57
+ const { token } = await inquirer.prompt([{
58
+ type: 'password',
59
+ name: 'token',
60
+ message: 'Paste your token (xoxc-...):',
61
+ validate: (input) => {
62
+ if (!input.startsWith('xoxc-')) {
63
+ return 'Token should start with xoxc-';
64
+ }
65
+ return true;
66
+ },
67
+ }]);
68
+ const { cookie } = await inquirer.prompt([{
69
+ type: 'password',
70
+ name: 'cookie',
71
+ message: 'Paste your cookie (xoxd-...):',
72
+ validate: (input) => {
73
+ if (!input.startsWith('xoxd-')) {
74
+ return 'Cookie should start with xoxd-';
75
+ }
76
+ return true;
77
+ },
78
+ }]);
79
+ return { token, cookie };
80
+ }
81
+ async function connectWithTokens(token, cookie) {
82
+ const spinner = ora('Testing connection...').start();
83
+ try {
84
+ const client = new SlackClient({ token, cookie });
85
+ const user = await client.testAuth();
86
+ spinner.succeed(chalk.green(`Connected as ${user.name}`));
87
+ spinner.start('Fetching channels...');
88
+ const conversations = await client.getConversations();
89
+ spinner.succeed(`Found ${conversations.length} conversations`);
90
+ const choices = conversations
91
+ .filter(c => !c.isIm || c.user === user.id)
92
+ .map(c => {
93
+ let label = c.name;
94
+ if (c.isIm && c.user === user.id) {
95
+ label = '📝 My Saved Messages (DM to self)';
96
+ }
97
+ else if (c.isPrivate) {
98
+ label = `🔒 ${c.name}`;
99
+ }
100
+ else if (c.isMpim) {
101
+ label = `👥 ${c.name}`;
102
+ }
103
+ else {
104
+ label = `# ${c.name}`;
105
+ }
106
+ return {
107
+ name: `(${user.team}) ${label}`,
108
+ value: c.id,
109
+ checked: c.isIm && c.user === user.id,
110
+ };
111
+ });
112
+ const { selectedChannels } = await inquirer.prompt([{
113
+ type: 'checkbox',
114
+ name: 'selectedChannels',
115
+ message: 'Select channels to watch (space to select):',
116
+ choices,
117
+ pageSize: 15,
118
+ validate: (answer) => {
119
+ if (answer.length === 0) {
120
+ return 'Select at least one channel';
121
+ }
122
+ return true;
123
+ },
124
+ }]);
125
+ const selectedConversations = conversations.filter(c => selectedChannels.includes(c.id));
126
+ const channels = await Promise.all(selectedConversations.map(async (c) => {
127
+ let name = c.name;
128
+ if (c.isIm) {
129
+ if (c.user === user.id) {
130
+ name = 'Saved Messages';
131
+ }
132
+ else if (c.user) {
133
+ try {
134
+ const userInfo = await client.getUserInfo(c.user);
135
+ name = `DM: ${userInfo.realName}`;
136
+ }
137
+ catch {
138
+ name = `DM: ${c.user}`;
139
+ }
140
+ }
141
+ }
142
+ return {
143
+ id: c.id,
144
+ name,
145
+ isPrivate: c.isPrivate || c.isIm || c.isMpim,
146
+ isSelfDM: c.isIm && c.user === user.id,
147
+ };
148
+ }));
149
+ const config = loadConfig();
150
+ if (!config.sources.slack) {
151
+ config.sources.slack = [];
152
+ }
153
+ const source = {
154
+ id: client.generateSourceId(),
155
+ workspace: user.team,
156
+ token,
157
+ cookie,
158
+ channels,
159
+ addedAt: new Date(),
160
+ };
161
+ config.sources.slack.push(source);
162
+ saveConfig(config);
163
+ console.log(chalk.green('\n✅ Slack workspace added successfully!'));
164
+ console.log(chalk.dim('\nWatching channels:'));
165
+ channels.forEach(ch => {
166
+ console.log(chalk.dim(` • ${ch.name}`));
167
+ });
168
+ console.log(chalk.dim('\nRun "linkpress sync" to fetch links from Slack.'));
169
+ }
170
+ catch (error) {
171
+ spinner.fail(chalk.red('Connection failed'));
172
+ if (error instanceof Error) {
173
+ console.log(chalk.red(`Error: ${error.message}`));
174
+ }
175
+ console.log(chalk.dim('\nMake sure your tokens are correct and not expired.'));
176
+ }
177
+ }
178
+ export async function listSlackSources() {
179
+ const config = loadConfig();
180
+ const sources = config.sources.slack || [];
181
+ if (sources.length === 0) {
182
+ console.log(chalk.yellow('\nNo Slack workspaces configured.'));
183
+ console.log(chalk.dim('Add one with: linkpress source add slack'));
184
+ return;
185
+ }
186
+ console.log(chalk.bold('\n📡 Following Channels\n'));
187
+ for (const source of sources) {
188
+ for (const ch of source.channels) {
189
+ console.log(chalk.white(` (${source.workspace}) ${ch.name}`));
190
+ }
191
+ }
192
+ console.log();
193
+ }
194
+ export async function removeSlackSource() {
195
+ const config = loadConfig();
196
+ const sources = config.sources.slack || [];
197
+ if (sources.length === 0) {
198
+ console.log(chalk.yellow('\nNo Slack workspaces configured.'));
199
+ return;
200
+ }
201
+ const choices = sources.map((source, index) => ({
202
+ name: `${source.workspace} (${source.channels.length} channels)`,
203
+ value: index,
204
+ }));
205
+ const { selectedIndex } = await inquirer.prompt([{
206
+ type: 'list',
207
+ name: 'selectedIndex',
208
+ message: 'Select workspace to remove:',
209
+ choices,
210
+ }]);
211
+ const removed = sources[selectedIndex];
212
+ config.sources.slack = sources.filter((_, i) => i !== selectedIndex);
213
+ saveConfig(config);
214
+ console.log(chalk.green(`\n✅ Removed workspace: ${removed.workspace}\n`));
215
+ }
216
+ export async function addChannelToSource() {
217
+ const config = loadConfig();
218
+ const sources = config.sources.slack || [];
219
+ if (sources.length === 0) {
220
+ console.log(chalk.yellow('\nNo Slack workspaces configured.'));
221
+ console.log(chalk.dim('Add one first with: linkpress source add slack'));
222
+ return;
223
+ }
224
+ let selectedSource;
225
+ if (sources.length === 1) {
226
+ selectedSource = sources[0];
227
+ }
228
+ else {
229
+ const { sourceIndex } = await inquirer.prompt([{
230
+ type: 'list',
231
+ name: 'sourceIndex',
232
+ message: 'Select workspace:',
233
+ choices: sources.map((s, i) => ({ name: s.workspace, value: i })),
234
+ }]);
235
+ selectedSource = sources[sourceIndex];
236
+ }
237
+ const spinner = ora('Fetching channels...').start();
238
+ try {
239
+ const client = new SlackClient({ token: selectedSource.token, cookie: selectedSource.cookie });
240
+ const conversations = await client.getConversations();
241
+ spinner.succeed(`Found ${conversations.length} conversations`);
242
+ const existingIds = new Set(selectedSource.channels.map(ch => ch.id));
243
+ const availableConversations = conversations.filter(c => !existingIds.has(c.id));
244
+ if (availableConversations.length === 0) {
245
+ console.log(chalk.yellow('\nAll available channels are already added.'));
246
+ return;
247
+ }
248
+ const user = await client.testAuth();
249
+ const choices = availableConversations.map(c => {
250
+ let label = c.name;
251
+ if (c.isIm && c.user === user.id) {
252
+ label = '📝 My Saved Messages (DM to self)';
253
+ }
254
+ else if (c.isPrivate) {
255
+ label = `🔒 ${c.name}`;
256
+ }
257
+ else if (c.isMpim) {
258
+ label = `👥 ${c.name}`;
259
+ }
260
+ else {
261
+ label = `# ${c.name}`;
262
+ }
263
+ return { name: `(${selectedSource.workspace}) ${label}`, value: c.id, conversation: c };
264
+ });
265
+ const { searchTerm } = await inquirer.prompt([{
266
+ type: 'input',
267
+ name: 'searchTerm',
268
+ message: 'Search channel (or press Enter to see all):',
269
+ }]);
270
+ const filteredChoices = searchTerm
271
+ ? choices.filter(c => c.name.toLowerCase().includes(searchTerm.toLowerCase()))
272
+ : choices;
273
+ if (filteredChoices.length === 0) {
274
+ console.log(chalk.yellow(`\nNo channels found matching "${searchTerm}"`));
275
+ return;
276
+ }
277
+ const { channelSearch } = await inquirer.prompt([{
278
+ type: 'list',
279
+ name: 'channelSearch',
280
+ message: `Select channel to add (${filteredChoices.length} found):`,
281
+ choices: filteredChoices.slice(0, 30),
282
+ pageSize: 15,
283
+ }]);
284
+ const selectedConv = conversations.find(c => c.id === channelSearch);
285
+ if (!selectedConv)
286
+ return;
287
+ let channelName = selectedConv.name;
288
+ if (selectedConv.isIm) {
289
+ if (selectedConv.user === user.id) {
290
+ channelName = 'Saved Messages';
291
+ }
292
+ else if (selectedConv.user) {
293
+ try {
294
+ const userInfo = await client.getUserInfo(selectedConv.user);
295
+ channelName = `DM: ${userInfo.realName}`;
296
+ }
297
+ catch {
298
+ channelName = `DM: ${selectedConv.user}`;
299
+ }
300
+ }
301
+ }
302
+ const newChannel = {
303
+ id: selectedConv.id,
304
+ name: channelName,
305
+ isPrivate: selectedConv.isPrivate || selectedConv.isIm || selectedConv.isMpim,
306
+ isSelfDM: selectedConv.isIm && selectedConv.user === user.id,
307
+ };
308
+ selectedSource.channels.push(newChannel);
309
+ saveConfig(config);
310
+ console.log(chalk.green(`\n✅ Added channel: ${channelName} to ${selectedSource.workspace}\n`));
311
+ }
312
+ catch (error) {
313
+ spinner.fail(chalk.red('Failed to fetch channels'));
314
+ if (error instanceof Error) {
315
+ console.log(chalk.red(`Error: ${error.message}`));
316
+ }
317
+ }
318
+ }
319
+ export async function removeChannelFromSource() {
320
+ const config = loadConfig();
321
+ const sources = config.sources.slack || [];
322
+ if (sources.length === 0) {
323
+ console.log(chalk.yellow('\nNo Slack workspaces configured.'));
324
+ return;
325
+ }
326
+ const allChannels = [];
327
+ sources.forEach((source, sourceIndex) => {
328
+ source.channels.forEach((channel, channelIndex) => {
329
+ allChannels.push({ workspace: source.workspace, sourceIndex, channel, channelIndex });
330
+ });
331
+ });
332
+ if (allChannels.length === 0) {
333
+ console.log(chalk.yellow('\nNo channels configured.'));
334
+ return;
335
+ }
336
+ const choices = allChannels.map((item, index) => ({
337
+ name: `(${item.workspace}) ${item.channel.name}`,
338
+ value: index,
339
+ }));
340
+ const { selectedIndex } = await inquirer.prompt([{
341
+ type: 'list',
342
+ name: 'selectedIndex',
343
+ message: 'Select channel to remove:',
344
+ choices,
345
+ pageSize: 15,
346
+ }]);
347
+ const selected = allChannels[selectedIndex];
348
+ const source = sources[selected.sourceIndex];
349
+ const removedChannel = source.channels[selected.channelIndex];
350
+ source.channels = source.channels.filter((_, i) => i !== selected.channelIndex);
351
+ if (source.channels.length === 0) {
352
+ const { removeWorkspace } = await inquirer.prompt([{
353
+ type: 'confirm',
354
+ name: 'removeWorkspace',
355
+ message: `This was the last channel in ${source.workspace}. Remove the workspace too?`,
356
+ default: true,
357
+ }]);
358
+ if (removeWorkspace) {
359
+ config.sources.slack = sources.filter((_, i) => i !== selected.sourceIndex);
360
+ console.log(chalk.green(`\n✅ Removed channel and workspace: ${source.workspace}\n`));
361
+ }
362
+ else {
363
+ saveConfig(config);
364
+ console.log(chalk.green(`\n✅ Removed channel: ${removedChannel.name}\n`));
365
+ }
366
+ }
367
+ else {
368
+ saveConfig(config);
369
+ console.log(chalk.green(`\n✅ Removed channel: ${removedChannel.name} from ${source.workspace}\n`));
370
+ }
371
+ saveConfig(config);
372
+ }
373
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/slack/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface SlackTokens {
2
+ token: string;
3
+ cookie: string;
4
+ }
5
+ export declare function extractSlackTokens(): Promise<SlackTokens | null>;
6
+ //# sourceMappingURL=browser-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-auth.d.ts","sourceRoot":"","sources":["../../src/slack/browser-auth.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAgCD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmEtE"}
@@ -0,0 +1,236 @@
1
+ import { chromium } from 'playwright';
2
+ import chalk from 'chalk';
3
+ import { existsSync } from 'fs';
4
+ import path from 'path';
5
+ import os from 'os';
6
+ const DEBUG = process.env.LINKPRESS_DEBUG === '1';
7
+ function debug(msg, data) {
8
+ if (!DEBUG)
9
+ return;
10
+ const timestamp = new Date().toISOString().split('T')[1].split('.')[0];
11
+ console.log(chalk.gray(`[${timestamp}] ${msg}`));
12
+ if (data !== undefined) {
13
+ console.log(chalk.gray(JSON.stringify(data, null, 2)));
14
+ }
15
+ }
16
+ function findChromeExecutable() {
17
+ const possiblePaths = [
18
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
19
+ '/Applications/Chromium.app/Contents/MacOS/Chromium',
20
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
21
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
22
+ '/usr/bin/google-chrome',
23
+ '/usr/bin/chromium-browser',
24
+ ];
25
+ for (const p of possiblePaths) {
26
+ if (existsSync(p)) {
27
+ return p;
28
+ }
29
+ }
30
+ return undefined;
31
+ }
32
+ export async function extractSlackTokens() {
33
+ console.log(chalk.cyan('\n🌐 Opening Slack in browser...'));
34
+ console.log(chalk.dim(' Please log in to your workspace.'));
35
+ console.log(chalk.dim(' The browser will close automatically after login.\n'));
36
+ if (DEBUG) {
37
+ console.log(chalk.yellow(' [DEBUG MODE ENABLED]\n'));
38
+ }
39
+ const chromePath = findChromeExecutable();
40
+ if (chromePath) {
41
+ console.log(chalk.dim(` Using: ${chromePath}\n`));
42
+ }
43
+ else {
44
+ console.log(chalk.yellow(' Warning: Could not find Chrome. Using Playwright Chromium.\n'));
45
+ }
46
+ const userDataDir = path.join(os.tmpdir(), 'linkpress-chrome-profile');
47
+ debug('User data dir', userDataDir);
48
+ const context = await chromium.launchPersistentContext(userDataDir, {
49
+ headless: false,
50
+ executablePath: chromePath,
51
+ args: [
52
+ '--disable-blink-features=AutomationControlled',
53
+ '--disable-features=IsolateOrigins,site-per-process',
54
+ '--no-first-run',
55
+ '--no-default-browser-check',
56
+ ],
57
+ ignoreDefaultArgs: ['--enable-automation'],
58
+ viewport: { width: 1280, height: 800 },
59
+ });
60
+ const page = context.pages()[0] || await context.newPage();
61
+ try {
62
+ debug('Navigating to slack.com/signin');
63
+ await page.goto('https://slack.com/signin', {
64
+ waitUntil: 'commit',
65
+ timeout: 30000,
66
+ }).catch((e) => debug('Navigation error (ignored)', e.message));
67
+ console.log(chalk.dim(' Waiting for you to log in...'));
68
+ console.log(chalk.dim(' (Press Ctrl+C to cancel)\n'));
69
+ const result = await waitForTokens(context);
70
+ await context.close();
71
+ if (result) {
72
+ console.log(chalk.green('✅ Tokens extracted successfully!'));
73
+ debug('Extracted tokens', { token: result.token.substring(0, 20) + '...', cookie: result.cookie.substring(0, 20) + '...' });
74
+ return result;
75
+ }
76
+ console.log(chalk.red('❌ Could not extract tokens. Please try manual method.'));
77
+ return null;
78
+ }
79
+ catch (error) {
80
+ debug('Error in extractSlackTokens', error instanceof Error ? error.message : error);
81
+ await context.close();
82
+ if (error instanceof Error && error.message.includes('Target closed')) {
83
+ console.log(chalk.yellow('\n⚠️ Browser was closed. Please try again.'));
84
+ return null;
85
+ }
86
+ throw error;
87
+ }
88
+ }
89
+ async function extractTokensFromPage(page, context) {
90
+ try {
91
+ debug('Extracting tokens from page...', page.url());
92
+ const currentUrl = page.url();
93
+ const extractionResult = await page.evaluate((url) => {
94
+ const results = {
95
+ bootData: null,
96
+ localConfig: null,
97
+ redux: null,
98
+ allLocalStorageKeys: Object.keys(localStorage),
99
+ currentTeamId: null,
100
+ };
101
+ const teamMatch = url.match(/app\.slack\.com\/client\/([A-Z0-9]+)/);
102
+ results.currentTeamId = teamMatch ? teamMatch[1] : null;
103
+ const w = globalThis;
104
+ try {
105
+ if (w.boot_data?.api_token) {
106
+ if (!results.currentTeamId || w.boot_data.team_id === results.currentTeamId) {
107
+ results.bootData = w.boot_data.api_token;
108
+ }
109
+ }
110
+ }
111
+ catch { }
112
+ try {
113
+ const localConfig = localStorage.getItem('localConfig_v2');
114
+ if (localConfig) {
115
+ const parsed = JSON.parse(localConfig);
116
+ const teams = parsed?.teams;
117
+ if (teams) {
118
+ if (results.currentTeamId && teams[results.currentTeamId]?.token?.startsWith('xoxc-')) {
119
+ results.localConfig = teams[results.currentTeamId].token;
120
+ }
121
+ else {
122
+ const teamIds = Object.keys(teams);
123
+ for (const teamId of teamIds) {
124
+ const teamToken = teams[teamId]?.token;
125
+ if (teamToken && teamToken.startsWith('xoxc-')) {
126
+ results.localConfig = teamToken;
127
+ break;
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ catch { }
135
+ try {
136
+ const redux = localStorage.getItem('reduxPersist:teams');
137
+ if (redux) {
138
+ const parsed = JSON.parse(redux);
139
+ if (results.currentTeamId && parsed[results.currentTeamId]?.token?.startsWith('xoxc-')) {
140
+ results.redux = parsed[results.currentTeamId].token;
141
+ }
142
+ else {
143
+ for (const team of Object.values(parsed)) {
144
+ if (team?.token?.startsWith('xoxc-')) {
145
+ results.redux = team.token;
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ catch { }
153
+ return results;
154
+ }, currentUrl);
155
+ debug('Extraction results', {
156
+ bootData: extractionResult.bootData ? extractionResult.bootData.substring(0, 20) + '...' : null,
157
+ localConfig: extractionResult.localConfig ? extractionResult.localConfig.substring(0, 20) + '...' : null,
158
+ redux: extractionResult.redux ? extractionResult.redux.substring(0, 20) + '...' : null,
159
+ localStorageKeys: extractionResult.allLocalStorageKeys,
160
+ });
161
+ const token = extractionResult.bootData || extractionResult.localConfig || extractionResult.redux;
162
+ if (!token) {
163
+ debug('No token found in any source');
164
+ return null;
165
+ }
166
+ const cookies = await context.cookies();
167
+ debug('Cookies with d=', cookies.filter(c => c.name === 'd').map(c => ({ domain: c.domain, valuePreview: c.value.substring(0, 20) + '...' })));
168
+ const dCookie = cookies.find(c => c.name === 'd' && c.value.startsWith('xoxd-'));
169
+ if (!dCookie) {
170
+ debug('No d cookie found with xoxd- prefix');
171
+ return null;
172
+ }
173
+ debug('Found token and cookie!');
174
+ return { token, cookie: dCookie.value };
175
+ }
176
+ catch (e) {
177
+ debug('Error in extractTokensFromPage', e instanceof Error ? e.message : e);
178
+ return null;
179
+ }
180
+ }
181
+ function findSlackAppPage(context) {
182
+ const pages = context.pages();
183
+ debug('Total pages', pages.length);
184
+ for (const p of pages) {
185
+ const url = p.url();
186
+ debug('Checking page URL', url);
187
+ if (url.includes('app.slack.com/client/')) {
188
+ debug('Found Slack app page!');
189
+ return p;
190
+ }
191
+ }
192
+ return null;
193
+ }
194
+ async function waitForTokens(context) {
195
+ const maxWaitTime = 5 * 60 * 1000;
196
+ const checkInterval = 2000;
197
+ const startTime = Date.now();
198
+ let iteration = 0;
199
+ let detectedLogin = false;
200
+ while (Date.now() - startTime < maxWaitTime) {
201
+ iteration++;
202
+ try {
203
+ const slackPage = findSlackAppPage(context);
204
+ if (slackPage) {
205
+ if (!detectedLogin) {
206
+ console.log(chalk.dim(' Detected Slack workspace, extracting tokens...'));
207
+ detectedLogin = true;
208
+ }
209
+ debug(`[Iteration ${iteration}] Found Slack app page, waiting for load...`);
210
+ await slackPage.waitForTimeout(3000);
211
+ const tokens = await extractTokensFromPage(slackPage, context);
212
+ if (tokens) {
213
+ return tokens;
214
+ }
215
+ debug('First extraction failed, reloading page...');
216
+ await slackPage.reload().catch((e) => debug('Reload failed:', e instanceof Error ? e.message : String(e)));
217
+ await slackPage.waitForTimeout(3000);
218
+ const tokensAfterReload = await extractTokensFromPage(slackPage, context);
219
+ if (tokensAfterReload) {
220
+ return tokensAfterReload;
221
+ }
222
+ debug('Second extraction also failed, will retry...');
223
+ }
224
+ else {
225
+ debug(`[Iteration ${iteration}] No Slack app page found yet`);
226
+ }
227
+ }
228
+ catch (e) {
229
+ debug('Error in waitForTokens loop', e instanceof Error ? e.message : e);
230
+ }
231
+ await new Promise(resolve => setTimeout(resolve, checkInterval));
232
+ }
233
+ debug('Timeout reached, no tokens found');
234
+ return null;
235
+ }
236
+ //# sourceMappingURL=browser-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/slack/browser-auth.ts"],"names":[],"mappings":"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"}