@crewx/cli 0.8.0-rc.66 → 0.8.0-rc.82

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 (281) hide show
  1. package/bin/crewx +2 -0
  2. package/dist/bootstrap/crewx-cli.d.ts +11 -0
  3. package/dist/bootstrap/crewx-cli.js +31 -0
  4. package/dist/builtin.d.ts +15 -0
  5. package/dist/{cli/builtin.handler.js → builtin.js} +21 -7
  6. package/dist/commands/agent.d.ts +12 -0
  7. package/dist/commands/agent.js +246 -0
  8. package/dist/commands/doctor.d.ts +12 -0
  9. package/dist/commands/doctor.js +190 -0
  10. package/dist/commands/execute.d.ts +21 -0
  11. package/dist/commands/execute.js +117 -0
  12. package/dist/commands/hook/install.d.ts +21 -0
  13. package/dist/commands/hook/install.js +175 -0
  14. package/dist/commands/hook/paths.d.ts +19 -0
  15. package/dist/commands/hook/paths.js +94 -0
  16. package/dist/commands/hook/status.d.ts +7 -0
  17. package/dist/commands/hook/status.js +86 -0
  18. package/dist/commands/hook/uninstall.d.ts +8 -0
  19. package/dist/commands/hook/uninstall.js +71 -0
  20. package/dist/commands/hook-dispatch.d.ts +15 -0
  21. package/dist/commands/hook-dispatch.js +180 -0
  22. package/dist/commands/init.d.ts +24 -0
  23. package/dist/commands/init.js +133 -0
  24. package/dist/commands/kill.d.ts +12 -0
  25. package/dist/commands/kill.js +49 -0
  26. package/dist/commands/log.d.ts +13 -0
  27. package/dist/commands/log.js +97 -0
  28. package/dist/commands/parse-agent-message.d.ts +31 -0
  29. package/dist/commands/parse-agent-message.js +52 -0
  30. package/dist/commands/parse-common-flags.d.ts +36 -0
  31. package/dist/commands/parse-common-flags.js +105 -0
  32. package/dist/commands/ps.d.ts +12 -0
  33. package/dist/commands/ps.js +71 -0
  34. package/dist/commands/query.d.ts +21 -0
  35. package/dist/commands/query.js +117 -0
  36. package/dist/commands/result.d.ts +13 -0
  37. package/dist/commands/result.js +73 -0
  38. package/dist/commands/slack.d.ts +12 -0
  39. package/dist/commands/slack.js +559 -0
  40. package/dist/commands/task-db.d.ts +33 -0
  41. package/dist/commands/task-db.js +107 -0
  42. package/dist/examples/deny-secrets-plugin.d.ts +22 -0
  43. package/dist/examples/deny-secrets-plugin.js +40 -0
  44. package/dist/index.d.ts +1 -0
  45. package/dist/index.js +5 -0
  46. package/dist/logging.d.ts +21 -0
  47. package/dist/logging.js +86 -0
  48. package/dist/main.d.ts +10 -0
  49. package/dist/main.js +246 -256
  50. package/dist/plugins/examples/echo-hook.d.ts +24 -0
  51. package/dist/plugins/examples/echo-hook.js +60 -0
  52. package/dist/plugins/examples/verify-echo-hook.d.ts +8 -0
  53. package/dist/plugins/examples/verify-echo-hook.js +47 -0
  54. package/dist/plugins/sqlite-tracing.d.ts +13 -0
  55. package/dist/plugins/sqlite-tracing.js +20 -0
  56. package/dist/register-builtin-tools.d.ts +5 -0
  57. package/dist/register-builtin-tools.js +9 -0
  58. package/dist/slack/file-download.d.ts +17 -0
  59. package/dist/slack/file-download.js +134 -0
  60. package/dist/slack/markdown.d.ts +5 -0
  61. package/dist/slack/markdown.js +33 -0
  62. package/dist/utils/env-defaults.d.ts +5 -0
  63. package/dist/utils/env-defaults.js +10 -0
  64. package/dist/utils/version.d.ts +1 -0
  65. package/dist/utils/version.js +28 -0
  66. package/package.json +32 -115
  67. package/README.md +0 -663
  68. package/dist/ai-provider.service.d.ts +0 -36
  69. package/dist/ai-provider.service.js +0 -315
  70. package/dist/ai-provider.service.js.map +0 -1
  71. package/dist/ai.service.d.ts +0 -17
  72. package/dist/ai.service.js +0 -51
  73. package/dist/ai.service.js.map +0 -1
  74. package/dist/app.module.d.ts +0 -5
  75. package/dist/app.module.js +0 -165
  76. package/dist/app.module.js.map +0 -1
  77. package/dist/cli/agent.handler.d.ts +0 -2
  78. package/dist/cli/agent.handler.js +0 -186
  79. package/dist/cli/agent.handler.js.map +0 -1
  80. package/dist/cli/builtin.handler.d.ts +0 -3
  81. package/dist/cli/builtin.handler.js.map +0 -1
  82. package/dist/cli/chat.handler.d.ts +0 -20
  83. package/dist/cli/chat.handler.js +0 -446
  84. package/dist/cli/chat.handler.js.map +0 -1
  85. package/dist/cli/cli.handler.d.ts +0 -4
  86. package/dist/cli/cli.handler.js +0 -119
  87. package/dist/cli/cli.handler.js.map +0 -1
  88. package/dist/cli/doctor.handler.d.ts +0 -38
  89. package/dist/cli/doctor.handler.js +0 -495
  90. package/dist/cli/doctor.handler.js.map +0 -1
  91. package/dist/cli/execute.handler.d.ts +0 -2
  92. package/dist/cli/execute.handler.js +0 -376
  93. package/dist/cli/execute.handler.js.map +0 -1
  94. package/dist/cli/help.handler.d.ts +0 -2
  95. package/dist/cli/help.handler.js +0 -10
  96. package/dist/cli/help.handler.js.map +0 -1
  97. package/dist/cli/init.handler.d.ts +0 -26
  98. package/dist/cli/init.handler.js +0 -450
  99. package/dist/cli/init.handler.js.map +0 -1
  100. package/dist/cli/log.handler.d.ts +0 -2
  101. package/dist/cli/log.handler.js +0 -69
  102. package/dist/cli/log.handler.js.map +0 -1
  103. package/dist/cli/mcp.handler.d.ts +0 -3
  104. package/dist/cli/mcp.handler.js +0 -121
  105. package/dist/cli/mcp.handler.js.map +0 -1
  106. package/dist/cli/query.handler.d.ts +0 -2
  107. package/dist/cli/query.handler.js +0 -392
  108. package/dist/cli/query.handler.js.map +0 -1
  109. package/dist/cli/skill.handler.d.ts +0 -2
  110. package/dist/cli/skill.handler.js +0 -252
  111. package/dist/cli/skill.handler.js.map +0 -1
  112. package/dist/cli/slack-files.handler.d.ts +0 -2
  113. package/dist/cli/slack-files.handler.js +0 -291
  114. package/dist/cli/slack-files.handler.js.map +0 -1
  115. package/dist/cli/template.handler.d.ts +0 -2
  116. package/dist/cli/template.handler.js +0 -188
  117. package/dist/cli/template.handler.js.map +0 -1
  118. package/dist/cli/templates.handler.d.ts +0 -2
  119. package/dist/cli/templates.handler.js +0 -100
  120. package/dist/cli/templates.handler.js.map +0 -1
  121. package/dist/cli-options.d.ts +0 -40
  122. package/dist/cli-options.js +0 -371
  123. package/dist/cli-options.js.map +0 -1
  124. package/dist/config/timeout.config.d.ts +0 -14
  125. package/dist/config/timeout.config.js +0 -34
  126. package/dist/config/timeout.config.js.map +0 -1
  127. package/dist/conversation/base-conversation-history.provider.d.ts +0 -12
  128. package/dist/conversation/base-conversation-history.provider.js +0 -45
  129. package/dist/conversation/base-conversation-history.provider.js.map +0 -1
  130. package/dist/conversation/cli-box-reader.adapter.d.ts +0 -6
  131. package/dist/conversation/cli-box-reader.adapter.js +0 -10
  132. package/dist/conversation/cli-box-reader.adapter.js.map +0 -1
  133. package/dist/conversation/cli-conversation-history.provider.d.ts +0 -16
  134. package/dist/conversation/cli-conversation-history.provider.js +0 -112
  135. package/dist/conversation/cli-conversation-history.provider.js.map +0 -1
  136. package/dist/conversation/cli-task-reader.adapter.d.ts +0 -6
  137. package/dist/conversation/cli-task-reader.adapter.js +0 -25
  138. package/dist/conversation/cli-task-reader.adapter.js.map +0 -1
  139. package/dist/conversation/conversation-provider.factory.d.ts +0 -10
  140. package/dist/conversation/conversation-provider.factory.js +0 -50
  141. package/dist/conversation/conversation-provider.factory.js.map +0 -1
  142. package/dist/conversation/index.d.ts +0 -8
  143. package/dist/conversation/index.js +0 -29
  144. package/dist/conversation/index.js.map +0 -1
  145. package/dist/conversation/slack-conversation-history.provider.d.ts +0 -29
  146. package/dist/conversation/slack-conversation-history.provider.js +0 -302
  147. package/dist/conversation/slack-conversation-history.provider.js.map +0 -1
  148. package/dist/crewx.tool.d.ts +0 -360
  149. package/dist/crewx.tool.js +0 -2531
  150. package/dist/crewx.tool.js.map +0 -1
  151. package/dist/crewx.tool.spec.d.ts +0 -1
  152. package/dist/crewx.tool.spec.js +0 -222
  153. package/dist/crewx.tool.spec.js.map +0 -1
  154. package/dist/guards/bearer-auth.guard.d.ts +0 -7
  155. package/dist/guards/bearer-auth.guard.js +0 -44
  156. package/dist/guards/bearer-auth.guard.js.map +0 -1
  157. package/dist/health.controller.d.ts +0 -6
  158. package/dist/health.controller.js +0 -32
  159. package/dist/health.controller.js.map +0 -1
  160. package/dist/main.js.map +0 -1
  161. package/dist/mcp.controller.d.ts +0 -8
  162. package/dist/mcp.controller.js +0 -62
  163. package/dist/mcp.controller.js.map +0 -1
  164. package/dist/package.json +0 -3
  165. package/dist/providers/dynamic-provider.factory.d.ts +0 -17
  166. package/dist/providers/dynamic-provider.factory.js +0 -138
  167. package/dist/providers/dynamic-provider.factory.js.map +0 -1
  168. package/dist/providers/logger.adapter.d.ts +0 -7
  169. package/dist/providers/logger.adapter.js +0 -107
  170. package/dist/providers/logger.adapter.js.map +0 -1
  171. package/dist/services/agent-loader.service.d.ts +0 -35
  172. package/dist/services/agent-loader.service.js +0 -623
  173. package/dist/services/agent-loader.service.js.map +0 -1
  174. package/dist/services/auth.service.d.ts +0 -9
  175. package/dist/services/auth.service.js +0 -47
  176. package/dist/services/auth.service.js.map +0 -1
  177. package/dist/services/config-validator.service.d.ts +0 -29
  178. package/dist/services/config-validator.service.js +0 -483
  179. package/dist/services/config-validator.service.js.map +0 -1
  180. package/dist/services/config.service.d.ts +0 -45
  181. package/dist/services/config.service.js +0 -352
  182. package/dist/services/config.service.js.map +0 -1
  183. package/dist/services/document-loader.service.d.ts +0 -26
  184. package/dist/services/document-loader.service.js +0 -186
  185. package/dist/services/document-loader.service.js.map +0 -1
  186. package/dist/services/help.service.d.ts +0 -5
  187. package/dist/services/help.service.js +0 -139
  188. package/dist/services/help.service.js.map +0 -1
  189. package/dist/services/intelligent-compression.service.d.ts +0 -20
  190. package/dist/services/intelligent-compression.service.js +0 -179
  191. package/dist/services/intelligent-compression.service.js.map +0 -1
  192. package/dist/services/mcp-client.service.d.ts +0 -26
  193. package/dist/services/mcp-client.service.js +0 -81
  194. package/dist/services/mcp-client.service.js.map +0 -1
  195. package/dist/services/parallel-processing.service.d.ts +0 -108
  196. package/dist/services/parallel-processing.service.js +0 -333
  197. package/dist/services/parallel-processing.service.js.map +0 -1
  198. package/dist/services/provider-bridge.service.d.ts +0 -35
  199. package/dist/services/provider-bridge.service.js +0 -224
  200. package/dist/services/provider-bridge.service.js.map +0 -1
  201. package/dist/services/remote-agent.service.d.ts +0 -50
  202. package/dist/services/remote-agent.service.js +0 -171
  203. package/dist/services/remote-agent.service.js.map +0 -1
  204. package/dist/services/result-formatter.service.d.ts +0 -27
  205. package/dist/services/result-formatter.service.js +0 -126
  206. package/dist/services/result-formatter.service.js.map +0 -1
  207. package/dist/services/skill-loader.service.d.ts +0 -15
  208. package/dist/services/skill-loader.service.js +0 -278
  209. package/dist/services/skill-loader.service.js.map +0 -1
  210. package/dist/services/skill.service.d.ts +0 -69
  211. package/dist/services/skill.service.js +0 -779
  212. package/dist/services/skill.service.js.map +0 -1
  213. package/dist/services/skill.service.spec.d.ts +0 -1
  214. package/dist/services/skill.service.spec.js +0 -168
  215. package/dist/services/skill.service.spec.js.map +0 -1
  216. package/dist/services/task-management.service.d.ts +0 -71
  217. package/dist/services/task-management.service.js +0 -324
  218. package/dist/services/task-management.service.js.map +0 -1
  219. package/dist/services/template.service.d.ts +0 -61
  220. package/dist/services/template.service.js +0 -416
  221. package/dist/services/template.service.js.map +0 -1
  222. package/dist/services/tool-call.service.d.ts +0 -16
  223. package/dist/services/tool-call.service.js +0 -302
  224. package/dist/services/tool-call.service.js.map +0 -1
  225. package/dist/services/tracing.service.d.ts +0 -197
  226. package/dist/services/tracing.service.js +0 -1267
  227. package/dist/services/tracing.service.js.map +0 -1
  228. package/dist/slack/formatters/message.formatter.d.ts +0 -43
  229. package/dist/slack/formatters/message.formatter.js +0 -505
  230. package/dist/slack/formatters/message.formatter.js.map +0 -1
  231. package/dist/slack/services/slack-file-download.service.d.ts +0 -58
  232. package/dist/slack/services/slack-file-download.service.js +0 -558
  233. package/dist/slack/services/slack-file-download.service.js.map +0 -1
  234. package/dist/slack/slack-bot.d.ts +0 -33
  235. package/dist/slack/slack-bot.js +0 -568
  236. package/dist/slack/slack-bot.js.map +0 -1
  237. package/dist/stderr.logger.d.ts +0 -8
  238. package/dist/stderr.logger.js +0 -26
  239. package/dist/stderr.logger.js.map +0 -1
  240. package/dist/types/usage.types.d.ts +0 -107
  241. package/dist/types/usage.types.js +0 -3
  242. package/dist/types/usage.types.js.map +0 -1
  243. package/dist/utils/config-utils.d.ts +0 -15
  244. package/dist/utils/config-utils.js +0 -69
  245. package/dist/utils/config-utils.js.map +0 -1
  246. package/dist/utils/extract-text.d.ts +0 -1
  247. package/dist/utils/extract-text.js +0 -15
  248. package/dist/utils/extract-text.js.map +0 -1
  249. package/dist/utils/mcp-installer.d.ts +0 -20
  250. package/dist/utils/mcp-installer.js +0 -199
  251. package/dist/utils/mcp-installer.js.map +0 -1
  252. package/dist/utils/project-hash.d.ts +0 -6
  253. package/dist/utils/project-hash.js +0 -70
  254. package/dist/utils/project-hash.js.map +0 -1
  255. package/dist/utils/simple-security.d.ts +0 -3
  256. package/dist/utils/simple-security.js +0 -20
  257. package/dist/utils/simple-security.js.map +0 -1
  258. package/dist/utils/stdin-utils.d.ts +0 -6
  259. package/dist/utils/stdin-utils.js +0 -109
  260. package/dist/utils/stdin-utils.js.map +0 -1
  261. package/dist/utils/template-processor.d.ts +0 -27
  262. package/dist/utils/template-processor.js +0 -395
  263. package/dist/utils/template-processor.js.map +0 -1
  264. package/dist/utils/terminal-message-formatter.d.ts +0 -23
  265. package/dist/utils/terminal-message-formatter.js +0 -136
  266. package/dist/utils/terminal-message-formatter.js.map +0 -1
  267. package/dist/version.d.ts +0 -1
  268. package/dist/version.js +0 -17
  269. package/dist/version.js.map +0 -1
  270. package/dist/workspace.service.d.ts +0 -44
  271. package/dist/workspace.service.js +0 -299
  272. package/dist/workspace.service.js.map +0 -1
  273. package/scripts/backfill-tokens.js +0 -218
  274. package/scripts/postbuild-cli.mjs +0 -88
  275. package/scripts/postinstall-cli.mjs +0 -30
  276. package/templates/agents/default.yaml +0 -490
  277. package/templates/agents/minimal.yaml +0 -16
  278. package/templates/documents/conversation-history-default.hbs +0 -17
  279. package/templates/documents/crewx-manual.md +0 -2278
  280. package/templates/documents/crewx-quick-guide.md +0 -147
  281. package/templates/versions.json +0 -19
@@ -1,58 +0,0 @@
1
- import { WebClient } from '@slack/web-api';
2
- import { ConfigService } from '../../services/config.service';
3
- export interface SlackFileMetadata {
4
- fileId: string;
5
- fileName: string;
6
- filePath: string;
7
- fileSize: number;
8
- mimeType: string;
9
- uploadedBy: string;
10
- uploadedAt: Date;
11
- threadId: string;
12
- channelId: string;
13
- downloadedAt: Date;
14
- }
15
- export declare class SlackFileDownloadError extends Error {
16
- statusCode?: number;
17
- suggestion?: string;
18
- retryable: boolean;
19
- details?: Record<string, unknown>;
20
- constructor(message: string, options?: {
21
- statusCode?: number;
22
- suggestion?: string;
23
- retryable?: boolean;
24
- details?: Record<string, unknown>;
25
- });
26
- }
27
- export declare class SlackFileDownloadService {
28
- private readonly configService;
29
- private readonly logger;
30
- private readonly downloadDir;
31
- private readonly maxFileSize;
32
- private readonly allowedMimeTypes;
33
- private readonly maxRetries;
34
- private readonly baseBackoffMs;
35
- private readonly networkTimeoutMs;
36
- private readonly minDiskSpaceBytes;
37
- constructor(configService: ConfigService);
38
- downloadFile(client: WebClient, fileId: string, fileName: string, threadId: string, channelId: string, userId: string): Promise<SlackFileMetadata>;
39
- private fetchFileFromSlack;
40
- private makeUniqueFileName;
41
- private sanitizeFileName;
42
- getThreadFiles(threadId: string): Promise<string[]>;
43
- getThreadFilesMetadata(threadId: string): Promise<SlackFileMetadata[]>;
44
- ensureFileDownloaded(client: WebClient, fileId: string, fileName: string, threadId: string, channelId: string, userId: string): Promise<SlackFileMetadata>;
45
- private formatFileSize;
46
- private guessMimeType;
47
- private isAllowedMimeType;
48
- private getFileInfo;
49
- private mapSlackErrorResponse;
50
- private validateFileInfo;
51
- private withRetry;
52
- private normalizeError;
53
- private logInfo;
54
- private logWarn;
55
- private logError;
56
- private delay;
57
- private checkDiskSpace;
58
- }
@@ -1,558 +0,0 @@
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
@@ -1 +0,0 @@
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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"}