crewx 0.3.0 → 0.4.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/crewx.js +6 -0
- package/package.json +9 -107
- package/LICENSE +0 -201
- package/README.md +0 -234
- package/crewx.yaml +0 -2069
- package/dist/agent.types.d.ts +0 -117
- package/dist/agent.types.js +0 -16
- package/dist/agent.types.js.map +0 -1
- package/dist/ai-provider.service.d.ts +0 -36
- package/dist/ai-provider.service.js +0 -191
- package/dist/ai-provider.service.js.map +0 -1
- package/dist/ai.service.d.ts +0 -57
- package/dist/ai.service.js +0 -629
- package/dist/ai.service.js.map +0 -1
- package/dist/app.module.d.ts +0 -5
- package/dist/app.module.js +0 -103
- package/dist/app.module.js.map +0 -1
- package/dist/cli/agent.handler.d.ts +0 -2
- package/dist/cli/agent.handler.js +0 -140
- package/dist/cli/agent.handler.js.map +0 -1
- package/dist/cli/chat.handler.d.ts +0 -19
- package/dist/cli/chat.handler.js +0 -431
- package/dist/cli/chat.handler.js.map +0 -1
- package/dist/cli/cli.handler.d.ts +0 -4
- package/dist/cli/cli.handler.js +0 -97
- package/dist/cli/cli.handler.js.map +0 -1
- package/dist/cli/doctor.handler.d.ts +0 -36
- package/dist/cli/doctor.handler.js +0 -382
- package/dist/cli/doctor.handler.js.map +0 -1
- package/dist/cli/execute.handler.d.ts +0 -2
- package/dist/cli/execute.handler.js +0 -319
- package/dist/cli/execute.handler.js.map +0 -1
- package/dist/cli/help.handler.d.ts +0 -2
- package/dist/cli/help.handler.js +0 -10
- package/dist/cli/help.handler.js.map +0 -1
- package/dist/cli/init.handler.d.ts +0 -26
- package/dist/cli/init.handler.js +0 -450
- package/dist/cli/init.handler.js.map +0 -1
- package/dist/cli/mcp.handler.d.ts +0 -3
- package/dist/cli/mcp.handler.js +0 -121
- package/dist/cli/mcp.handler.js.map +0 -1
- package/dist/cli/query.handler.d.ts +0 -2
- package/dist/cli/query.handler.js +0 -380
- package/dist/cli/query.handler.js.map +0 -1
- package/dist/cli/templates.handler.d.ts +0 -2
- package/dist/cli/templates.handler.js +0 -100
- package/dist/cli/templates.handler.js.map +0 -1
- package/dist/cli-options.d.ts +0 -29
- package/dist/cli-options.js +0 -234
- package/dist/cli-options.js.map +0 -1
- package/dist/config/timeout.config.d.ts +0 -14
- package/dist/config/timeout.config.js +0 -34
- package/dist/config/timeout.config.js.map +0 -1
- package/dist/constants.d.ts +0 -4
- package/dist/constants.js +0 -8
- package/dist/constants.js.map +0 -1
- package/dist/conversation/base-conversation-history.provider.d.ts +0 -12
- package/dist/conversation/base-conversation-history.provider.js +0 -45
- package/dist/conversation/base-conversation-history.provider.js.map +0 -1
- package/dist/conversation/cli-conversation-history.provider.d.ts +0 -16
- package/dist/conversation/cli-conversation-history.provider.js +0 -111
- package/dist/conversation/cli-conversation-history.provider.js.map +0 -1
- package/dist/conversation/conversation-config.d.ts +0 -9
- package/dist/conversation/conversation-config.js +0 -25
- package/dist/conversation/conversation-config.js.map +0 -1
- package/dist/conversation/conversation-history.interface.d.ts +0 -25
- package/dist/conversation/conversation-history.interface.js +0 -3
- package/dist/conversation/conversation-history.interface.js.map +0 -1
- package/dist/conversation/conversation-provider.factory.d.ts +0 -10
- package/dist/conversation/conversation-provider.factory.js +0 -50
- package/dist/conversation/conversation-provider.factory.js.map +0 -1
- package/dist/conversation/conversation-storage.service.d.ts +0 -16
- package/dist/conversation/conversation-storage.service.js +0 -220
- package/dist/conversation/conversation-storage.service.js.map +0 -1
- package/dist/conversation/index.d.ts +0 -7
- package/dist/conversation/index.js +0 -24
- package/dist/conversation/index.js.map +0 -1
- package/dist/conversation/slack-conversation-history.provider.d.ts +0 -28
- package/dist/conversation/slack-conversation-history.provider.js +0 -278
- package/dist/conversation/slack-conversation-history.provider.js.map +0 -1
- package/dist/crewx.tool.d.ts +0 -332
- package/dist/crewx.tool.js +0 -1463
- package/dist/crewx.tool.js.map +0 -1
- package/dist/guards/bearer-auth.guard.d.ts +0 -7
- package/dist/guards/bearer-auth.guard.js +0 -44
- package/dist/guards/bearer-auth.guard.js.map +0 -1
- package/dist/health.controller.d.ts +0 -6
- package/dist/health.controller.js +0 -32
- package/dist/health.controller.js.map +0 -1
- package/dist/knowledge/DocumentManager.d.ts +0 -4
- package/dist/knowledge/DocumentManager.js +0 -119
- package/dist/knowledge/DocumentManager.js.map +0 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -268
- package/dist/main.js.map +0 -1
- package/dist/mcp.controller.d.ts +0 -8
- package/dist/mcp.controller.js +0 -62
- package/dist/mcp.controller.js.map +0 -1
- package/dist/project.service.d.ts +0 -44
- package/dist/project.service.js +0 -299
- package/dist/project.service.js.map +0 -1
- package/dist/providers/ai-provider.interface.d.ts +0 -50
- package/dist/providers/ai-provider.interface.js +0 -23
- package/dist/providers/ai-provider.interface.js.map +0 -1
- package/dist/providers/base-ai.provider.d.ts +0 -50
- package/dist/providers/base-ai.provider.js +0 -624
- package/dist/providers/base-ai.provider.js.map +0 -1
- package/dist/providers/claude.provider.d.ts +0 -25
- package/dist/providers/claude.provider.js +0 -362
- package/dist/providers/claude.provider.js.map +0 -1
- package/dist/providers/codex.provider.d.ts +0 -17
- package/dist/providers/codex.provider.js +0 -99
- package/dist/providers/codex.provider.js.map +0 -1
- package/dist/providers/copilot.provider.d.ts +0 -25
- package/dist/providers/copilot.provider.js +0 -266
- package/dist/providers/copilot.provider.js.map +0 -1
- package/dist/providers/dynamic-provider.factory.d.ts +0 -55
- package/dist/providers/dynamic-provider.factory.js +0 -587
- package/dist/providers/dynamic-provider.factory.js.map +0 -1
- package/dist/providers/gemini.provider.d.ts +0 -22
- package/dist/providers/gemini.provider.js +0 -147
- package/dist/providers/gemini.provider.js.map +0 -1
- package/dist/services/agent-loader.service.d.ts +0 -29
- package/dist/services/agent-loader.service.js +0 -370
- package/dist/services/agent-loader.service.js.map +0 -1
- package/dist/services/auth.service.d.ts +0 -9
- package/dist/services/auth.service.js +0 -47
- package/dist/services/auth.service.js.map +0 -1
- package/dist/services/config-validator.service.d.ts +0 -28
- package/dist/services/config-validator.service.js +0 -467
- package/dist/services/config-validator.service.js.map +0 -1
- package/dist/services/config.service.d.ts +0 -45
- package/dist/services/config.service.js +0 -180
- package/dist/services/config.service.js.map +0 -1
- package/dist/services/context-enhancement.service.d.ts +0 -13
- package/dist/services/context-enhancement.service.js +0 -169
- package/dist/services/context-enhancement.service.js.map +0 -1
- package/dist/services/document-loader.service.d.ts +0 -16
- package/dist/services/document-loader.service.js +0 -137
- package/dist/services/document-loader.service.js.map +0 -1
- package/dist/services/help.service.d.ts +0 -5
- package/dist/services/help.service.js +0 -117
- package/dist/services/help.service.js.map +0 -1
- package/dist/services/intelligent-compression.service.d.ts +0 -20
- package/dist/services/intelligent-compression.service.js +0 -179
- package/dist/services/intelligent-compression.service.js.map +0 -1
- package/dist/services/mcp-client.service.d.ts +0 -26
- package/dist/services/mcp-client.service.js +0 -81
- package/dist/services/mcp-client.service.js.map +0 -1
- package/dist/services/parallel-processing.service.d.ts +0 -108
- package/dist/services/parallel-processing.service.js +0 -268
- package/dist/services/parallel-processing.service.js.map +0 -1
- package/dist/services/remote-agent.service.d.ts +0 -49
- package/dist/services/remote-agent.service.js +0 -215
- package/dist/services/remote-agent.service.js.map +0 -1
- package/dist/services/result-formatter.service.d.ts +0 -27
- package/dist/services/result-formatter.service.js +0 -126
- package/dist/services/result-formatter.service.js.map +0 -1
- package/dist/services/task-management.service.d.ts +0 -63
- package/dist/services/task-management.service.js +0 -272
- package/dist/services/task-management.service.js.map +0 -1
- package/dist/services/template.service.d.ts +0 -36
- package/dist/services/template.service.js +0 -195
- package/dist/services/template.service.js.map +0 -1
- package/dist/services/tool-call.service.d.ts +0 -53
- package/dist/services/tool-call.service.js +0 -1061
- package/dist/services/tool-call.service.js.map +0 -1
- package/dist/slack/formatters/message.formatter.d.ts +0 -25
- package/dist/slack/formatters/message.formatter.js +0 -246
- package/dist/slack/formatters/message.formatter.js.map +0 -1
- package/dist/slack/slack-bot.d.ts +0 -24
- package/dist/slack/slack-bot.js +0 -467
- package/dist/slack/slack-bot.js.map +0 -1
- package/dist/stderr.logger.d.ts +0 -8
- package/dist/stderr.logger.js +0 -26
- package/dist/stderr.logger.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/utils/config-utils.d.ts +0 -15
- package/dist/utils/config-utils.js +0 -69
- package/dist/utils/config-utils.js.map +0 -1
- package/dist/utils/error-utils.d.ts +0 -3
- package/dist/utils/error-utils.js +0 -27
- package/dist/utils/error-utils.js.map +0 -1
- package/dist/utils/math-utils.d.ts +0 -3
- package/dist/utils/math-utils.js +0 -10
- package/dist/utils/math-utils.js.map +0 -1
- package/dist/utils/mcp-installer.d.ts +0 -20
- package/dist/utils/mcp-installer.js +0 -199
- package/dist/utils/mcp-installer.js.map +0 -1
- package/dist/utils/mention-parser.d.ts +0 -18
- package/dist/utils/mention-parser.js +0 -136
- package/dist/utils/mention-parser.js.map +0 -1
- package/dist/utils/simple-security.d.ts +0 -3
- package/dist/utils/simple-security.js +0 -20
- package/dist/utils/simple-security.js.map +0 -1
- package/dist/utils/stdin-utils.d.ts +0 -27
- package/dist/utils/stdin-utils.js +0 -130
- package/dist/utils/stdin-utils.js.map +0 -1
- package/dist/utils/string-utils.d.ts +0 -1
- package/dist/utils/string-utils.js +0 -10
- package/dist/utils/string-utils.js.map +0 -1
- package/dist/utils/template-processor.d.ts +0 -32
- package/dist/utils/template-processor.js +0 -202
- package/dist/utils/template-processor.js.map +0 -1
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -17
- package/dist/version.js.map +0 -1
- package/docs/CLA.md +0 -88
- package/docs/agent-configuration.md +0 -364
- package/docs/agent-registry-strategy.md +0 -348
- package/docs/branding-decision-crewx.md +0 -395
- package/docs/claude-code-docker-guide.md +0 -264
- package/docs/cli-guide.md +0 -439
- package/docs/development.md +0 -595
- package/docs/diagram1.svg +0 -1
- package/docs/guides/agent-best-practices.md +0 -97
- package/docs/guides/bug-management.md +0 -600
- package/docs/guides/git-bug-reference.md +0 -366
- package/docs/mcp-integration.md +0 -187
- package/docs/process/development-workflow.md +0 -84
- package/docs/remote-agents.md +0 -555
- package/docs/roadmap.md +0 -528
- package/docs/rules/branch-protection.md +0 -40
- package/docs/standards/rc-versioning.md +0 -60
- package/docs/standards/report-structure.md +0 -67
- package/docs/template-variables.md +0 -382
- package/docs/templates.md +0 -517
- package/docs/tools.md +0 -583
- package/docs/troubleshooting.md +0 -611
- package/templates/agents/default.yaml +0 -938
- package/templates/agents/minimal.yaml +0 -25
- package/templates/documents/crewcode-manual.md +0 -292
- package/templates/versions.json +0 -19
|
@@ -1,50 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ConversationThread, ConversationMessage } from './conversation-history.interface';
|
|
2
|
-
export declare class ConversationStorageService {
|
|
3
|
-
private readonly logger;
|
|
4
|
-
private readonly storageDir;
|
|
5
|
-
constructor();
|
|
6
|
-
initialize(): Promise<void>;
|
|
7
|
-
saveThread(thread: ConversationThread): Promise<void>;
|
|
8
|
-
loadThread(threadId: string): Promise<ConversationThread | null>;
|
|
9
|
-
addMessage(threadId: string, message: ConversationMessage, platform?: 'slack' | 'cli'): Promise<ConversationThread>;
|
|
10
|
-
listThreads(): Promise<string[]>;
|
|
11
|
-
deleteThread(threadId: string): Promise<void>;
|
|
12
|
-
hasThread(threadId: string): Promise<boolean>;
|
|
13
|
-
private getThreadPath;
|
|
14
|
-
private getCandidatePaths;
|
|
15
|
-
cleanupOldThreads(daysToKeep?: number): Promise<number>;
|
|
16
|
-
}
|
|
@@ -1,220 +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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
-
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;
|
|
22
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
-
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
-
};
|
|
44
|
-
var ConversationStorageService_1;
|
|
45
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
exports.ConversationStorageService = void 0;
|
|
47
|
-
const common_1 = require("@nestjs/common");
|
|
48
|
-
const fs_1 = require("fs");
|
|
49
|
-
const path = __importStar(require("path"));
|
|
50
|
-
let ConversationStorageService = ConversationStorageService_1 = class ConversationStorageService {
|
|
51
|
-
constructor() {
|
|
52
|
-
this.logger = new common_1.Logger(ConversationStorageService_1.name);
|
|
53
|
-
this.storageDir = path.join(process.cwd(), '.crewx', 'conversations');
|
|
54
|
-
}
|
|
55
|
-
async initialize() {
|
|
56
|
-
try {
|
|
57
|
-
await fs_1.promises.mkdir(this.storageDir, { recursive: true });
|
|
58
|
-
this.logger.debug(`Storage directory initialized: ${this.storageDir}`);
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
this.logger.error(`Failed to initialize storage: ${error.message}`);
|
|
62
|
-
throw error;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
async saveThread(thread) {
|
|
66
|
-
await this.initialize();
|
|
67
|
-
const filePath = this.getThreadPath(thread.threadId, thread.platform);
|
|
68
|
-
const data = JSON.stringify(thread, null, 2);
|
|
69
|
-
try {
|
|
70
|
-
await fs_1.promises.writeFile(filePath, data, 'utf-8');
|
|
71
|
-
this.logger.debug(`Thread saved: ${thread.threadId}`);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
this.logger.error(`Failed to save thread: ${error.message}`);
|
|
75
|
-
throw error;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
async loadThread(threadId) {
|
|
79
|
-
const candidatePaths = this.getCandidatePaths(threadId);
|
|
80
|
-
for (const filePath of candidatePaths) {
|
|
81
|
-
try {
|
|
82
|
-
const data = await fs_1.promises.readFile(filePath, 'utf-8');
|
|
83
|
-
const thread = JSON.parse(data);
|
|
84
|
-
thread.messages = thread.messages.map(msg => ({
|
|
85
|
-
...msg,
|
|
86
|
-
timestamp: new Date(msg.timestamp),
|
|
87
|
-
}));
|
|
88
|
-
return thread;
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
if (error.code !== 'ENOENT') {
|
|
92
|
-
this.logger.error(`Failed to load thread: ${error.message}`);
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
async addMessage(threadId, message, platform = 'cli') {
|
|
100
|
-
let thread = await this.loadThread(threadId);
|
|
101
|
-
if (!thread) {
|
|
102
|
-
thread = {
|
|
103
|
-
threadId,
|
|
104
|
-
platform,
|
|
105
|
-
messages: [],
|
|
106
|
-
metadata: {
|
|
107
|
-
createdAt: new Date().toISOString(),
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
thread.messages.push(message);
|
|
112
|
-
thread.metadata = {
|
|
113
|
-
...thread.metadata,
|
|
114
|
-
updatedAt: new Date().toISOString(),
|
|
115
|
-
messageCount: thread.messages.length,
|
|
116
|
-
};
|
|
117
|
-
await this.saveThread(thread);
|
|
118
|
-
return thread;
|
|
119
|
-
}
|
|
120
|
-
async listThreads() {
|
|
121
|
-
try {
|
|
122
|
-
await this.initialize();
|
|
123
|
-
const files = await fs_1.promises.readdir(this.storageDir);
|
|
124
|
-
const threadIds = [];
|
|
125
|
-
for (const file of files) {
|
|
126
|
-
if (!file.endsWith('.json')) {
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
const filePath = path.join(this.storageDir, file);
|
|
130
|
-
try {
|
|
131
|
-
const data = await fs_1.promises.readFile(filePath, 'utf-8');
|
|
132
|
-
const thread = JSON.parse(data);
|
|
133
|
-
if (thread.threadId) {
|
|
134
|
-
threadIds.push(thread.threadId);
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
threadIds.push(file.replace('.json', ''));
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
this.logger.warn(`Failed to read thread file ${file}: ${error.message}`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return threadIds;
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
this.logger.error(`Failed to list threads: ${error.message}`);
|
|
148
|
-
return [];
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
async deleteThread(threadId) {
|
|
152
|
-
const candidatePaths = this.getCandidatePaths(threadId);
|
|
153
|
-
for (const filePath of candidatePaths) {
|
|
154
|
-
try {
|
|
155
|
-
await fs_1.promises.unlink(filePath);
|
|
156
|
-
this.logger.debug(`Thread deleted: ${threadId}`);
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
catch (error) {
|
|
160
|
-
if (error.code === 'ENOENT') {
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
this.logger.error(`Failed to delete thread: ${error.message}`);
|
|
164
|
-
throw error;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
async hasThread(threadId) {
|
|
169
|
-
const candidatePaths = this.getCandidatePaths(threadId);
|
|
170
|
-
for (const filePath of candidatePaths) {
|
|
171
|
-
try {
|
|
172
|
-
await fs_1.promises.access(filePath);
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
175
|
-
catch (error) {
|
|
176
|
-
if (error.code !== 'ENOENT') {
|
|
177
|
-
this.logger.error(`Failed to check thread: ${error.message}`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
getThreadPath(threadId, platform) {
|
|
184
|
-
const safeId = threadId.replace(/[^a-zA-Z0-9-_]/g, '_');
|
|
185
|
-
const resolvedPlatform = platform ?? (threadId.includes(':') ? 'slack' : undefined);
|
|
186
|
-
const prefix = resolvedPlatform === 'slack' ? 'slack-' : '';
|
|
187
|
-
return path.join(this.storageDir, `${prefix}${safeId}.json`);
|
|
188
|
-
}
|
|
189
|
-
getCandidatePaths(threadId) {
|
|
190
|
-
const candidates = new Set();
|
|
191
|
-
candidates.add(this.getThreadPath(threadId));
|
|
192
|
-
candidates.add(this.getThreadPath(threadId, 'slack'));
|
|
193
|
-
candidates.add(this.getThreadPath(threadId, 'cli'));
|
|
194
|
-
return Array.from(candidates);
|
|
195
|
-
}
|
|
196
|
-
async cleanupOldThreads(daysToKeep = 30) {
|
|
197
|
-
const threads = await this.listThreads();
|
|
198
|
-
const cutoffDate = new Date();
|
|
199
|
-
cutoffDate.setDate(cutoffDate.getDate() - daysToKeep);
|
|
200
|
-
let deletedCount = 0;
|
|
201
|
-
for (const threadId of threads) {
|
|
202
|
-
const thread = await this.loadThread(threadId);
|
|
203
|
-
if (!thread)
|
|
204
|
-
continue;
|
|
205
|
-
const lastMessage = thread.messages[thread.messages.length - 1];
|
|
206
|
-
if (lastMessage && lastMessage.timestamp < cutoffDate) {
|
|
207
|
-
await this.deleteThread(threadId);
|
|
208
|
-
deletedCount++;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
this.logger.log(`Cleaned up ${deletedCount} old threads`);
|
|
212
|
-
return deletedCount;
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
exports.ConversationStorageService = ConversationStorageService;
|
|
216
|
-
exports.ConversationStorageService = ConversationStorageService = ConversationStorageService_1 = __decorate([
|
|
217
|
-
(0, common_1.Injectable)(),
|
|
218
|
-
__metadata("design:paramtypes", [])
|
|
219
|
-
], ConversationStorageService);
|
|
220
|
-
//# sourceMappingURL=conversation-storage.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-storage.service.js","sourceRoot":"","sources":["../../src/conversation/conversation-storage.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export * from './conversation-history.interface';
|
|
2
|
-
export * from './base-conversation-history.provider';
|
|
3
|
-
export * from './slack-conversation-history.provider';
|
|
4
|
-
export * from './cli-conversation-history.provider';
|
|
5
|
-
export * from './conversation-storage.service';
|
|
6
|
-
export * from './conversation-provider.factory';
|
|
7
|
-
export * from './conversation-config';
|
|
@@ -1,24 +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 __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
|
-
__exportStar(require("./conversation-history.interface"), exports);
|
|
18
|
-
__exportStar(require("./base-conversation-history.provider"), exports);
|
|
19
|
-
__exportStar(require("./slack-conversation-history.provider"), exports);
|
|
20
|
-
__exportStar(require("./cli-conversation-history.provider"), exports);
|
|
21
|
-
__exportStar(require("./conversation-storage.service"), exports);
|
|
22
|
-
__exportStar(require("./conversation-provider.factory"), exports);
|
|
23
|
-
__exportStar(require("./conversation-config"), exports);
|
|
24
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mEAAiD;AACjD,uEAAqD;AACrD,wEAAsD;AACtD,sEAAoD;AACpD,iEAA+C;AAC/C,kEAAgD;AAChD,wDAAsC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { WebClient } from '@slack/web-api';
|
|
2
|
-
import { BaseConversationHistoryProvider } from './base-conversation-history.provider';
|
|
3
|
-
import { ConversationThread, FetchHistoryOptions } from './conversation-history.interface';
|
|
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 getCachedThread;
|
|
23
|
-
private cacheThread;
|
|
24
|
-
private createEmptyThread;
|
|
25
|
-
clearCache(): void;
|
|
26
|
-
invalidateCache(threadId: string): void;
|
|
27
|
-
private persistThread;
|
|
28
|
-
}
|
|
@@ -1,278 +0,0 @@
|
|
|
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 conversation_storage_service_1 = require("./conversation-storage.service");
|
|
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 conversation_storage_service_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
|
-
this.logger.debug(`✅ Fetched bot info: ${this.botInfo.username} (${this.botInfo.userId})`);
|
|
57
|
-
return this.botInfo;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
this.logger.error(`Failed to fetch bot info: ${error.message}`);
|
|
62
|
-
}
|
|
63
|
-
return undefined;
|
|
64
|
-
}
|
|
65
|
-
async fetchHistory(threadId, options) {
|
|
66
|
-
const [channel, threadTs] = threadId.split(':');
|
|
67
|
-
if (!channel || !threadTs) {
|
|
68
|
-
throw new Error(`Invalid thread ID format. Expected "channel:thread_ts", got: ${threadId}`);
|
|
69
|
-
}
|
|
70
|
-
const cached = this.getCachedThread(threadId);
|
|
71
|
-
if (cached) {
|
|
72
|
-
this.logger.debug(`Using cached thread history for ${threadId}`);
|
|
73
|
-
await this.persistThread(cached);
|
|
74
|
-
return cached;
|
|
75
|
-
}
|
|
76
|
-
if (!this.client) {
|
|
77
|
-
throw new Error('Slack client not initialized');
|
|
78
|
-
}
|
|
79
|
-
try {
|
|
80
|
-
this.logger.log(`📡 Fetching from Slack API: channel=${channel}, ts=${threadTs}`);
|
|
81
|
-
const botInfo = await this.getBotInfo();
|
|
82
|
-
const result = await this.client.conversations.replies({
|
|
83
|
-
channel,
|
|
84
|
-
ts: threadTs,
|
|
85
|
-
limit: options?.limit || 100,
|
|
86
|
-
include_all_metadata: true,
|
|
87
|
-
});
|
|
88
|
-
if (!result.ok || !result.messages) {
|
|
89
|
-
this.logger.warn('Failed to fetch thread history');
|
|
90
|
-
return this.createEmptyThread(threadId);
|
|
91
|
-
}
|
|
92
|
-
const hasMore = result.has_more || false;
|
|
93
|
-
const userIds = [...new Set(result.messages.filter((msg) => msg.user && !msg.bot_id).map((msg) => msg.user))];
|
|
94
|
-
const userInfoMap = new Map();
|
|
95
|
-
for (const userId of userIds) {
|
|
96
|
-
try {
|
|
97
|
-
const userInfo = await this.client.users.info({ user: userId });
|
|
98
|
-
if (userInfo.ok && userInfo.user) {
|
|
99
|
-
userInfoMap.set(userId, userInfo.user);
|
|
100
|
-
this.logger.debug(`✅ Fetched user info for ${userId}: ${userInfo.user.profile?.display_name || userInfo.user.name}`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
this.logger.warn(`Failed to fetch user info for ${userId}: ${error}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const messages = result.messages.map((msg) => {
|
|
108
|
-
const userInfo = msg.user ? userInfoMap.get(msg.user) : undefined;
|
|
109
|
-
if (!msg.bot_id && msg.user) {
|
|
110
|
-
this.logger.debug(`User message data: user=${msg.user}, has userInfo=${!!userInfo}, display_name=${userInfo?.profile?.display_name || 'N/A'}`);
|
|
111
|
-
}
|
|
112
|
-
const agentId = msg.metadata?.event_payload?.agent_id ||
|
|
113
|
-
msg.bot_profile?.name ||
|
|
114
|
-
msg.username ||
|
|
115
|
-
(msg.bot_id ? 'unknown_bot' : undefined);
|
|
116
|
-
return {
|
|
117
|
-
id: msg.ts,
|
|
118
|
-
userId: msg.bot_id ? 'assistant' : msg.user,
|
|
119
|
-
text: this.sanitizeMessage(this.extractMessageContent(msg)),
|
|
120
|
-
timestamp: new Date(parseFloat(msg.ts) * 1000),
|
|
121
|
-
isAssistant: !!msg.bot_id,
|
|
122
|
-
metadata: {
|
|
123
|
-
ts: msg.ts,
|
|
124
|
-
thread_ts: msg.thread_ts,
|
|
125
|
-
agent_id: agentId,
|
|
126
|
-
provider: msg.metadata?.event_payload?.provider || agentId,
|
|
127
|
-
slack: {
|
|
128
|
-
user_id: msg.user,
|
|
129
|
-
username: userInfo?.name || msg.username,
|
|
130
|
-
user_profile: userInfo?.profile ? {
|
|
131
|
-
real_name: userInfo.profile.real_name,
|
|
132
|
-
display_name: userInfo.profile.display_name,
|
|
133
|
-
display_name_normalized: userInfo.profile.display_name_normalized,
|
|
134
|
-
image_72: userInfo.profile.image_72,
|
|
135
|
-
team: userInfo.profile.team
|
|
136
|
-
} : (msg.user_profile ? {
|
|
137
|
-
real_name: msg.user_profile.real_name,
|
|
138
|
-
display_name: msg.user_profile.display_name,
|
|
139
|
-
display_name_normalized: msg.user_profile.display_name_normalized,
|
|
140
|
-
image_72: msg.user_profile.image_72,
|
|
141
|
-
team: msg.user_profile.team
|
|
142
|
-
} : undefined),
|
|
143
|
-
bot_id: msg.bot_id,
|
|
144
|
-
bot_profile: msg.bot_profile ? {
|
|
145
|
-
name: msg.bot_profile.name,
|
|
146
|
-
app_id: msg.bot_profile.app_id
|
|
147
|
-
} : undefined,
|
|
148
|
-
bot_user_id: botInfo?.userId,
|
|
149
|
-
bot_username: botInfo?.username,
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
};
|
|
153
|
-
});
|
|
154
|
-
const thread = {
|
|
155
|
-
threadId,
|
|
156
|
-
platform: 'slack',
|
|
157
|
-
messages,
|
|
158
|
-
hasMore,
|
|
159
|
-
metadata: {
|
|
160
|
-
channel,
|
|
161
|
-
threadTs,
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
this.cacheThread(threadId, thread);
|
|
165
|
-
await this.persistThread(thread);
|
|
166
|
-
this.logger.log(`Retrieved ${messages.length} messages from thread (Slack API)`);
|
|
167
|
-
return thread;
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
this.logger.error(`Error fetching thread history: ${error.message}`);
|
|
171
|
-
if (error.data?.error === 'missing_scope') {
|
|
172
|
-
this.logger.error('Missing required Slack scope for reading thread history');
|
|
173
|
-
}
|
|
174
|
-
return this.createEmptyThread(threadId);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
async hasHistory(threadId) {
|
|
178
|
-
try {
|
|
179
|
-
const thread = await this.fetchHistory(threadId, { limit: 1 });
|
|
180
|
-
return thread.messages.length > 0;
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
async formatForAI(thread, options) {
|
|
187
|
-
return await super.formatForAI(thread, options);
|
|
188
|
-
}
|
|
189
|
-
extractMessageContent(msg) {
|
|
190
|
-
if (msg.bot_id && msg.blocks && Array.isArray(msg.blocks)) {
|
|
191
|
-
const sections = msg.blocks
|
|
192
|
-
.filter((b) => {
|
|
193
|
-
if (b.type !== 'section' || !b.text?.text) {
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
196
|
-
if (b.type === 'context' && b.elements) {
|
|
197
|
-
const text = b.elements[0]?.text || '';
|
|
198
|
-
if (text.includes('$ crewx') || text.includes('github.com/sowonlabs/crewx')) {
|
|
199
|
-
return false;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return true;
|
|
203
|
-
})
|
|
204
|
-
.map((b) => b.text.text);
|
|
205
|
-
if (sections.length > 0) {
|
|
206
|
-
return this.cleanSlackText(sections.join('\n\n'));
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
return this.cleanSlackText(msg.text || '');
|
|
210
|
-
}
|
|
211
|
-
cleanSlackText(text) {
|
|
212
|
-
return (text
|
|
213
|
-
.replace(/<@([A-Z0-9]+)>/g, '@user')
|
|
214
|
-
.replace(/<#([A-Z0-9]+)\|([^>]+)>/g, '#$2')
|
|
215
|
-
.replace(/<(https?:\/\/[^|>]+)\|([^>]+)>/g, '$2')
|
|
216
|
-
.replace(/<(https?:\/\/[^>]+)>/g, '$1')
|
|
217
|
-
.trim());
|
|
218
|
-
}
|
|
219
|
-
getCachedThread(threadId) {
|
|
220
|
-
const cached = this.cache.get(threadId);
|
|
221
|
-
if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {
|
|
222
|
-
return cached.thread;
|
|
223
|
-
}
|
|
224
|
-
return null;
|
|
225
|
-
}
|
|
226
|
-
cacheThread(threadId, thread) {
|
|
227
|
-
this.cache.set(threadId, {
|
|
228
|
-
thread,
|
|
229
|
-
timestamp: Date.now(),
|
|
230
|
-
});
|
|
231
|
-
if (this.cache.size > 100) {
|
|
232
|
-
const firstKey = this.cache.keys().next().value;
|
|
233
|
-
if (firstKey) {
|
|
234
|
-
this.cache.delete(firstKey);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
createEmptyThread(threadId) {
|
|
239
|
-
return {
|
|
240
|
-
threadId,
|
|
241
|
-
platform: 'slack',
|
|
242
|
-
messages: [],
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
clearCache() {
|
|
246
|
-
this.cache.clear();
|
|
247
|
-
}
|
|
248
|
-
invalidateCache(threadId) {
|
|
249
|
-
this.cache.delete(threadId);
|
|
250
|
-
this.logger.debug(`🗑️ Cache invalidated for thread: ${threadId}`);
|
|
251
|
-
}
|
|
252
|
-
async persistThread(thread) {
|
|
253
|
-
if (!this.loggingEnabled || !this.storage) {
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
try {
|
|
257
|
-
const threadCopy = {
|
|
258
|
-
...thread,
|
|
259
|
-
messages: thread.messages.map(message => ({
|
|
260
|
-
...message,
|
|
261
|
-
timestamp: message.timestamp instanceof Date
|
|
262
|
-
? message.timestamp
|
|
263
|
-
: new Date(message.timestamp),
|
|
264
|
-
})),
|
|
265
|
-
};
|
|
266
|
-
await this.storage.saveThread(threadCopy);
|
|
267
|
-
}
|
|
268
|
-
catch (error) {
|
|
269
|
-
this.logger.warn(`Failed to persist Slack conversation log: ${error.message}`);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
exports.SlackConversationHistoryProvider = SlackConversationHistoryProvider;
|
|
274
|
-
exports.SlackConversationHistoryProvider = SlackConversationHistoryProvider = SlackConversationHistoryProvider_1 = __decorate([
|
|
275
|
-
(0, common_1.Injectable)(),
|
|
276
|
-
__metadata("design:paramtypes", [])
|
|
277
|
-
], SlackConversationHistoryProvider);
|
|
278
|
-
//# sourceMappingURL=slack-conversation-history.provider.js.map
|