@sowonai/crewx-cli 0.7.5-rc.2 → 0.7.5-rc.4

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.
@@ -0,0 +1,558 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SlackFileDownloadService = exports.SlackFileDownloadError = void 0;
37
+ const common_1 = require("@nestjs/common");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ class SlackFileDownloadError extends Error {
41
+ constructor(message, options = {}) {
42
+ super(message);
43
+ this.name = 'SlackFileDownloadError';
44
+ this.statusCode = options.statusCode;
45
+ this.suggestion = options.suggestion;
46
+ this.retryable = options.retryable ?? false;
47
+ this.details = options.details;
48
+ }
49
+ }
50
+ exports.SlackFileDownloadError = SlackFileDownloadError;
51
+ class SlackFileDownloadService {
52
+ constructor(configService) {
53
+ this.configService = configService;
54
+ this.logger = new common_1.Logger(SlackFileDownloadService.name);
55
+ this.maxRetries = 3;
56
+ this.baseBackoffMs = 500;
57
+ this.networkTimeoutMs = 30000;
58
+ this.minDiskSpaceBytes = 100 * 1024 * 1024;
59
+ this.downloadDir = this.configService.getSlackFileDownloadDir();
60
+ this.maxFileSize = this.configService.getSlackMaxFileSize();
61
+ this.allowedMimeTypes = this.configService.getSlackAllowedMimeTypes();
62
+ }
63
+ async downloadFile(client, fileId, fileName, threadId, channelId, userId) {
64
+ const sanitizedFileName = this.sanitizeFileName(fileName);
65
+ const context = { fileId, fileName: sanitizedFileName, threadId, channelId, userId };
66
+ try {
67
+ if (!this.configService.isSlackFileDownloadEnabled()) {
68
+ throw new SlackFileDownloadError('Slack file download is disabled.', {
69
+ statusCode: 403,
70
+ suggestion: 'Enable slackFileDownload in crewx config or set CREWX_SLACK_FILE_DOWNLOAD=1.',
71
+ retryable: false,
72
+ details: context,
73
+ });
74
+ }
75
+ const startTime = Date.now();
76
+ this.logInfo('download.start', context);
77
+ await this.checkDiskSpace(context);
78
+ const fileInfo = await this.getFileInfo(client, fileId, context);
79
+ this.validateFileInfo(fileInfo, context);
80
+ if (!fileInfo.url_private) {
81
+ throw new SlackFileDownloadError('Slack did not return a private download URL for this file.', {
82
+ statusCode: 403,
83
+ suggestion: 'Ensure the bot has files:read scope and access to the channel.',
84
+ retryable: false,
85
+ details: context,
86
+ });
87
+ }
88
+ const uniqueFileName = this.makeUniqueFileName(sanitizedFileName, fileId, threadId);
89
+ const safeThreadDir = threadId.replace(/:/g, '_');
90
+ const savePath = path.join(this.downloadDir, safeThreadDir, uniqueFileName);
91
+ if (fs.existsSync(savePath)) {
92
+ const stats = fs.statSync(savePath);
93
+ this.logInfo('download.skip_existing', {
94
+ ...context,
95
+ filePath: savePath,
96
+ fileSize: stats.size,
97
+ });
98
+ return {
99
+ fileId,
100
+ fileName: uniqueFileName,
101
+ filePath: savePath,
102
+ fileSize: stats.size,
103
+ mimeType: fileInfo.mimetype,
104
+ uploadedBy: userId,
105
+ uploadedAt: new Date(fileInfo.timestamp * 1000),
106
+ threadId,
107
+ channelId,
108
+ downloadedAt: new Date(stats.mtime),
109
+ };
110
+ }
111
+ const fileBuffer = await this.fetchFileFromSlack(fileInfo.url_private, client, context);
112
+ await fs.promises.mkdir(path.dirname(savePath), { recursive: true });
113
+ await fs.promises.writeFile(savePath, fileBuffer);
114
+ const downloadTimeMs = Date.now() - startTime;
115
+ this.logInfo('download.complete', {
116
+ ...context,
117
+ filePath: savePath,
118
+ fileSize: fileBuffer.length,
119
+ mimeType: fileInfo.mimetype,
120
+ downloadTimeMs,
121
+ throughputKbps: Math.round((fileBuffer.length / 1024) / (downloadTimeMs / 1000)),
122
+ });
123
+ return {
124
+ fileId,
125
+ fileName: sanitizedFileName,
126
+ filePath: savePath,
127
+ fileSize: fileBuffer.length,
128
+ mimeType: fileInfo.mimetype,
129
+ uploadedBy: userId,
130
+ uploadedAt: new Date(fileInfo.timestamp * 1000),
131
+ threadId,
132
+ channelId,
133
+ downloadedAt: new Date(),
134
+ };
135
+ }
136
+ catch (error) {
137
+ const normalizedError = this.normalizeError(error, context);
138
+ this.logError('download.failed', normalizedError, context);
139
+ throw normalizedError;
140
+ }
141
+ }
142
+ async fetchFileFromSlack(url, client, context) {
143
+ return this.withRetry('download.fetch', async (attempt) => {
144
+ this.logInfo('download.fetch_attempt', { ...context, attempt });
145
+ try {
146
+ const controller = new AbortController();
147
+ const timeoutId = setTimeout(() => controller.abort(), this.networkTimeoutMs);
148
+ try {
149
+ const response = await fetch(url, {
150
+ headers: {
151
+ Authorization: `Bearer ${client.token}`,
152
+ },
153
+ signal: controller.signal,
154
+ });
155
+ clearTimeout(timeoutId);
156
+ const retryAfter = Number(response.headers?.get?.('retry-after') ?? 0) * 1000 || undefined;
157
+ if (response.status === 429) {
158
+ throw new SlackFileDownloadError('Slack rate limit exceeded while downloading the file. Please retry after waiting.', {
159
+ statusCode: 429,
160
+ suggestion: 'Wait briefly or reduce concurrent downloads.',
161
+ retryable: true,
162
+ details: { ...context, retryAfterMs: retryAfter },
163
+ });
164
+ }
165
+ if (response.status === 403) {
166
+ throw new SlackFileDownloadError('Permission denied to download Slack file.', {
167
+ statusCode: 403,
168
+ suggestion: 'Ensure the bot has files:read scope and access to the channel where the file was shared.',
169
+ retryable: false,
170
+ details: context,
171
+ });
172
+ }
173
+ if (response.status === 404) {
174
+ throw new SlackFileDownloadError('File not found or no longer available on Slack.', {
175
+ statusCode: 404,
176
+ suggestion: 'Verify the file is still available and shared with the bot.',
177
+ retryable: false,
178
+ details: context,
179
+ });
180
+ }
181
+ if (!response.ok) {
182
+ throw new SlackFileDownloadError(`Slack responded with HTTP ${response.status} while downloading the file.`, {
183
+ statusCode: response.status,
184
+ suggestion: 'Try again later or verify Slack availability.',
185
+ retryable: response.status >= 500,
186
+ details: context,
187
+ });
188
+ }
189
+ const buffer = Buffer.from(await response.arrayBuffer());
190
+ this.logInfo('download.fetch_success', {
191
+ ...context,
192
+ attempt,
193
+ fileSize: buffer.length,
194
+ });
195
+ return buffer;
196
+ }
197
+ catch (error) {
198
+ clearTimeout(timeoutId);
199
+ if (error.name === 'AbortError') {
200
+ throw new SlackFileDownloadError(`Network timeout after ${this.networkTimeoutMs / 1000}s while downloading file.`, {
201
+ statusCode: 408,
202
+ suggestion: 'Check your network connection or increase timeout in configuration.',
203
+ retryable: true,
204
+ details: { ...context, timeoutMs: this.networkTimeoutMs },
205
+ });
206
+ }
207
+ throw error;
208
+ }
209
+ }
210
+ catch (error) {
211
+ throw this.normalizeError(error, context);
212
+ }
213
+ }, context);
214
+ }
215
+ makeUniqueFileName(sanitizedFileName, fileId, threadId) {
216
+ const lastDotIndex = sanitizedFileName.lastIndexOf('.');
217
+ const ext = lastDotIndex === -1 ? '' : sanitizedFileName.substring(lastDotIndex);
218
+ return `${fileId}${ext}`;
219
+ }
220
+ sanitizeFileName(fileName) {
221
+ let safeName = fileName.replace(/[\/\\]/g, '_');
222
+ safeName = safeName.replace(/\.\./g, '_');
223
+ safeName = safeName.replace(/[\x00-\x1f\x80-\x9f<>:"|?*]/g, '_');
224
+ safeName = safeName.replace(/^\.+|\.+$/g, '');
225
+ safeName = safeName.trim();
226
+ if (!safeName || safeName === '') {
227
+ safeName = 'unnamed_file';
228
+ }
229
+ return safeName;
230
+ }
231
+ async getThreadFiles(threadId) {
232
+ const safeThreadDir = threadId.replace(/:/g, '_');
233
+ const threadDir = path.join(this.downloadDir, safeThreadDir);
234
+ try {
235
+ if (!fs.existsSync(threadDir)) {
236
+ return [];
237
+ }
238
+ const files = await fs.promises.readdir(threadDir);
239
+ return files.map(f => path.join(threadDir, f));
240
+ }
241
+ catch (error) {
242
+ this.logger.warn(`Failed to read thread files: ${error.message}`);
243
+ return [];
244
+ }
245
+ }
246
+ async getThreadFilesMetadata(threadId) {
247
+ const files = await this.getThreadFiles(threadId);
248
+ const metadata = [];
249
+ for (const filePath of files) {
250
+ try {
251
+ const stats = fs.statSync(filePath);
252
+ const fileName = path.basename(filePath);
253
+ metadata.push({
254
+ fileId: '',
255
+ fileName,
256
+ filePath,
257
+ fileSize: stats.size,
258
+ mimeType: this.guessMimeType(fileName),
259
+ uploadedBy: '',
260
+ uploadedAt: new Date(stats.birthtime),
261
+ threadId,
262
+ channelId: '',
263
+ downloadedAt: new Date(stats.mtime),
264
+ });
265
+ }
266
+ catch (error) {
267
+ this.logger.warn(`Failed to read file metadata: ${filePath}`);
268
+ }
269
+ }
270
+ return metadata;
271
+ }
272
+ async ensureFileDownloaded(client, fileId, fileName, threadId, channelId, userId) {
273
+ const sanitizedFileName = this.sanitizeFileName(fileName);
274
+ const safeThreadDir = threadId.replace(/:/g, '_');
275
+ const savePath = path.join(this.downloadDir, safeThreadDir, sanitizedFileName);
276
+ if (fs.existsSync(savePath)) {
277
+ const stats = fs.statSync(savePath);
278
+ return {
279
+ fileId,
280
+ fileName: sanitizedFileName,
281
+ filePath: savePath,
282
+ fileSize: stats.size,
283
+ mimeType: this.guessMimeType(fileName),
284
+ uploadedBy: userId,
285
+ uploadedAt: new Date(stats.birthtime),
286
+ threadId,
287
+ channelId,
288
+ downloadedAt: new Date(stats.mtime),
289
+ };
290
+ }
291
+ return this.downloadFile(client, fileId, fileName, threadId, channelId, userId);
292
+ }
293
+ formatFileSize(bytes) {
294
+ if (bytes < 1024)
295
+ return `${bytes}B`;
296
+ if (bytes < 1024 * 1024)
297
+ return `${(bytes / 1024).toFixed(1)}KB`;
298
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
299
+ }
300
+ guessMimeType(fileName) {
301
+ const ext = path.extname(fileName).toLowerCase();
302
+ const mimeTypes = {
303
+ '.pdf': 'application/pdf',
304
+ '.png': 'image/png',
305
+ '.jpg': 'image/jpeg',
306
+ '.jpeg': 'image/jpeg',
307
+ '.gif': 'image/gif',
308
+ '.txt': 'text/plain',
309
+ '.md': 'text/markdown',
310
+ '.csv': 'text/csv',
311
+ '.json': 'application/json',
312
+ '.xml': 'application/xml',
313
+ '.zip': 'application/zip',
314
+ '.doc': 'application/msword',
315
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
316
+ '.xls': 'application/vnd.ms-excel',
317
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
318
+ };
319
+ return mimeTypes[ext] || 'application/octet-stream';
320
+ }
321
+ isAllowedMimeType(mimeType) {
322
+ if (this.allowedMimeTypes.length === 0) {
323
+ return true;
324
+ }
325
+ return this.allowedMimeTypes.includes(mimeType);
326
+ }
327
+ async getFileInfo(client, fileId, context) {
328
+ return this.withRetry('files.info', async (attempt) => {
329
+ this.logInfo('files.info_attempt', { ...context, attempt });
330
+ const response = await client.files.info({ file: fileId });
331
+ if (response && response.ok === false) {
332
+ throw this.mapSlackErrorResponse(response, context);
333
+ }
334
+ const fileInfo = response.file;
335
+ if (!fileInfo) {
336
+ throw new SlackFileDownloadError(`File not found: ${fileId}`, {
337
+ statusCode: 404,
338
+ suggestion: 'Confirm the file is still available and shared with the bot.',
339
+ retryable: false,
340
+ details: context,
341
+ });
342
+ }
343
+ return fileInfo;
344
+ }, context);
345
+ }
346
+ mapSlackErrorResponse(response, context) {
347
+ const errorCode = response?.error;
348
+ if (errorCode === 'ratelimited') {
349
+ const retryAfterMs = response?.retry_after ? Number(response.retry_after) * 1000 : undefined;
350
+ return new SlackFileDownloadError('Slack rate limit exceeded while fetching file metadata.', {
351
+ statusCode: 429,
352
+ suggestion: 'Wait briefly or reduce concurrent downloads.',
353
+ retryable: true,
354
+ details: { ...context, retryAfterMs },
355
+ });
356
+ }
357
+ if (errorCode === 'file_not_found') {
358
+ return new SlackFileDownloadError('File not found on Slack.', {
359
+ statusCode: 404,
360
+ suggestion: 'Verify the file is still available and shared with the bot.',
361
+ retryable: false,
362
+ details: context,
363
+ });
364
+ }
365
+ if (['not_authed', 'invalid_auth', 'account_inactive'].includes(errorCode)) {
366
+ return new SlackFileDownloadError('Slack authentication failed while fetching file metadata.', {
367
+ statusCode: 403,
368
+ suggestion: 'Check Slack bot token validity and scopes (files:read).',
369
+ retryable: false,
370
+ details: context,
371
+ });
372
+ }
373
+ return new SlackFileDownloadError(`Slack API error: ${errorCode || 'unknown_error'}`, {
374
+ statusCode: 500,
375
+ suggestion: 'Try again later or check Slack API availability.',
376
+ retryable: true,
377
+ details: context,
378
+ });
379
+ }
380
+ validateFileInfo(fileInfo, context) {
381
+ if (fileInfo.size > this.maxFileSize) {
382
+ throw new SlackFileDownloadError(`File too large: ${this.formatFileSize(fileInfo.size)} (max: ${this.formatFileSize(this.maxFileSize)})`, {
383
+ statusCode: 413,
384
+ suggestion: 'Reduce the file size or raise CREWX_SLACK_MAX_FILE_SIZE if appropriate.',
385
+ retryable: false,
386
+ details: { ...context, fileSize: fileInfo.size },
387
+ });
388
+ }
389
+ if (!this.isAllowedMimeType(fileInfo.mimetype)) {
390
+ throw new SlackFileDownloadError(`File type not allowed: ${fileInfo.mimetype}`, {
391
+ statusCode: 415,
392
+ suggestion: `Allowed MIME types: ${this.allowedMimeTypes.join(', ')}`,
393
+ retryable: false,
394
+ details: context,
395
+ });
396
+ }
397
+ this.logInfo('download.validation_passed', {
398
+ ...context,
399
+ fileSize: fileInfo.size,
400
+ mimeType: fileInfo.mimetype,
401
+ });
402
+ }
403
+ async withRetry(operation, fn, context) {
404
+ let delayMs = this.baseBackoffMs;
405
+ let lastError = null;
406
+ for (let attempt = 1; attempt <= this.maxRetries; attempt++) {
407
+ try {
408
+ return await fn(attempt);
409
+ }
410
+ catch (error) {
411
+ const normalizedError = this.normalizeError(error, context);
412
+ lastError = normalizedError;
413
+ const isClientError = normalizedError.statusCode !== undefined &&
414
+ normalizedError.statusCode >= 400 &&
415
+ normalizedError.statusCode < 500 &&
416
+ normalizedError.statusCode !== 429;
417
+ const shouldRetry = normalizedError.retryable && !isClientError && attempt < this.maxRetries;
418
+ if (!shouldRetry) {
419
+ throw normalizedError;
420
+ }
421
+ const backoffMs = normalizedError.details?.retryAfterMs
422
+ ? Number(normalizedError.details.retryAfterMs)
423
+ : delayMs;
424
+ this.logWarn('download.retry', {
425
+ ...context,
426
+ operation,
427
+ attempt,
428
+ nextDelayMs: backoffMs,
429
+ statusCode: normalizedError.statusCode,
430
+ message: normalizedError.message,
431
+ });
432
+ await this.delay(backoffMs);
433
+ delayMs *= 2;
434
+ }
435
+ }
436
+ throw lastError ?? new SlackFileDownloadError(`${operation} failed`, { retryable: false });
437
+ }
438
+ normalizeError(error, context) {
439
+ if (error instanceof SlackFileDownloadError) {
440
+ return error;
441
+ }
442
+ const statusCode = error?.status ?? error?.statusCode;
443
+ const slackErrorCode = error?.data?.error;
444
+ if (slackErrorCode === 'ratelimited') {
445
+ const retryAfterMs = error?.data?.retry_after ? Number(error.data.retry_after) * 1000 : undefined;
446
+ return new SlackFileDownloadError('Slack rate limit exceeded. Please wait and retry.', {
447
+ statusCode: 429,
448
+ suggestion: 'Wait briefly or reduce request frequency.',
449
+ retryable: true,
450
+ details: { ...context, retryAfterMs },
451
+ });
452
+ }
453
+ if (slackErrorCode === 'file_not_found') {
454
+ return new SlackFileDownloadError('File not found on Slack.', {
455
+ statusCode: 404,
456
+ suggestion: 'Verify the file is still available and shared with the bot.',
457
+ retryable: false,
458
+ details: context,
459
+ });
460
+ }
461
+ if (statusCode === 403 || slackErrorCode === 'not_authed' || slackErrorCode === 'invalid_auth') {
462
+ return new SlackFileDownloadError('Slack authentication failed while downloading the file.', {
463
+ statusCode: 403,
464
+ suggestion: 'Confirm the bot token is valid and has files:read scope.',
465
+ retryable: false,
466
+ details: context,
467
+ });
468
+ }
469
+ if (statusCode === 404) {
470
+ return new SlackFileDownloadError('File not found or no longer available on Slack.', {
471
+ statusCode: 404,
472
+ suggestion: 'Verify the file is still available and shared with the bot.',
473
+ retryable: false,
474
+ details: context,
475
+ });
476
+ }
477
+ if (statusCode === 429) {
478
+ return new SlackFileDownloadError('Slack rate limit exceeded. Please wait and retry.', {
479
+ statusCode: 429,
480
+ suggestion: 'Wait briefly or reduce request frequency.',
481
+ retryable: true,
482
+ details: context,
483
+ });
484
+ }
485
+ if (statusCode !== undefined) {
486
+ return new SlackFileDownloadError(`Slack API request failed with status ${statusCode}.`, {
487
+ statusCode,
488
+ suggestion: statusCode >= 500 ? 'Retry after a short delay.' : 'Check Slack permissions or file availability.',
489
+ retryable: statusCode >= 500,
490
+ details: context,
491
+ });
492
+ }
493
+ this.logger.error(`🔴 Raw error details: ${JSON.stringify({
494
+ message: error.message,
495
+ name: error.name,
496
+ stack: error.stack?.split('\n')[0],
497
+ code: error.code,
498
+ type: error.type,
499
+ })}`);
500
+ return new SlackFileDownloadError('Network error while communicating with Slack.', {
501
+ suggestion: 'Check your network connection and try again.',
502
+ retryable: true,
503
+ details: context,
504
+ });
505
+ }
506
+ logInfo(event, context) {
507
+ this.logger.log(`${event} | ${JSON.stringify(context)}`);
508
+ }
509
+ logWarn(event, context) {
510
+ this.logger.warn(`${event} | ${JSON.stringify(context)}`);
511
+ }
512
+ logError(event, error, context) {
513
+ const payload = {
514
+ ...context,
515
+ statusCode: error.statusCode,
516
+ suggestion: error.suggestion,
517
+ };
518
+ this.logger.error(`${event} | ${error.message} | ${JSON.stringify(payload)}`);
519
+ }
520
+ delay(ms) {
521
+ return new Promise(resolve => setTimeout(resolve, ms));
522
+ }
523
+ async checkDiskSpace(context) {
524
+ try {
525
+ const stats = await fs.promises.statfs(this.downloadDir);
526
+ const availableSpace = stats.bavail * stats.bsize;
527
+ this.logInfo('disk_space.check', {
528
+ ...context,
529
+ availableBytes: availableSpace,
530
+ availableMB: Math.round(availableSpace / (1024 * 1024)),
531
+ minRequiredBytes: this.minDiskSpaceBytes,
532
+ });
533
+ if (availableSpace < this.minDiskSpaceBytes) {
534
+ throw new SlackFileDownloadError(`Insufficient disk space: ${this.formatFileSize(availableSpace)} available (minimum: ${this.formatFileSize(this.minDiskSpaceBytes)})`, {
535
+ statusCode: 507,
536
+ suggestion: 'Free up disk space or configure a different download directory.',
537
+ retryable: false,
538
+ details: { ...context, availableBytes: availableSpace },
539
+ });
540
+ }
541
+ }
542
+ catch (error) {
543
+ if (error.code === 'ENOENT') {
544
+ return;
545
+ }
546
+ if (error instanceof SlackFileDownloadError) {
547
+ throw error;
548
+ }
549
+ this.logWarn('disk_space.check_failed', {
550
+ ...context,
551
+ error: error.message,
552
+ suggestion: 'Disk space check unavailable - continuing anyway',
553
+ });
554
+ }
555
+ }
556
+ }
557
+ exports.SlackFileDownloadService = SlackFileDownloadService;
558
+ //# sourceMappingURL=slack-file-download.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-file-download.service.js","sourceRoot":"","sources":["../../../src/slack/services/slack-file-download.service.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ export declare class SlackBot {
9
9
  private app;
10
10
  private formatter;
11
11
  private conversationHistory;
12
+ private fileDownloadService;
12
13
  private defaultAgent;
13
14
  private botUserId;
14
15
  private botId;
@@ -19,6 +20,10 @@ export declare class SlackBot {
19
20
  private shouldRespondToMessage;
20
21
  private registerHandlers;
21
22
  private handleCommand;
23
+ private handleFileShared;
24
+ private handleMessageWithFiles;
25
+ private downloadHistoricalFiles;
26
+ private formatFileSize;
22
27
  private handleViewDetails;
23
28
  private handleRerun;
24
29
  start(): Promise<void>;