@crewx/cli 0.8.3-rc.9 → 0.8.4-rc.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 (222) hide show
  1. package/README.md +33 -33
  2. package/bin/crewx +2 -2
  3. package/dist/ai-provider.service.d.ts +34 -0
  4. package/dist/ai-provider.service.js +311 -0
  5. package/dist/ai-provider.service.js.map +1 -0
  6. package/dist/ai.service.d.ts +17 -0
  7. package/dist/ai.service.js +51 -0
  8. package/dist/ai.service.js.map +1 -0
  9. package/dist/app.module.d.ts +5 -0
  10. package/dist/app.module.js +165 -0
  11. package/dist/app.module.js.map +1 -0
  12. package/dist/cli/agent.handler.d.ts +2 -0
  13. package/dist/cli/agent.handler.js +186 -0
  14. package/dist/cli/agent.handler.js.map +1 -0
  15. package/dist/cli/builtin.handler.d.ts +3 -0
  16. package/dist/cli/builtin.handler.js +110 -0
  17. package/dist/cli/builtin.handler.js.map +1 -0
  18. package/dist/cli/chat.handler.d.ts +20 -0
  19. package/dist/cli/chat.handler.js +446 -0
  20. package/dist/cli/chat.handler.js.map +1 -0
  21. package/dist/cli/cli.handler.d.ts +4 -0
  22. package/dist/cli/cli.handler.js +119 -0
  23. package/dist/cli/cli.handler.js.map +1 -0
  24. package/dist/cli/doctor.handler.d.ts +38 -0
  25. package/dist/cli/doctor.handler.js +495 -0
  26. package/dist/cli/doctor.handler.js.map +1 -0
  27. package/dist/cli/execute.handler.d.ts +2 -0
  28. package/dist/cli/execute.handler.js +321 -0
  29. package/dist/cli/execute.handler.js.map +1 -0
  30. package/dist/cli/help.handler.d.ts +2 -0
  31. package/dist/cli/help.handler.js +10 -0
  32. package/dist/cli/help.handler.js.map +1 -0
  33. package/dist/cli/init.handler.d.ts +26 -0
  34. package/dist/cli/init.handler.js +450 -0
  35. package/dist/cli/init.handler.js.map +1 -0
  36. package/dist/cli/log.handler.d.ts +2 -0
  37. package/dist/cli/log.handler.js +69 -0
  38. package/dist/cli/log.handler.js.map +1 -0
  39. package/dist/cli/mcp.handler.d.ts +3 -0
  40. package/dist/cli/mcp.handler.js +121 -0
  41. package/dist/cli/mcp.handler.js.map +1 -0
  42. package/dist/cli/query.handler.d.ts +2 -0
  43. package/dist/cli/query.handler.js +379 -0
  44. package/dist/cli/query.handler.js.map +1 -0
  45. package/dist/cli/skill.handler.d.ts +2 -0
  46. package/dist/cli/skill.handler.js +252 -0
  47. package/dist/cli/skill.handler.js.map +1 -0
  48. package/dist/cli/slack-files.handler.d.ts +2 -0
  49. package/dist/cli/slack-files.handler.js +291 -0
  50. package/dist/cli/slack-files.handler.js.map +1 -0
  51. package/dist/cli/template.handler.d.ts +2 -0
  52. package/dist/cli/template.handler.js +188 -0
  53. package/dist/cli/template.handler.js.map +1 -0
  54. package/dist/cli/templates.handler.d.ts +2 -0
  55. package/dist/cli/templates.handler.js +100 -0
  56. package/dist/cli/templates.handler.js.map +1 -0
  57. package/dist/cli-options.d.ts +39 -0
  58. package/dist/cli-options.js +355 -0
  59. package/dist/cli-options.js.map +1 -0
  60. package/dist/commands/agent.js +23 -23
  61. package/dist/commands/init.js +36 -28
  62. package/dist/commands/resolve-prompt.d.ts +4 -4
  63. package/dist/commands/resolve-prompt.js +5 -5
  64. package/dist/config/timeout.config.d.ts +14 -0
  65. package/dist/config/timeout.config.js +34 -0
  66. package/dist/config/timeout.config.js.map +1 -0
  67. package/dist/conversation/base-conversation-history.provider.d.ts +12 -0
  68. package/dist/conversation/base-conversation-history.provider.js +45 -0
  69. package/dist/conversation/base-conversation-history.provider.js.map +1 -0
  70. package/dist/conversation/cli-conversation-history.provider.d.ts +16 -0
  71. package/dist/conversation/cli-conversation-history.provider.js +111 -0
  72. package/dist/conversation/cli-conversation-history.provider.js.map +1 -0
  73. package/dist/conversation/conversation-provider.factory.d.ts +10 -0
  74. package/dist/conversation/conversation-provider.factory.js +50 -0
  75. package/dist/conversation/conversation-provider.factory.js.map +1 -0
  76. package/dist/conversation/index.d.ts +6 -0
  77. package/dist/conversation/index.js +27 -0
  78. package/dist/conversation/index.js.map +1 -0
  79. package/dist/conversation/slack-conversation-history.provider.d.ts +29 -0
  80. package/dist/conversation/slack-conversation-history.provider.js +302 -0
  81. package/dist/conversation/slack-conversation-history.provider.js.map +1 -0
  82. package/dist/crewx.tool.d.ts +359 -0
  83. package/dist/crewx.tool.js +2501 -0
  84. package/dist/crewx.tool.js.map +1 -0
  85. package/dist/crewx.tool.spec.d.ts +1 -0
  86. package/dist/crewx.tool.spec.js +158 -0
  87. package/dist/crewx.tool.spec.js.map +1 -0
  88. package/dist/guards/bearer-auth.guard.d.ts +7 -0
  89. package/dist/guards/bearer-auth.guard.js +44 -0
  90. package/dist/guards/bearer-auth.guard.js.map +1 -0
  91. package/dist/health.controller.d.ts +6 -0
  92. package/dist/health.controller.js +32 -0
  93. package/dist/health.controller.js.map +1 -0
  94. package/dist/main.js +72 -71
  95. package/dist/main.js.map +1 -0
  96. package/dist/mcp.controller.d.ts +8 -0
  97. package/dist/mcp.controller.js +62 -0
  98. package/dist/mcp.controller.js.map +1 -0
  99. package/dist/package.json +3 -0
  100. package/dist/providers/dynamic-provider.factory.d.ts +15 -0
  101. package/dist/providers/dynamic-provider.factory.js +133 -0
  102. package/dist/providers/dynamic-provider.factory.js.map +1 -0
  103. package/dist/providers/logger.adapter.d.ts +6 -0
  104. package/dist/providers/logger.adapter.js +102 -0
  105. package/dist/providers/logger.adapter.js.map +1 -0
  106. package/dist/services/agent-loader.service.d.ts +35 -0
  107. package/dist/services/agent-loader.service.js +622 -0
  108. package/dist/services/agent-loader.service.js.map +1 -0
  109. package/dist/services/auth.service.d.ts +9 -0
  110. package/dist/services/auth.service.js +47 -0
  111. package/dist/services/auth.service.js.map +1 -0
  112. package/dist/services/config-validator.service.d.ts +29 -0
  113. package/dist/services/config-validator.service.js +483 -0
  114. package/dist/services/config-validator.service.js.map +1 -0
  115. package/dist/services/config.service.d.ts +45 -0
  116. package/dist/services/config.service.js +352 -0
  117. package/dist/services/config.service.js.map +1 -0
  118. package/dist/services/document-loader.service.d.ts +21 -0
  119. package/dist/services/document-loader.service.js +156 -0
  120. package/dist/services/document-loader.service.js.map +1 -0
  121. package/dist/services/help.service.d.ts +5 -0
  122. package/dist/services/help.service.js +139 -0
  123. package/dist/services/help.service.js.map +1 -0
  124. package/dist/services/intelligent-compression.service.d.ts +20 -0
  125. package/dist/services/intelligent-compression.service.js +179 -0
  126. package/dist/services/intelligent-compression.service.js.map +1 -0
  127. package/dist/services/mcp-client.service.d.ts +26 -0
  128. package/dist/services/mcp-client.service.js +81 -0
  129. package/dist/services/mcp-client.service.js.map +1 -0
  130. package/dist/services/parallel-processing.service.d.ts +108 -0
  131. package/dist/services/parallel-processing.service.js +333 -0
  132. package/dist/services/parallel-processing.service.js.map +1 -0
  133. package/dist/services/provider-bridge.service.d.ts +35 -0
  134. package/dist/services/provider-bridge.service.js +224 -0
  135. package/dist/services/provider-bridge.service.js.map +1 -0
  136. package/dist/services/remote-agent.service.d.ts +50 -0
  137. package/dist/services/remote-agent.service.js +171 -0
  138. package/dist/services/remote-agent.service.js.map +1 -0
  139. package/dist/services/result-formatter.service.d.ts +27 -0
  140. package/dist/services/result-formatter.service.js +126 -0
  141. package/dist/services/result-formatter.service.js.map +1 -0
  142. package/dist/services/skill-loader.service.d.ts +15 -0
  143. package/dist/services/skill-loader.service.js +278 -0
  144. package/dist/services/skill-loader.service.js.map +1 -0
  145. package/dist/services/skill.service.d.ts +67 -0
  146. package/dist/services/skill.service.js +670 -0
  147. package/dist/services/skill.service.js.map +1 -0
  148. package/dist/services/skill.service.spec.d.ts +1 -0
  149. package/dist/services/skill.service.spec.js +35 -0
  150. package/dist/services/skill.service.spec.js.map +1 -0
  151. package/dist/services/task-management.service.d.ts +65 -0
  152. package/dist/services/task-management.service.js +288 -0
  153. package/dist/services/task-management.service.js.map +1 -0
  154. package/dist/services/template.service.d.ts +61 -0
  155. package/dist/services/template.service.js +416 -0
  156. package/dist/services/template.service.js.map +1 -0
  157. package/dist/services/tool-call.service.d.ts +19 -0
  158. package/dist/services/tool-call.service.js +1061 -0
  159. package/dist/services/tool-call.service.js.map +1 -0
  160. package/dist/services/tracing.service.d.ts +200 -0
  161. package/dist/services/tracing.service.js +1290 -0
  162. package/dist/services/tracing.service.js.map +1 -0
  163. package/dist/slack/formatters/message.formatter.d.ts +32 -0
  164. package/dist/slack/formatters/message.formatter.js +352 -0
  165. package/dist/slack/formatters/message.formatter.js.map +1 -0
  166. package/dist/slack/services/slack-file-download.service.d.ts +58 -0
  167. package/dist/slack/services/slack-file-download.service.js +558 -0
  168. package/dist/slack/services/slack-file-download.service.js.map +1 -0
  169. package/dist/slack/slack-bot.d.ts +33 -0
  170. package/dist/slack/slack-bot.js +567 -0
  171. package/dist/slack/slack-bot.js.map +1 -0
  172. package/dist/stderr.logger.d.ts +8 -0
  173. package/dist/stderr.logger.js +26 -0
  174. package/dist/stderr.logger.js.map +1 -0
  175. package/dist/types/usage.types.d.ts +107 -0
  176. package/dist/types/usage.types.js +3 -0
  177. package/dist/types/usage.types.js.map +1 -0
  178. package/dist/utils/config-utils.d.ts +15 -0
  179. package/dist/utils/config-utils.js +69 -0
  180. package/dist/utils/config-utils.js.map +1 -0
  181. package/dist/utils/extract-text.d.ts +1 -0
  182. package/dist/utils/extract-text.js +15 -0
  183. package/dist/utils/extract-text.js.map +1 -0
  184. package/dist/utils/mcp-installer.d.ts +20 -0
  185. package/dist/utils/mcp-installer.js +199 -0
  186. package/dist/utils/mcp-installer.js.map +1 -0
  187. package/dist/utils/project-hash.d.ts +6 -0
  188. package/dist/utils/project-hash.js +70 -0
  189. package/dist/utils/project-hash.js.map +1 -0
  190. package/dist/utils/simple-security.d.ts +3 -0
  191. package/dist/utils/simple-security.js +20 -0
  192. package/dist/utils/simple-security.js.map +1 -0
  193. package/dist/utils/stdin-utils.d.ts +6 -0
  194. package/dist/utils/stdin-utils.js +109 -0
  195. package/dist/utils/stdin-utils.js.map +1 -0
  196. package/dist/utils/template-processor.d.ts +4 -0
  197. package/dist/utils/template-processor.js +266 -0
  198. package/dist/utils/template-processor.js.map +1 -0
  199. package/dist/utils/terminal-message-formatter.d.ts +23 -0
  200. package/dist/utils/terminal-message-formatter.js +136 -0
  201. package/dist/utils/terminal-message-formatter.js.map +1 -0
  202. package/dist/version.d.ts +1 -0
  203. package/dist/version.js +17 -0
  204. package/dist/version.js.map +1 -0
  205. package/dist/workspace.service.d.ts +44 -0
  206. package/dist/workspace.service.js +299 -0
  207. package/dist/workspace.service.js.map +1 -0
  208. package/package.json +18 -18
  209. package/dist/commands/task-db.d.ts +0 -33
  210. package/dist/commands/task-db.js +0 -107
  211. package/dist/examples/deny-secrets-plugin.d.ts +0 -22
  212. package/dist/examples/deny-secrets-plugin.js +0 -40
  213. package/dist/plugins/examples/echo-hook.d.ts +0 -24
  214. package/dist/plugins/examples/echo-hook.js +0 -60
  215. package/dist/plugins/examples/verify-echo-hook.d.ts +0 -8
  216. package/dist/plugins/examples/verify-echo-hook.js +0 -47
  217. package/dist/plugins/sqlite-tracing.d.ts +0 -11
  218. package/dist/plugins/sqlite-tracing.js +0 -19
  219. package/dist/repository/workspace.repository.d.ts +0 -26
  220. package/dist/repository/workspace.repository.js +0 -111
  221. package/dist/schema/tasks.d.ts +0 -7
  222. package/dist/schema/tasks.js +0 -48
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseConversationHistoryProvider = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ class BaseConversationHistoryProvider {
6
+ constructor(loggerContext, compressionService) {
7
+ this.logger = new common_1.Logger(loggerContext);
8
+ this.compressionService = compressionService;
9
+ }
10
+ async formatForAI(thread, options) {
11
+ const maxLength = options?.maxContextLength || 4000;
12
+ const limit = options?.limit || 20;
13
+ const excludeCurrent = options?.excludeCurrent ?? true;
14
+ let messages = [...thread.messages];
15
+ if (excludeCurrent && messages.length > 0) {
16
+ messages = messages.slice(0, -1);
17
+ }
18
+ if (messages.length === 0) {
19
+ return '';
20
+ }
21
+ if (this.compressionService && messages.length > limit) {
22
+ this.logger.debug(`Using intelligent compression for ${messages.length} messages`);
23
+ const threadForCompression = {
24
+ ...thread,
25
+ messages: messages
26
+ };
27
+ return await this.compressionService.compressConversationHistory(threadForCompression, {
28
+ maxTokens: Math.floor(maxLength / 4),
29
+ maxMessages: limit,
30
+ preserveRecentCount: Math.min(5, Math.floor(limit / 4)),
31
+ preserveImportant: true
32
+ });
33
+ }
34
+ return '';
35
+ }
36
+ sanitizeMessage(text) {
37
+ return text
38
+ .replace(/password[:\s]*\S+/gi, 'password: ***')
39
+ .replace(/token[:\s]*\S+/gi, 'token: ***')
40
+ .replace(/api[_-]?key[:\s]*\S+/gi, 'api_key: ***')
41
+ .replace(/secret[:\s]*\S+/gi, 'secret: ***');
42
+ }
43
+ }
44
+ exports.BaseConversationHistoryProvider = BaseConversationHistoryProvider;
45
+ //# sourceMappingURL=base-conversation-history.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-conversation-history.provider.js","sourceRoot":"","sources":["../../src/conversation/base-conversation-history.provider.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAYxC,MAAsB,+BAA+B;IAMnD,YACE,aAAqB,EACrB,kBAAkD;QAElD,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,aAAa,CAAC,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAcD,KAAK,CAAC,WAAW,CACf,MAA0B,EAC1B,OAA6B;QAE7B,MAAM,SAAS,GAAG,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,IAAI,CAAC;QAEvD,IAAI,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAGpC,IAAI,cAAc,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QAGD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAGD,IAAI,IAAI,CAAC,kBAAkB,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;YAEnF,MAAM,oBAAoB,GAAuB;gBAC/C,GAAG,MAAM;gBACT,QAAQ,EAAE,QAAQ;aACnB,CAAC;YAEF,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,2BAA2B,CAC9D,oBAAoB,EACpB;gBACE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;gBACpC,WAAW,EAAE,KAAK;gBAClB,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACvD,iBAAiB,EAAE,IAAI;aACxB,CACF,CAAC;QACJ,CAAC;QAMD,OAAO,EAAE,CAAC;IACZ,CAAC;IAKS,eAAe,CAAC,IAAY;QACpC,OAAO,IAAI;aACR,OAAO,CAAC,qBAAqB,EAAE,eAAe,CAAC;aAC/C,OAAO,CAAC,kBAAkB,EAAE,YAAY,CAAC;aACzC,OAAO,CAAC,wBAAwB,EAAE,cAAc,CAAC;aACjD,OAAO,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;IACjD,CAAC;CACF;AAnFD,0EAmFC"}
@@ -0,0 +1,16 @@
1
+ import { BaseConversationHistoryProvider } from './base-conversation-history.provider';
2
+ import { ConversationMessage, ConversationThread, FetchHistoryOptions } from '@sowonai/crewx-sdk';
3
+ export declare class CliConversationHistoryProvider extends BaseConversationHistoryProvider {
4
+ private storage;
5
+ constructor();
6
+ initialize(): Promise<void>;
7
+ fetchHistory(threadId: string, options?: FetchHistoryOptions): Promise<ConversationThread>;
8
+ addMessage(threadId: string, userId: string, text: string, isAssistant?: boolean, agentId?: string): Promise<ConversationMessage>;
9
+ hasHistory(threadId: string): Promise<boolean>;
10
+ formatForAI(thread: ConversationThread, options?: FetchHistoryOptions): Promise<string>;
11
+ listThreads(): Promise<string[]>;
12
+ deleteThread(threadId: string): Promise<void>;
13
+ createThread(threadId?: string): Promise<string>;
14
+ private createEmptyThread;
15
+ cleanupOldThreads(daysToKeep?: number): Promise<number>;
16
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var CliConversationHistoryProvider_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CliConversationHistoryProvider = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const base_conversation_history_provider_1 = require("./base-conversation-history.provider");
16
+ const internal_1 = require("@sowonai/crewx-sdk/internal");
17
+ let CliConversationHistoryProvider = CliConversationHistoryProvider_1 = class CliConversationHistoryProvider extends base_conversation_history_provider_1.BaseConversationHistoryProvider {
18
+ constructor() {
19
+ super(CliConversationHistoryProvider_1.name);
20
+ this.storage = new internal_1.ConversationStorageService();
21
+ }
22
+ async initialize() {
23
+ await this.storage.initialize();
24
+ }
25
+ async fetchHistory(threadId, options) {
26
+ try {
27
+ this.logger.log(`Fetching CLI thread history: ${threadId}`);
28
+ const thread = await this.storage.loadThread(threadId);
29
+ if (!thread) {
30
+ return this.createEmptyThread(threadId);
31
+ }
32
+ if (options?.limit && thread.messages.length > options.limit) {
33
+ thread.messages = thread.messages.slice(-options.limit);
34
+ }
35
+ this.logger.log(`Retrieved ${thread.messages.length} messages from CLI thread`);
36
+ return thread;
37
+ }
38
+ catch (error) {
39
+ this.logger.error(`Error fetching CLI thread history: ${error.message}`);
40
+ return this.createEmptyThread(threadId);
41
+ }
42
+ }
43
+ async addMessage(threadId, userId, text, isAssistant = false, agentId) {
44
+ const message = {
45
+ id: `${Date.now()}-${Math.random().toString(36).substring(7)}`,
46
+ userId,
47
+ text: this.sanitizeMessage(text),
48
+ timestamp: new Date(),
49
+ isAssistant,
50
+ };
51
+ const normalizedAgentId = agentId?.trim();
52
+ if (normalizedAgentId) {
53
+ message.metadata = {
54
+ ...(message.metadata ?? {}),
55
+ agent_id: normalizedAgentId,
56
+ };
57
+ }
58
+ try {
59
+ await this.storage.addMessage(threadId, message, 'cli');
60
+ this.logger.debug(`Message added to thread ${threadId}${agentId ? ` (agent: ${agentId})` : ''}`);
61
+ return message;
62
+ }
63
+ catch (error) {
64
+ this.logger.error(`Failed to add message: ${error.message}`);
65
+ throw error;
66
+ }
67
+ }
68
+ async hasHistory(threadId) {
69
+ return await this.storage.hasThread(threadId);
70
+ }
71
+ formatForAI(thread, options) {
72
+ return super.formatForAI(thread, options);
73
+ }
74
+ async listThreads() {
75
+ return await this.storage.listThreads();
76
+ }
77
+ async deleteThread(threadId) {
78
+ await this.storage.deleteThread(threadId);
79
+ this.logger.log(`Thread deleted: ${threadId}`);
80
+ }
81
+ async createThread(threadId) {
82
+ const id = threadId || `cli-${Date.now()}`;
83
+ const thread = {
84
+ threadId: id,
85
+ platform: 'cli',
86
+ messages: [],
87
+ metadata: {
88
+ createdAt: new Date().toISOString(),
89
+ },
90
+ };
91
+ await this.storage.saveThread(thread);
92
+ this.logger.log(`New thread created: ${id}`);
93
+ return id;
94
+ }
95
+ createEmptyThread(threadId) {
96
+ return {
97
+ threadId,
98
+ platform: 'cli',
99
+ messages: [],
100
+ };
101
+ }
102
+ async cleanupOldThreads(daysToKeep = 30) {
103
+ return await this.storage.cleanupOldThreads(daysToKeep);
104
+ }
105
+ };
106
+ exports.CliConversationHistoryProvider = CliConversationHistoryProvider;
107
+ exports.CliConversationHistoryProvider = CliConversationHistoryProvider = CliConversationHistoryProvider_1 = __decorate([
108
+ (0, common_1.Injectable)(),
109
+ __metadata("design:paramtypes", [])
110
+ ], CliConversationHistoryProvider);
111
+ //# sourceMappingURL=cli-conversation-history.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-conversation-history.provider.js","sourceRoot":"","sources":["../../src/conversation/cli-conversation-history.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { IConversationHistoryProvider } from '@sowonai/crewx-sdk';
2
+ export type Platform = 'slack' | 'cli';
3
+ export declare class ConversationProviderFactory {
4
+ private readonly logger;
5
+ private providers;
6
+ getProvider(platform: Platform): IConversationHistoryProvider;
7
+ private createProvider;
8
+ hasProvider(platform: Platform): boolean;
9
+ clearProviders(): void;
10
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var ConversationProviderFactory_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ConversationProviderFactory = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const slack_conversation_history_provider_1 = require("./slack-conversation-history.provider");
13
+ const cli_conversation_history_provider_1 = require("./cli-conversation-history.provider");
14
+ let ConversationProviderFactory = ConversationProviderFactory_1 = class ConversationProviderFactory {
15
+ constructor() {
16
+ this.logger = new common_1.Logger(ConversationProviderFactory_1.name);
17
+ this.providers = new Map();
18
+ }
19
+ getProvider(platform) {
20
+ let provider = this.providers.get(platform);
21
+ if (!provider) {
22
+ provider = this.createProvider(platform);
23
+ this.providers.set(platform, provider);
24
+ this.logger.log(`Created ${platform} conversation history provider`);
25
+ }
26
+ return provider;
27
+ }
28
+ createProvider(platform) {
29
+ switch (platform) {
30
+ case 'slack':
31
+ return new slack_conversation_history_provider_1.SlackConversationHistoryProvider();
32
+ case 'cli':
33
+ return new cli_conversation_history_provider_1.CliConversationHistoryProvider();
34
+ default:
35
+ throw new Error(`Unsupported platform: ${platform}`);
36
+ }
37
+ }
38
+ hasProvider(platform) {
39
+ return this.providers.has(platform);
40
+ }
41
+ clearProviders() {
42
+ this.providers.clear();
43
+ this.logger.log('All conversation providers cleared');
44
+ }
45
+ };
46
+ exports.ConversationProviderFactory = ConversationProviderFactory;
47
+ exports.ConversationProviderFactory = ConversationProviderFactory = ConversationProviderFactory_1 = __decorate([
48
+ (0, common_1.Injectable)()
49
+ ], ConversationProviderFactory);
50
+ //# sourceMappingURL=conversation-provider.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-provider.factory.js","sourceRoot":"","sources":["../../src/conversation/conversation-provider.factory.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAoD;AAEpD,+FAAyF;AACzF,2FAAqF;AAQ9E,IAAM,2BAA2B,mCAAjC,MAAM,2BAA2B;IAAjC;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,6BAA2B,CAAC,IAAI,CAAC,CAAC;QAC/D,cAAS,GAAgD,IAAI,GAAG,EAAE,CAAC;IA6C7E,CAAC;IAxCC,WAAW,CAAC,QAAkB;QAC5B,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,QAAQ,gCAAgC,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAKO,cAAc,CAAC,QAAkB;QACvC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,OAAO;gBACV,OAAO,IAAI,sEAAgC,EAAE,CAAC;YAChD,KAAK,KAAK;gBACR,OAAO,IAAI,kEAA8B,EAAE,CAAC;YAC9C;gBACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAKD,WAAW,CAAC,QAAkB;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAKD,cAAc;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AA/CY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;GACA,2BAA2B,CA+CvC"}
@@ -0,0 +1,6 @@
1
+ export { ConversationMessage, ConversationThread, FetchHistoryOptions, IConversationHistoryProvider, ConversationConfig, DEFAULT_CONVERSATION_CONFIG, getConversationConfig, } from '@sowonai/crewx-sdk';
2
+ export { ConversationStorageService } from '@sowonai/crewx-sdk/internal';
3
+ export * from './base-conversation-history.provider';
4
+ export * from './slack-conversation-history.provider';
5
+ export * from './cli-conversation-history.provider';
6
+ export * from './conversation-provider.factory';
@@ -0,0 +1,27 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ConversationStorageService = exports.getConversationConfig = exports.DEFAULT_CONVERSATION_CONFIG = void 0;
18
+ var crewx_sdk_1 = require("@sowonai/crewx-sdk");
19
+ Object.defineProperty(exports, "DEFAULT_CONVERSATION_CONFIG", { enumerable: true, get: function () { return crewx_sdk_1.DEFAULT_CONVERSATION_CONFIG; } });
20
+ Object.defineProperty(exports, "getConversationConfig", { enumerable: true, get: function () { return crewx_sdk_1.getConversationConfig; } });
21
+ var internal_1 = require("@sowonai/crewx-sdk/internal");
22
+ Object.defineProperty(exports, "ConversationStorageService", { enumerable: true, get: function () { return internal_1.ConversationStorageService; } });
23
+ __exportStar(require("./base-conversation-history.provider"), exports);
24
+ __exportStar(require("./slack-conversation-history.provider"), exports);
25
+ __exportStar(require("./cli-conversation-history.provider"), exports);
26
+ __exportStar(require("./conversation-provider.factory"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,gDAQ4B;AAF1B,wHAAA,2BAA2B,OAAA;AAC3B,kHAAA,qBAAqB,OAAA;AAEvB,wDAAyE;AAAhE,sHAAA,0BAA0B,OAAA;AACnC,uEAAqD;AACrD,wEAAsD;AACtD,sEAAoD;AACpD,kEAAgD"}
@@ -0,0 +1,29 @@
1
+ import { WebClient } from '@slack/web-api';
2
+ import { BaseConversationHistoryProvider } from './base-conversation-history.provider';
3
+ import { ConversationThread, FetchHistoryOptions } from '@sowonai/crewx-sdk';
4
+ export declare class SlackConversationHistoryProvider extends BaseConversationHistoryProvider {
5
+ private client?;
6
+ private cache;
7
+ private readonly CACHE_TTL;
8
+ private botInfo?;
9
+ private storage?;
10
+ private storageInitPromise?;
11
+ private loggingEnabled;
12
+ constructor();
13
+ initialize(client: WebClient): void;
14
+ enableLocalLogging(): Promise<void>;
15
+ isLocalLoggingEnabled(): boolean;
16
+ private getBotInfo;
17
+ fetchHistory(threadId: string, options?: FetchHistoryOptions): Promise<ConversationThread>;
18
+ hasHistory(threadId: string): Promise<boolean>;
19
+ formatForAI(thread: ConversationThread, options?: FetchHistoryOptions): Promise<string>;
20
+ private extractMessageContent;
21
+ private cleanSlackText;
22
+ private sanitizeFileName;
23
+ private getCachedThread;
24
+ private cacheThread;
25
+ private createEmptyThread;
26
+ clearCache(): void;
27
+ invalidateCache(threadId: string): void;
28
+ private persistThread;
29
+ }
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var SlackConversationHistoryProvider_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.SlackConversationHistoryProvider = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const base_conversation_history_provider_1 = require("./base-conversation-history.provider");
16
+ const internal_1 = require("@sowonai/crewx-sdk/internal");
17
+ let SlackConversationHistoryProvider = SlackConversationHistoryProvider_1 = class SlackConversationHistoryProvider extends base_conversation_history_provider_1.BaseConversationHistoryProvider {
18
+ constructor() {
19
+ super(SlackConversationHistoryProvider_1.name);
20
+ this.cache = new Map();
21
+ this.CACHE_TTL = 0;
22
+ this.loggingEnabled = false;
23
+ }
24
+ initialize(client) {
25
+ this.client = client;
26
+ }
27
+ async enableLocalLogging() {
28
+ if (this.loggingEnabled && this.storageInitPromise) {
29
+ return this.storageInitPromise;
30
+ }
31
+ this.storage = new internal_1.ConversationStorageService();
32
+ this.loggingEnabled = true;
33
+ this.storageInitPromise = this.storage.initialize().catch((error) => {
34
+ this.logger.warn(`Failed to initialize Slack conversation logging: ${error.message}`);
35
+ this.loggingEnabled = false;
36
+ });
37
+ return this.storageInitPromise;
38
+ }
39
+ isLocalLoggingEnabled() {
40
+ return this.loggingEnabled;
41
+ }
42
+ async getBotInfo() {
43
+ if (this.botInfo) {
44
+ return this.botInfo;
45
+ }
46
+ if (!this.client) {
47
+ return undefined;
48
+ }
49
+ try {
50
+ const authResult = await this.client.auth.test();
51
+ if (authResult.ok && authResult.user_id && authResult.user) {
52
+ this.botInfo = {
53
+ userId: authResult.user_id,
54
+ username: authResult.user,
55
+ };
56
+ return this.botInfo;
57
+ }
58
+ }
59
+ catch (error) {
60
+ this.logger.error(`Failed to fetch bot info: ${error.message}`);
61
+ }
62
+ return undefined;
63
+ }
64
+ async fetchHistory(threadId, options) {
65
+ const [channel, threadTs] = threadId.split(':');
66
+ if (!channel || !threadTs) {
67
+ throw new Error(`Invalid thread ID format. Expected "channel:thread_ts", got: ${threadId}`);
68
+ }
69
+ const cached = this.getCachedThread(threadId);
70
+ if (cached) {
71
+ await this.persistThread(cached);
72
+ return cached;
73
+ }
74
+ if (!this.client) {
75
+ throw new Error('Slack client not initialized');
76
+ }
77
+ try {
78
+ this.logger.log(`📡 Fetching from Slack API: channel=${channel}, ts=${threadTs}`);
79
+ const botInfo = await this.getBotInfo();
80
+ const result = await this.client.conversations.replies({
81
+ channel,
82
+ ts: threadTs,
83
+ limit: options?.limit || 100,
84
+ include_all_metadata: true,
85
+ });
86
+ if (!result.ok || !result.messages) {
87
+ this.logger.warn('Failed to fetch thread history');
88
+ return this.createEmptyThread(threadId);
89
+ }
90
+ const hasMore = result.has_more || false;
91
+ const userIds = [...new Set(result.messages.filter((msg) => msg.user && !msg.bot_id).map((msg) => msg.user))];
92
+ const userInfoMap = new Map();
93
+ for (const userId of userIds) {
94
+ try {
95
+ const userInfo = await this.client.users.info({ user: userId });
96
+ if (userInfo.ok && userInfo.user) {
97
+ userInfoMap.set(userId, userInfo.user);
98
+ }
99
+ }
100
+ catch (error) {
101
+ this.logger.warn(`Failed to fetch user info for ${userId}: ${error}`);
102
+ }
103
+ }
104
+ const messages = result.messages.map((msg) => {
105
+ const userInfo = msg.user ? userInfoMap.get(msg.user) : undefined;
106
+ const agentId = msg.metadata?.event_payload?.agent_id ||
107
+ msg.bot_profile?.name ||
108
+ msg.username ||
109
+ (msg.bot_id ? 'unknown_bot' : undefined);
110
+ const files = msg.files?.map((file) => {
111
+ const sanitizedFileName = this.sanitizeFileName(file.name);
112
+ const lastDotIndex = sanitizedFileName.lastIndexOf('.');
113
+ const ext = lastDotIndex === -1 ? '' : sanitizedFileName.substring(lastDotIndex);
114
+ const savedFileName = `${file.id}${ext}`;
115
+ const safeThreadDir = threadId.replace(/:/g, '_');
116
+ const fileAttachment = {
117
+ id: file.id,
118
+ name: file.name,
119
+ mimetype: file.mimetype,
120
+ size: file.size,
121
+ localPath: `.crewx/slack-files/${safeThreadDir}/${savedFileName}`,
122
+ url: file.url_private,
123
+ };
124
+ return fileAttachment;
125
+ });
126
+ if (files && files.length > 0) {
127
+ this.logger.log(`📁 Message ${msg.ts} has ${files.length} file(s)`);
128
+ }
129
+ return {
130
+ id: msg.ts,
131
+ userId: msg.bot_id ? 'assistant' : msg.user,
132
+ text: this.sanitizeMessage(this.extractMessageContent(msg)),
133
+ timestamp: new Date(parseFloat(msg.ts) * 1000),
134
+ isAssistant: !!msg.bot_id,
135
+ files,
136
+ metadata: {
137
+ ts: msg.ts,
138
+ thread_ts: msg.thread_ts,
139
+ agent_id: agentId,
140
+ provider: msg.metadata?.event_payload?.provider || agentId,
141
+ slack: {
142
+ user_id: msg.user,
143
+ username: userInfo?.name || msg.username,
144
+ user_profile: userInfo?.profile ? {
145
+ real_name: userInfo.profile.real_name,
146
+ display_name: userInfo.profile.display_name,
147
+ display_name_normalized: userInfo.profile.display_name_normalized,
148
+ image_72: userInfo.profile.image_72,
149
+ team: userInfo.profile.team
150
+ } : (msg.user_profile ? {
151
+ real_name: msg.user_profile.real_name,
152
+ display_name: msg.user_profile.display_name,
153
+ display_name_normalized: msg.user_profile.display_name_normalized,
154
+ image_72: msg.user_profile.image_72,
155
+ team: msg.user_profile.team
156
+ } : undefined),
157
+ bot_id: msg.bot_id,
158
+ bot_profile: msg.bot_profile ? {
159
+ name: msg.bot_profile.name,
160
+ app_id: msg.bot_profile.app_id
161
+ } : undefined,
162
+ bot_user_id: botInfo?.userId,
163
+ bot_username: botInfo?.username,
164
+ }
165
+ },
166
+ };
167
+ });
168
+ const thread = {
169
+ threadId,
170
+ platform: 'slack',
171
+ messages,
172
+ hasMore,
173
+ metadata: {
174
+ channel,
175
+ threadTs,
176
+ },
177
+ };
178
+ this.cacheThread(threadId, thread);
179
+ await this.persistThread(thread);
180
+ this.logger.log(`Retrieved ${messages.length} messages from thread (Slack API)`);
181
+ return thread;
182
+ }
183
+ catch (error) {
184
+ this.logger.error(`Error fetching thread history: ${error.message}`);
185
+ if (error.data?.error === 'missing_scope') {
186
+ this.logger.error('Missing required Slack scope for reading thread history');
187
+ }
188
+ return this.createEmptyThread(threadId);
189
+ }
190
+ }
191
+ async hasHistory(threadId) {
192
+ try {
193
+ const thread = await this.fetchHistory(threadId, { limit: 1 });
194
+ return thread.messages.length > 0;
195
+ }
196
+ catch {
197
+ return false;
198
+ }
199
+ }
200
+ async formatForAI(thread, options) {
201
+ return await super.formatForAI(thread, options);
202
+ }
203
+ extractMessageContent(msg) {
204
+ if (msg.bot_id && msg.blocks && Array.isArray(msg.blocks)) {
205
+ const sections = msg.blocks
206
+ .filter((b) => {
207
+ if (b.type !== 'section' || !b.text?.text) {
208
+ return false;
209
+ }
210
+ if (b.type === 'context' && b.elements) {
211
+ const text = b.elements[0]?.text || '';
212
+ if (text.includes('$ crewx') || text.includes('github.com/sowonlabs/crewx')) {
213
+ return false;
214
+ }
215
+ }
216
+ return true;
217
+ })
218
+ .map((b) => b.text.text);
219
+ if (sections.length > 0) {
220
+ return this.cleanSlackText(sections.join('\n\n'));
221
+ }
222
+ }
223
+ return this.cleanSlackText(msg.text || '');
224
+ }
225
+ cleanSlackText(text) {
226
+ return (text
227
+ .replace(/<@([A-Z0-9]+)>/g, '@user')
228
+ .replace(/<#([A-Z0-9]+)\|([^>]+)>/g, '#$2')
229
+ .replace(/<(https?:\/\/[^|>]+)\|([^>]+)>/g, '$2')
230
+ .replace(/<(https?:\/\/[^>]+)>/g, '$1')
231
+ .trim());
232
+ }
233
+ sanitizeFileName(fileName) {
234
+ let safeName = fileName.replace(/[\/\\]/g, '_');
235
+ safeName = safeName.replace(/\.\./g, '_');
236
+ safeName = safeName.replace(/[\x00-\x1f\x80-\x9f<>:"|?*]/g, '_');
237
+ safeName = safeName.replace(/^\.+|\.+$/g, '');
238
+ safeName = safeName.trim();
239
+ if (!safeName || safeName === '') {
240
+ safeName = 'unnamed_file';
241
+ }
242
+ return safeName;
243
+ }
244
+ getCachedThread(threadId) {
245
+ const cached = this.cache.get(threadId);
246
+ if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {
247
+ return cached.thread;
248
+ }
249
+ return null;
250
+ }
251
+ cacheThread(threadId, thread) {
252
+ this.cache.set(threadId, {
253
+ thread,
254
+ timestamp: Date.now(),
255
+ });
256
+ if (this.cache.size > 100) {
257
+ const firstKey = this.cache.keys().next().value;
258
+ if (firstKey) {
259
+ this.cache.delete(firstKey);
260
+ }
261
+ }
262
+ }
263
+ createEmptyThread(threadId) {
264
+ return {
265
+ threadId,
266
+ platform: 'slack',
267
+ messages: [],
268
+ };
269
+ }
270
+ clearCache() {
271
+ this.cache.clear();
272
+ }
273
+ invalidateCache(threadId) {
274
+ this.cache.delete(threadId);
275
+ }
276
+ async persistThread(thread) {
277
+ if (!this.loggingEnabled || !this.storage) {
278
+ return;
279
+ }
280
+ try {
281
+ const threadCopy = {
282
+ ...thread,
283
+ messages: thread.messages.map(message => ({
284
+ ...message,
285
+ timestamp: message.timestamp instanceof Date
286
+ ? message.timestamp
287
+ : new Date(message.timestamp),
288
+ })),
289
+ };
290
+ await this.storage.saveThread(threadCopy);
291
+ }
292
+ catch (error) {
293
+ this.logger.warn(`Failed to persist Slack conversation log: ${error.message}`);
294
+ }
295
+ }
296
+ };
297
+ exports.SlackConversationHistoryProvider = SlackConversationHistoryProvider;
298
+ exports.SlackConversationHistoryProvider = SlackConversationHistoryProvider = SlackConversationHistoryProvider_1 = __decorate([
299
+ (0, common_1.Injectable)(),
300
+ __metadata("design:paramtypes", [])
301
+ ], SlackConversationHistoryProvider);
302
+ //# sourceMappingURL=slack-conversation-history.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-conversation-history.provider.js","sourceRoot":"","sources":["../../src/conversation/slack-conversation-history.provider.ts"],"names":[],"mappings":"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"}