@multiplayer-app/ai-agent-node 0.1.0-beta.4 → 0.1.0-beta.40
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/dist/cjs/config.cjs +88 -38
- package/dist/cjs/config.cjs.map +1 -1
- package/dist/cjs/config.d.ts +56 -23
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/helpers/AIHelper.cjs +154 -98
- package/dist/cjs/helpers/AIHelper.cjs.map +1 -1
- package/dist/cjs/helpers/AIHelper.d.ts +20 -13
- package/dist/cjs/helpers/AIHelper.d.ts.map +1 -1
- package/dist/cjs/helpers/AIHelper.test.cjs +22 -15
- package/dist/cjs/helpers/AIHelper.test.cjs.map +1 -1
- package/dist/cjs/helpers/ConfigHelper.cjs +15 -7
- package/dist/cjs/helpers/ConfigHelper.cjs.map +1 -1
- package/dist/cjs/helpers/ConfigHelper.d.ts.map +1 -1
- package/dist/cjs/helpers/ContextLimiter.cjs +2 -3
- package/dist/cjs/helpers/ContextLimiter.cjs.map +1 -1
- package/dist/cjs/helpers/FileHelper.cjs +132 -154
- package/dist/cjs/helpers/FileHelper.cjs.map +1 -1
- package/dist/cjs/helpers/FileHelper.d.ts +19 -25
- package/dist/cjs/helpers/FileHelper.d.ts.map +1 -1
- package/dist/cjs/helpers/index.cjs +4 -5
- package/dist/cjs/helpers/index.cjs.map +1 -1
- package/dist/cjs/helpers/index.d.ts +4 -5
- package/dist/cjs/helpers/index.d.ts.map +1 -1
- package/dist/cjs/index.cjs +111 -31
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +39 -13
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/libs/index.cjs +2 -3
- package/dist/cjs/libs/index.cjs.map +1 -1
- package/dist/cjs/libs/index.d.ts +2 -3
- package/dist/cjs/libs/index.d.ts.map +1 -1
- package/dist/cjs/libs/logger/index.cjs +5 -5
- package/dist/cjs/libs/logger/index.cjs.map +1 -1
- package/dist/cjs/libs/logger/index.d.ts +2 -2
- package/dist/cjs/libs/logger/index.d.ts.map +1 -1
- package/dist/cjs/libs/logger/kafkajs-logger-creator.cjs +2 -2
- package/dist/cjs/libs/logger/kafkajs-logger-creator.cjs.map +1 -1
- package/dist/cjs/libs/s3/index.cjs +3 -39
- package/dist/cjs/libs/s3/index.cjs.map +1 -1
- package/dist/cjs/libs/s3/index.d.ts +1 -2
- package/dist/cjs/libs/s3/index.d.ts.map +1 -1
- package/dist/cjs/libs/s3/s3.lib.cjs +174 -191
- package/dist/cjs/libs/s3/s3.lib.cjs.map +1 -1
- package/dist/cjs/libs/s3/s3.lib.d.ts +29 -22
- package/dist/cjs/libs/s3/s3.lib.d.ts.map +1 -1
- package/dist/cjs/processors/ChatProcessor.cjs +138 -162
- package/dist/cjs/processors/ChatProcessor.cjs.map +1 -1
- package/dist/cjs/processors/ChatProcessor.d.ts +36 -10
- package/dist/cjs/processors/ChatProcessor.d.ts.map +1 -1
- package/dist/cjs/processors/ChatProcessor.test.cjs +333 -0
- package/dist/cjs/processors/ChatProcessor.test.cjs.map +1 -0
- package/dist/cjs/processors/ChatProcessor.test.d.ts +2 -0
- package/dist/cjs/processors/ChatProcessor.test.d.ts.map +1 -0
- package/dist/cjs/processors/ModelsProcessor.cjs +2 -2
- package/dist/cjs/processors/ModelsProcessor.cjs.map +1 -1
- package/dist/cjs/processors/index.cjs +2 -2
- package/dist/cjs/processors/index.cjs.map +1 -1
- package/dist/cjs/processors/index.d.ts +2 -2
- package/dist/cjs/processors/index.d.ts.map +1 -1
- package/dist/cjs/services/AIService.cjs +44 -30
- package/dist/cjs/services/AIService.cjs.map +1 -1
- package/dist/cjs/services/AIService.d.ts +13 -4
- package/dist/cjs/services/AIService.d.ts.map +1 -1
- package/dist/cjs/services/InternalEventsHandler.cjs +5 -5
- package/dist/cjs/services/InternalEventsHandler.cjs.map +1 -1
- package/dist/cjs/services/InternalEventsHandler.d.ts +3 -1
- package/dist/cjs/services/InternalEventsHandler.d.ts.map +1 -1
- package/dist/cjs/services/ModelFetcher.cjs +9 -15
- package/dist/cjs/services/ModelFetcher.cjs.map +1 -1
- package/dist/cjs/services/ModelFetcher.d.ts +2 -7
- package/dist/cjs/services/ModelFetcher.d.ts.map +1 -1
- package/dist/cjs/services/RedisService.cjs +35 -32
- package/dist/cjs/services/RedisService.cjs.map +1 -1
- package/dist/cjs/services/RedisService.d.ts +5 -2
- package/dist/cjs/services/RedisService.d.ts.map +1 -1
- package/dist/cjs/services/SocketService.cjs +19 -20
- package/dist/cjs/services/SocketService.cjs.map +1 -1
- package/dist/cjs/services/SocketService.d.ts +9 -6
- package/dist/cjs/services/SocketService.d.ts.map +1 -1
- package/dist/cjs/services/index.cjs +5 -6
- package/dist/cjs/services/index.cjs.map +1 -1
- package/dist/cjs/services/index.d.ts +5 -6
- package/dist/cjs/services/index.d.ts.map +1 -1
- package/dist/cjs/store/AgentStore.cjs +4 -5
- package/dist/cjs/store/AgentStore.cjs.map +1 -1
- package/dist/cjs/store/AgentStore.d.ts +2 -1
- package/dist/cjs/store/AgentStore.d.ts.map +1 -1
- package/dist/cjs/store/ArtifactStore.cjs +2 -4
- package/dist/cjs/store/ArtifactStore.cjs.map +1 -1
- package/dist/cjs/store/ConfigStore.cjs +8 -11
- package/dist/cjs/store/ConfigStore.cjs.map +1 -1
- package/dist/cjs/store/ConfigStore.d.ts.map +1 -1
- package/dist/cjs/store/ConfigStore.test.cjs +2 -2
- package/dist/cjs/store/ConfigStore.test.cjs.map +1 -1
- package/dist/cjs/store/ModelStore.cjs +4 -4
- package/dist/cjs/store/ModelStore.cjs.map +1 -1
- package/dist/cjs/store/ModelStore.test.cjs +17 -17
- package/dist/cjs/store/ModelStore.test.cjs.map +1 -1
- package/dist/cjs/store/index.cjs +4 -4
- package/dist/cjs/store/index.cjs.map +1 -1
- package/dist/cjs/store/index.d.ts +4 -4
- package/dist/cjs/store/index.d.ts.map +1 -1
- package/dist/cjs/tools/proposeFormValuesTool.d.ts +2 -2
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/esm/config.d.ts +56 -23
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +88 -36
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/helpers/AIHelper.d.ts +20 -13
- package/dist/esm/helpers/AIHelper.d.ts.map +1 -1
- package/dist/esm/helpers/AIHelper.js +153 -95
- package/dist/esm/helpers/AIHelper.js.map +1 -1
- package/dist/esm/helpers/AIHelper.test.js +21 -14
- package/dist/esm/helpers/AIHelper.test.js.map +1 -1
- package/dist/esm/helpers/ConfigHelper.d.ts.map +1 -1
- package/dist/esm/helpers/ConfigHelper.js +13 -5
- package/dist/esm/helpers/ConfigHelper.js.map +1 -1
- package/dist/esm/helpers/ContextLimiter.js +2 -3
- package/dist/esm/helpers/ContextLimiter.js.map +1 -1
- package/dist/esm/helpers/FileHelper.d.ts +19 -25
- package/dist/esm/helpers/FileHelper.d.ts.map +1 -1
- package/dist/esm/helpers/FileHelper.js +132 -149
- package/dist/esm/helpers/FileHelper.js.map +1 -1
- package/dist/esm/helpers/index.d.ts +4 -5
- package/dist/esm/helpers/index.d.ts.map +1 -1
- package/dist/esm/helpers/index.js +4 -5
- package/dist/esm/helpers/index.js.map +1 -1
- package/dist/esm/index.d.ts +39 -13
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +79 -12
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/libs/index.d.ts +2 -3
- package/dist/esm/libs/index.d.ts.map +1 -1
- package/dist/esm/libs/index.js +2 -3
- package/dist/esm/libs/index.js.map +1 -1
- package/dist/esm/libs/logger/index.d.ts +2 -2
- package/dist/esm/libs/logger/index.d.ts.map +1 -1
- package/dist/esm/libs/logger/index.js +2 -2
- package/dist/esm/libs/logger/index.js.map +1 -1
- package/dist/esm/libs/logger/kafkajs-logger-creator.js +1 -1
- package/dist/esm/libs/logger/kafkajs-logger-creator.js.map +1 -1
- package/dist/esm/libs/s3/index.d.ts +1 -2
- package/dist/esm/libs/s3/index.d.ts.map +1 -1
- package/dist/esm/libs/s3/index.js +1 -2
- package/dist/esm/libs/s3/index.js.map +1 -1
- package/dist/esm/libs/s3/s3.lib.d.ts +29 -22
- package/dist/esm/libs/s3/s3.lib.d.ts.map +1 -1
- package/dist/esm/libs/s3/s3.lib.js +178 -177
- package/dist/esm/libs/s3/s3.lib.js.map +1 -1
- package/dist/esm/processors/ChatProcessor.d.ts +36 -10
- package/dist/esm/processors/ChatProcessor.d.ts.map +1 -1
- package/dist/esm/processors/ChatProcessor.js +134 -151
- package/dist/esm/processors/ChatProcessor.js.map +1 -1
- package/dist/esm/processors/ChatProcessor.test.d.ts +2 -0
- package/dist/esm/processors/ChatProcessor.test.d.ts.map +1 -0
- package/dist/esm/processors/ChatProcessor.test.js +331 -0
- package/dist/esm/processors/ChatProcessor.test.js.map +1 -0
- package/dist/esm/processors/ModelsProcessor.js +1 -1
- package/dist/esm/processors/ModelsProcessor.js.map +1 -1
- package/dist/esm/processors/index.d.ts +2 -2
- package/dist/esm/processors/index.d.ts.map +1 -1
- package/dist/esm/processors/index.js +2 -2
- package/dist/esm/processors/index.js.map +1 -1
- package/dist/esm/services/AIService.d.ts +13 -4
- package/dist/esm/services/AIService.d.ts.map +1 -1
- package/dist/esm/services/AIService.js +47 -31
- package/dist/esm/services/AIService.js.map +1 -1
- package/dist/esm/services/InternalEventsHandler.d.ts +3 -1
- package/dist/esm/services/InternalEventsHandler.d.ts.map +1 -1
- package/dist/esm/services/InternalEventsHandler.js +10 -8
- package/dist/esm/services/InternalEventsHandler.js.map +1 -1
- package/dist/esm/services/ModelFetcher.d.ts +2 -7
- package/dist/esm/services/ModelFetcher.d.ts.map +1 -1
- package/dist/esm/services/ModelFetcher.js +4 -9
- package/dist/esm/services/ModelFetcher.js.map +1 -1
- package/dist/esm/services/RedisService.d.ts +5 -2
- package/dist/esm/services/RedisService.d.ts.map +1 -1
- package/dist/esm/services/RedisService.js +25 -21
- package/dist/esm/services/RedisService.js.map +1 -1
- package/dist/esm/services/SocketService.d.ts +9 -6
- package/dist/esm/services/SocketService.d.ts.map +1 -1
- package/dist/esm/services/SocketService.js +15 -13
- package/dist/esm/services/SocketService.js.map +1 -1
- package/dist/esm/services/index.d.ts +5 -6
- package/dist/esm/services/index.d.ts.map +1 -1
- package/dist/esm/services/index.js +5 -6
- package/dist/esm/services/index.js.map +1 -1
- package/dist/esm/store/AgentStore.d.ts +2 -1
- package/dist/esm/store/AgentStore.d.ts.map +1 -1
- package/dist/esm/store/AgentStore.js +5 -5
- package/dist/esm/store/AgentStore.js.map +1 -1
- package/dist/esm/store/ArtifactStore.js +3 -7
- package/dist/esm/store/ArtifactStore.js.map +1 -1
- package/dist/esm/store/ConfigStore.d.ts.map +1 -1
- package/dist/esm/store/ConfigStore.js +16 -19
- package/dist/esm/store/ConfigStore.js.map +1 -1
- package/dist/esm/store/ConfigStore.test.js +1 -1
- package/dist/esm/store/ConfigStore.test.js.map +1 -1
- package/dist/esm/store/ModelStore.js +6 -6
- package/dist/esm/store/ModelStore.js.map +1 -1
- package/dist/esm/store/ModelStore.test.js +12 -12
- package/dist/esm/store/ModelStore.test.js.map +1 -1
- package/dist/esm/store/index.d.ts +4 -4
- package/dist/esm/store/index.d.ts.map +1 -1
- package/dist/esm/store/index.js +4 -4
- package/dist/esm/store/index.js.map +1 -1
- package/dist/esm/tools/proposeFormValuesTool.d.ts +2 -2
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +15 -15
- package/dist/cjs/helpers/SetupHelper.cjs +0 -37
- package/dist/cjs/helpers/SetupHelper.cjs.map +0 -1
- package/dist/cjs/helpers/SetupHelper.d.ts +0 -5
- package/dist/cjs/helpers/SetupHelper.d.ts.map +0 -1
- package/dist/cjs/libs/kafka/config.cjs +0 -8
- package/dist/cjs/libs/kafka/config.cjs.map +0 -1
- package/dist/cjs/libs/kafka/config.d.ts +0 -5
- package/dist/cjs/libs/kafka/config.d.ts.map +0 -1
- package/dist/cjs/libs/kafka/consumer.cjs +0 -133
- package/dist/cjs/libs/kafka/consumer.cjs.map +0 -1
- package/dist/cjs/libs/kafka/consumer.d.ts +0 -16
- package/dist/cjs/libs/kafka/consumer.d.ts.map +0 -1
- package/dist/cjs/libs/kafka/index.cjs +0 -19
- package/dist/cjs/libs/kafka/index.cjs.map +0 -1
- package/dist/cjs/libs/kafka/index.d.ts +0 -3
- package/dist/cjs/libs/kafka/index.d.ts.map +0 -1
- package/dist/cjs/libs/kafka/kafka.cjs +0 -27
- package/dist/cjs/libs/kafka/kafka.cjs.map +0 -1
- package/dist/cjs/libs/kafka/kafka.d.ts +0 -3
- package/dist/cjs/libs/kafka/kafka.d.ts.map +0 -1
- package/dist/cjs/libs/kafka/producer.cjs +0 -48
- package/dist/cjs/libs/kafka/producer.cjs.map +0 -1
- package/dist/cjs/libs/kafka/producer.d.ts +0 -11
- package/dist/cjs/libs/kafka/producer.d.ts.map +0 -1
- package/dist/cjs/libs/logger/config.cjs +0 -9
- package/dist/cjs/libs/logger/config.cjs.map +0 -1
- package/dist/cjs/libs/logger/config.d.ts +0 -5
- package/dist/cjs/libs/logger/config.d.ts.map +0 -1
- package/dist/cjs/libs/s3/config.cjs +0 -10
- package/dist/cjs/libs/s3/config.cjs.map +0 -1
- package/dist/cjs/libs/s3/config.d.ts +0 -7
- package/dist/cjs/libs/s3/config.d.ts.map +0 -1
- package/dist/cjs/services/KafkaService.cjs +0 -123
- package/dist/cjs/services/KafkaService.cjs.map +0 -1
- package/dist/cjs/services/KafkaService.d.ts +0 -35
- package/dist/cjs/services/KafkaService.d.ts.map +0 -1
- package/dist/esm/helpers/SetupHelper.d.ts +0 -5
- package/dist/esm/helpers/SetupHelper.d.ts.map +0 -1
- package/dist/esm/helpers/SetupHelper.js +0 -32
- package/dist/esm/helpers/SetupHelper.js.map +0 -1
- package/dist/esm/libs/kafka/config.d.ts +0 -5
- package/dist/esm/libs/kafka/config.d.ts.map +0 -1
- package/dist/esm/libs/kafka/config.js +0 -5
- package/dist/esm/libs/kafka/config.js.map +0 -1
- package/dist/esm/libs/kafka/consumer.d.ts +0 -16
- package/dist/esm/libs/kafka/consumer.d.ts.map +0 -1
- package/dist/esm/libs/kafka/consumer.js +0 -126
- package/dist/esm/libs/kafka/consumer.js.map +0 -1
- package/dist/esm/libs/kafka/index.d.ts +0 -3
- package/dist/esm/libs/kafka/index.d.ts.map +0 -1
- package/dist/esm/libs/kafka/index.js +0 -3
- package/dist/esm/libs/kafka/index.js.map +0 -1
- package/dist/esm/libs/kafka/kafka.d.ts +0 -3
- package/dist/esm/libs/kafka/kafka.d.ts.map +0 -1
- package/dist/esm/libs/kafka/kafka.js +0 -24
- package/dist/esm/libs/kafka/kafka.js.map +0 -1
- package/dist/esm/libs/kafka/producer.d.ts +0 -11
- package/dist/esm/libs/kafka/producer.d.ts.map +0 -1
- package/dist/esm/libs/kafka/producer.js +0 -44
- package/dist/esm/libs/kafka/producer.js.map +0 -1
- package/dist/esm/libs/logger/config.d.ts +0 -5
- package/dist/esm/libs/logger/config.d.ts.map +0 -1
- package/dist/esm/libs/logger/config.js +0 -6
- package/dist/esm/libs/logger/config.js.map +0 -1
- package/dist/esm/libs/s3/config.d.ts +0 -7
- package/dist/esm/libs/s3/config.d.ts.map +0 -1
- package/dist/esm/libs/s3/config.js +0 -7
- package/dist/esm/libs/s3/config.js.map +0 -1
- package/dist/esm/services/KafkaService.d.ts +0 -35
- package/dist/esm/services/KafkaService.d.ts.map +0 -1
- package/dist/esm/services/KafkaService.js +0 -120
- package/dist/esm/services/KafkaService.js.map +0 -1
- package/dist/tsconfig.cjs.tsbuildinfo +0 -1
- package/dist/tsconfig.esm.tsbuildinfo +0 -1
|
@@ -2,56 +2,81 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ChatProcessor = void 0;
|
|
4
4
|
const ai_agent_types_1 = require("@multiplayer-app/ai-agent-types");
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const index_js_4 = require("../store/index.js");
|
|
9
|
-
const index_js_5 = require("../helpers/index.js");
|
|
10
|
-
const config_js_1 = require("../config.js");
|
|
5
|
+
const helpers_1 = require("../helpers/index.cjs");
|
|
6
|
+
const store_1 = require("../store/index.cjs");
|
|
7
|
+
const helpers_2 = require("../helpers/index.cjs");
|
|
11
8
|
const stream_1 = require("stream");
|
|
12
|
-
const
|
|
13
|
-
const index_js_6 = require("../libs/logger/index.js");
|
|
14
|
-
const pipelineAsync = (0, util_1.promisify)(stream_1.pipeline);
|
|
9
|
+
const logger_1 = require("../libs/logger/index.cjs");
|
|
15
10
|
class ChatProcessor {
|
|
16
|
-
constructor(
|
|
17
|
-
this.chatRepository = chatRepository;
|
|
18
|
-
this.messageRepository = messageRepository;
|
|
19
|
-
this.artifactStore = artifactStore;
|
|
11
|
+
constructor(params) {
|
|
12
|
+
this.chatRepository = params.chatRepository;
|
|
13
|
+
this.messageRepository = params.messageRepository;
|
|
14
|
+
this.artifactStore = params.artifactStore;
|
|
15
|
+
this.config = params.config;
|
|
16
|
+
this.socketService = params.socketService;
|
|
17
|
+
this.agentStore = params.agentStore;
|
|
18
|
+
const fileHelper = new helpers_1.FileHelper(params.s3Lib, this.config);
|
|
19
|
+
this.aiHelper = new helpers_1.AIHelper(fileHelper, this.config);
|
|
20
20
|
}
|
|
21
21
|
getTemporaryTitle(contextKey) {
|
|
22
22
|
return `${contextKey} session ${new Date().toISOString()}`;
|
|
23
23
|
}
|
|
24
|
+
isTemporaryTitle(title) {
|
|
25
|
+
// Matches pattern: "{contextKey} session {ISO_DATE_STRING}"
|
|
26
|
+
// Example: "default session 2026-01-23T10:30:45.123Z"
|
|
27
|
+
// toISOString() always includes milliseconds, so we require them
|
|
28
|
+
const pattern = /^.+ session \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
29
|
+
return pattern.test(title);
|
|
30
|
+
}
|
|
24
31
|
async listChats(params) {
|
|
25
|
-
var _a, _b;
|
|
26
32
|
// Build filter object from params
|
|
27
33
|
const filter = {};
|
|
28
|
-
if (params
|
|
34
|
+
if (params?.userId) {
|
|
29
35
|
filter.userId = params.userId;
|
|
30
36
|
}
|
|
31
|
-
if (params
|
|
37
|
+
if (params?.contextKey) {
|
|
32
38
|
filter.contextKey = params.contextKey;
|
|
33
39
|
}
|
|
34
|
-
// Build query options for sort and limit with defaults
|
|
40
|
+
// Build query options for sort and limit with defaults.
|
|
35
41
|
const options = {
|
|
36
42
|
sort: {
|
|
37
|
-
field:
|
|
38
|
-
order:
|
|
43
|
+
field: params?.sortField ?? 'updatedAt',
|
|
44
|
+
order: params?.sortOrder ?? ai_agent_types_1.SortOrder.Desc
|
|
39
45
|
},
|
|
40
|
-
|
|
46
|
+
skip: params?.skip,
|
|
47
|
+
limit: params?.limit
|
|
48
|
+
};
|
|
49
|
+
const [total, data] = await Promise.all([
|
|
50
|
+
this.chatRepository.count(filter),
|
|
51
|
+
this.chatRepository.find(filter, options)
|
|
52
|
+
]);
|
|
53
|
+
return {
|
|
54
|
+
cursor: {
|
|
55
|
+
...(params?.skip != null ? { skip: params.skip } : {}),
|
|
56
|
+
...(params?.limit != null ? { limit: params.limit } : {}),
|
|
57
|
+
total
|
|
58
|
+
},
|
|
59
|
+
data
|
|
41
60
|
};
|
|
42
|
-
// Use aggregation to fetch chats with related messages
|
|
43
|
-
return this.chatRepository.findWithMessages(filter, options);
|
|
44
61
|
}
|
|
45
62
|
async getChat(chatId) {
|
|
46
63
|
const chat = await this.chatRepository.findById(chatId);
|
|
47
64
|
if (!chat) {
|
|
48
65
|
throw new Error('Chat not found');
|
|
49
66
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
67
|
+
return chat;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get messages for a chat with optional cursor pagination.
|
|
71
|
+
* When limit is omitted, returns all messages (backward compatible).
|
|
72
|
+
* Messages are returned in chronological order (oldest → newest).
|
|
73
|
+
*/
|
|
74
|
+
async getMessages(chatId, options) {
|
|
75
|
+
const chat = await this.chatRepository.findById(chatId);
|
|
76
|
+
if (!chat) {
|
|
77
|
+
throw new Error('Chat not found');
|
|
78
|
+
}
|
|
79
|
+
return this.messageRepository.findByChatIdPaginated(chatId, options);
|
|
55
80
|
}
|
|
56
81
|
async deleteChat(chatId) {
|
|
57
82
|
const deleted = await this.chatRepository.delete(chatId);
|
|
@@ -61,8 +86,7 @@ class ChatProcessor {
|
|
|
61
86
|
this.artifactStore.deleteArtifacts(chatId);
|
|
62
87
|
}
|
|
63
88
|
async upsertAndGetChat(payload, excludeSocketId) {
|
|
64
|
-
|
|
65
|
-
const targetUserId = (_a = payload.userId) !== null && _a !== void 0 ? _a : 'guest';
|
|
89
|
+
const targetUserId = payload.userId ?? 'guest';
|
|
66
90
|
let chat = null;
|
|
67
91
|
if (payload.chatId) {
|
|
68
92
|
chat = await this.chatRepository.findById(payload.chatId);
|
|
@@ -94,7 +118,7 @@ class ChatProcessor {
|
|
|
94
118
|
if (!content) {
|
|
95
119
|
return this.getTemporaryTitle(payload.contextKey);
|
|
96
120
|
}
|
|
97
|
-
return
|
|
121
|
+
return this.aiHelper.generateTitleForMessage(payload.contextKey, [{
|
|
98
122
|
role: ai_agent_types_1.MessageRole.User,
|
|
99
123
|
content: content
|
|
100
124
|
}]);
|
|
@@ -105,18 +129,17 @@ class ChatProcessor {
|
|
|
105
129
|
role,
|
|
106
130
|
content: messageData.content,
|
|
107
131
|
agentName: messageData.agentName,
|
|
108
|
-
attachments: attachments
|
|
132
|
+
attachments: attachments ?? [],
|
|
109
133
|
reasoning: "",
|
|
110
134
|
toolCalls: []
|
|
111
135
|
});
|
|
112
136
|
if (chat.userId) {
|
|
113
|
-
|
|
137
|
+
this.socketService.emitMessageUpdate(chat.userId, message, excludeSocketId);
|
|
114
138
|
}
|
|
115
139
|
return message;
|
|
116
140
|
}
|
|
117
141
|
async createChat(payload, excludeSocketId) {
|
|
118
|
-
|
|
119
|
-
const targetUserId = (_a = payload.userId) !== null && _a !== void 0 ? _a : 'guest';
|
|
142
|
+
const targetUserId = payload.userId ?? 'guest';
|
|
120
143
|
const contextKey = 'contextKey' in payload ? payload.contextKey : 'default';
|
|
121
144
|
const metadata = 'metadata' in payload ? payload.metadata : {};
|
|
122
145
|
const chat = await this.chatRepository.create({
|
|
@@ -128,12 +151,7 @@ class ChatProcessor {
|
|
|
128
151
|
metadata,
|
|
129
152
|
...(payload.model ? { model: payload.model } : {})
|
|
130
153
|
});
|
|
131
|
-
|
|
132
|
-
const initialChatResponse = {
|
|
133
|
-
...chat,
|
|
134
|
-
messages: []
|
|
135
|
-
};
|
|
136
|
-
index_js_1.socketService.emitChatUpdate(targetUserId, initialChatResponse, excludeSocketId);
|
|
154
|
+
this.socketService.emitChatUpdate(targetUserId, chat, excludeSocketId);
|
|
137
155
|
return chat;
|
|
138
156
|
}
|
|
139
157
|
/**
|
|
@@ -141,23 +159,22 @@ class ChatProcessor {
|
|
|
141
159
|
* This updates the message containing the tool call and optionally appends a System message.
|
|
142
160
|
*/
|
|
143
161
|
async recordToolCallAction(params) {
|
|
144
|
-
var _a, _b, _c, _d;
|
|
145
162
|
const chat = await this.chatRepository.findById(params.chatId);
|
|
146
163
|
if (!chat) {
|
|
147
164
|
throw new Error('Chat not found');
|
|
148
165
|
}
|
|
149
166
|
const messages = await this.messageRepository.findByChatId(params.chatId);
|
|
150
|
-
const message = messages.find((m) =>
|
|
167
|
+
const message = messages.find((m) => (m.toolCalls ?? []).some((c) => c.id === params.toolCallId));
|
|
151
168
|
if (!message) {
|
|
152
169
|
throw new Error('Tool call not found');
|
|
153
170
|
}
|
|
154
|
-
const toolCalls =
|
|
171
|
+
const toolCalls = message.toolCalls ?? [];
|
|
155
172
|
const target = toolCalls.find((c) => c.id === params.toolCallId);
|
|
156
173
|
if (!target) {
|
|
157
174
|
throw new Error('Tool call not found');
|
|
158
175
|
}
|
|
159
176
|
const now = new Date().toISOString();
|
|
160
|
-
const output = (
|
|
177
|
+
const output = (target.output ?? {});
|
|
161
178
|
const mp = (output['_mp'] && typeof output['_mp'] === 'object' && !Array.isArray(output['_mp']))
|
|
162
179
|
? output['_mp']
|
|
163
180
|
: {};
|
|
@@ -167,14 +184,14 @@ class ChatProcessor {
|
|
|
167
184
|
lastAction: {
|
|
168
185
|
action: params.action,
|
|
169
186
|
at: now,
|
|
170
|
-
data:
|
|
187
|
+
data: params.data ?? {},
|
|
171
188
|
},
|
|
172
189
|
actions: [
|
|
173
190
|
...actions,
|
|
174
191
|
{
|
|
175
192
|
action: params.action,
|
|
176
193
|
at: now,
|
|
177
|
-
data:
|
|
194
|
+
data: params.data ?? {},
|
|
178
195
|
}
|
|
179
196
|
]
|
|
180
197
|
};
|
|
@@ -189,7 +206,7 @@ class ChatProcessor {
|
|
|
189
206
|
await this.messageRepository.update(message.id, { toolCalls });
|
|
190
207
|
// Bump chat updatedAt so listChats ordering reflects the action.
|
|
191
208
|
await this.chatRepository.update(chat.id, { updatedAt: now });
|
|
192
|
-
|
|
209
|
+
this.socketService.emitMessageUpdate(chat.userId, updatedMessage, params.excludeSocketId);
|
|
193
210
|
if (params.systemMessage) {
|
|
194
211
|
//todo discuss support for system messages
|
|
195
212
|
//await this.createMessage(chat, MessageRole.System, params.systemMessage, undefined, params.excludeSocketId);
|
|
@@ -197,26 +214,25 @@ class ChatProcessor {
|
|
|
197
214
|
return { ok: true };
|
|
198
215
|
}
|
|
199
216
|
async streamMessageStep(params) {
|
|
200
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
201
217
|
const { chat, assistantMessage, existingMessages, signal, excludeSocketId, agentOptions } = params;
|
|
202
218
|
if (signal.aborted) {
|
|
203
219
|
return;
|
|
204
220
|
}
|
|
205
|
-
const result = await
|
|
221
|
+
const result = await this.aiHelper.streamAssistantResponse(existingMessages, signal, agentOptions);
|
|
206
222
|
try {
|
|
207
223
|
for await (const chunk of result.fullStream) {
|
|
208
224
|
if (chunk.type === 'error') {
|
|
209
|
-
await
|
|
225
|
+
await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Error, data: chunk.error });
|
|
210
226
|
assistantMessage.content = chunk.error.message || 'Sorry, I cannot process you request due to the error';
|
|
211
227
|
await this.messageRepository.update(assistantMessage.id, assistantMessage);
|
|
212
228
|
await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.Error });
|
|
213
229
|
continue;
|
|
214
230
|
}
|
|
215
231
|
if (chunk.type === 'abort') {
|
|
216
|
-
await
|
|
232
|
+
await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Aborted, data: undefined });
|
|
217
233
|
await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.Aborted });
|
|
218
234
|
await this.messageRepository.update(assistantMessage.id, assistantMessage);
|
|
219
|
-
|
|
235
|
+
this.socketService.emitMessageUpdate(chat.userId, assistantMessage, excludeSocketId);
|
|
220
236
|
continue;
|
|
221
237
|
}
|
|
222
238
|
if (chunk.type === 'finish') {
|
|
@@ -229,41 +245,27 @@ class ChatProcessor {
|
|
|
229
245
|
}
|
|
230
246
|
if (chunk.totalUsage && typeof chunk.totalUsage === 'object') {
|
|
231
247
|
const totalUsage = chunk.totalUsage;
|
|
232
|
-
assistantMessage.tokens =
|
|
248
|
+
assistantMessage.tokens = totalUsage.totalTokens ??
|
|
249
|
+
((totalUsage.promptTokens ?? 0) + (totalUsage.completionTokens ?? 0));
|
|
233
250
|
}
|
|
234
251
|
await this.messageRepository.update(assistantMessage.id, { ...assistantMessage });
|
|
235
252
|
if (chunk.finishReason === 'stop') {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Update, data: assistantMessage });
|
|
242
|
-
await this.streamMessageStep(params);
|
|
243
|
-
continue;
|
|
244
|
-
}
|
|
245
|
-
else {
|
|
246
|
-
await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.Finished });
|
|
253
|
+
await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.Finished });
|
|
254
|
+
if (chat.title && this.isTemporaryTitle(chat.title)) {
|
|
255
|
+
const title = await this.aiHelper.generateTitleForMessage(chat.contextKey, existingMessages);
|
|
256
|
+
await this.chatRepository.update(chat.id, { title });
|
|
257
|
+
this.socketService.emitChatUpdate(chat.userId, { ...chat, title });
|
|
247
258
|
}
|
|
248
|
-
await index_js_4.agentStore.shareAgentProcessEvent(chat.id, { type: index_js_4.AgentProcessEventType.Finished, data: assistantMessage });
|
|
249
|
-
continue;
|
|
250
259
|
}
|
|
251
260
|
if (chunk.finishReason === 'tool-calls') {
|
|
252
|
-
if (
|
|
261
|
+
if (assistantMessage.toolCalls?.some(toolCall => toolCall.requiresConfirmation && toolCall.approvalId && !toolCall.output)) {
|
|
253
262
|
await this.chatRepository.update(chat.id, { status: ai_agent_types_1.AgentStatus.WaitingForUserAction });
|
|
254
|
-
await
|
|
255
|
-
|
|
256
|
-
else {
|
|
257
|
-
await index_js_4.agentStore.shareAgentProcessEvent(chat.id, {
|
|
258
|
-
type: index_js_4.AgentProcessEventType.Update,
|
|
259
|
-
data: assistantMessage
|
|
260
|
-
});
|
|
261
|
-
await this.streamMessageStep(params);
|
|
263
|
+
await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Finished, data: assistantMessage });
|
|
264
|
+
continue;
|
|
262
265
|
}
|
|
263
|
-
continue;
|
|
264
266
|
}
|
|
265
267
|
//todo: Handle other finish reasons // length, content, error, other, undefined
|
|
266
|
-
await
|
|
268
|
+
await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Finished, data: assistantMessage });
|
|
267
269
|
continue;
|
|
268
270
|
}
|
|
269
271
|
if (chunk.type === 'text-delta') {
|
|
@@ -272,8 +274,8 @@ class ChatProcessor {
|
|
|
272
274
|
...assistantMessage,
|
|
273
275
|
content: assistantMessage.content
|
|
274
276
|
};
|
|
275
|
-
|
|
276
|
-
await
|
|
277
|
+
this.socketService.emitMessageUpdate(chat.userId, updatedMessage, excludeSocketId);
|
|
278
|
+
await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Update, data: updatedMessage });
|
|
277
279
|
await this.messageRepository.update(assistantMessage.id, { content: assistantMessage.content });
|
|
278
280
|
continue;
|
|
279
281
|
}
|
|
@@ -288,8 +290,8 @@ class ChatProcessor {
|
|
|
288
290
|
});
|
|
289
291
|
continue;
|
|
290
292
|
}
|
|
291
|
-
if (chunk.type === 'tool-call') {
|
|
292
|
-
const toolCall =
|
|
293
|
+
if (chunk.type === 'tool-call') {
|
|
294
|
+
const toolCall = assistantMessage.toolCalls?.find(toolCall => toolCall.id === chunk.toolCallId);
|
|
293
295
|
if (toolCall) {
|
|
294
296
|
toolCall.status = ai_agent_types_1.AgentToolCallStatus.Running;
|
|
295
297
|
toolCall.input = chunk.input;
|
|
@@ -297,15 +299,15 @@ class ChatProcessor {
|
|
|
297
299
|
continue;
|
|
298
300
|
}
|
|
299
301
|
if (chunk.type === 'tool-error') {
|
|
300
|
-
const toolCall =
|
|
302
|
+
const toolCall = assistantMessage.toolCalls?.find(toolCall => toolCall.id === chunk.toolCallId);
|
|
301
303
|
if (toolCall) {
|
|
302
304
|
toolCall.status = ai_agent_types_1.AgentToolCallStatus.Failed;
|
|
303
|
-
toolCall.error = JSON.stringify(chunk.error);
|
|
305
|
+
toolCall.error = chunk.error.message || JSON.stringify(chunk.error);
|
|
304
306
|
}
|
|
305
307
|
continue;
|
|
306
308
|
}
|
|
307
309
|
if (chunk.type === 'tool-approval-request') {
|
|
308
|
-
const toolCall =
|
|
310
|
+
const toolCall = assistantMessage.toolCalls?.find(toolCall => toolCall.id === chunk.toolCall.toolCallId);
|
|
309
311
|
if (toolCall) {
|
|
310
312
|
toolCall.requiresConfirmation = true;
|
|
311
313
|
toolCall.approvalId = chunk.approvalId;
|
|
@@ -313,7 +315,7 @@ class ChatProcessor {
|
|
|
313
315
|
continue;
|
|
314
316
|
}
|
|
315
317
|
if (chunk.type === 'tool-result') {
|
|
316
|
-
const toolCall =
|
|
318
|
+
const toolCall = assistantMessage.toolCalls?.find(toolCall => toolCall.id === chunk.toolCallId);
|
|
317
319
|
if (toolCall) {
|
|
318
320
|
if (chunk.output.requiresApproval) {
|
|
319
321
|
toolCall.requiresConfirmation = true;
|
|
@@ -328,9 +330,9 @@ class ChatProcessor {
|
|
|
328
330
|
if (!assistantMessage.reasoning)
|
|
329
331
|
assistantMessage.reasoning = '';
|
|
330
332
|
assistantMessage.reasoning += chunk.text;
|
|
331
|
-
|
|
333
|
+
this.socketService.emitMessageUpdate(chat.userId, assistantMessage, excludeSocketId);
|
|
332
334
|
await this.messageRepository.update(assistantMessage.id, { reasoning: assistantMessage.reasoning });
|
|
333
|
-
await
|
|
335
|
+
await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Update, data: assistantMessage });
|
|
334
336
|
continue;
|
|
335
337
|
}
|
|
336
338
|
}
|
|
@@ -339,7 +341,7 @@ class ChatProcessor {
|
|
|
339
341
|
if (streamError instanceof Error && streamError.name === 'AbortError') {
|
|
340
342
|
return;
|
|
341
343
|
}
|
|
342
|
-
await
|
|
344
|
+
await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Error, data: streamError });
|
|
343
345
|
throw streamError;
|
|
344
346
|
}
|
|
345
347
|
}
|
|
@@ -347,16 +349,15 @@ class ChatProcessor {
|
|
|
347
349
|
return 'approvalId' in payload;
|
|
348
350
|
}
|
|
349
351
|
async processApprovalPayload(chat, payload) {
|
|
350
|
-
var _a, _b, _c;
|
|
351
352
|
const assistantMessage = await this.messageRepository.findById(payload.messageId);
|
|
352
353
|
if (!assistantMessage || assistantMessage.chat !== chat.id) {
|
|
353
354
|
throw new Error(`Assistant message with id ${payload.messageId} not found`);
|
|
354
355
|
}
|
|
355
|
-
const agentOptions = await
|
|
356
|
+
const agentOptions = await this.aiHelper.getAgentOptions({
|
|
356
357
|
agentName: assistantMessage.agentName,
|
|
357
358
|
context: payload.context
|
|
358
359
|
});
|
|
359
|
-
const toolCall =
|
|
360
|
+
const toolCall = assistantMessage.toolCalls?.find(tc => tc.approvalId === payload.approvalId);
|
|
360
361
|
if (!toolCall) {
|
|
361
362
|
// continue, tool is not found
|
|
362
363
|
return {
|
|
@@ -374,14 +375,14 @@ class ChatProcessor {
|
|
|
374
375
|
toolCall.status = ai_agent_types_1.AgentToolCallStatus.Failed;
|
|
375
376
|
}
|
|
376
377
|
else {
|
|
377
|
-
const executeFunction =
|
|
378
|
+
const executeFunction = agentOptions.tools?.[toolCall.name]?.execute;
|
|
378
379
|
if (executeFunction) {
|
|
379
380
|
try {
|
|
380
381
|
toolCall.output = await executeFunction(toolCall.input, { toolCallId: toolCall.id, messages: [] });
|
|
381
382
|
toolCall.status = ai_agent_types_1.AgentToolCallStatus.Succeeded;
|
|
382
383
|
}
|
|
383
384
|
catch (error) {
|
|
384
|
-
|
|
385
|
+
logger_1.logger.error(error);
|
|
385
386
|
toolCall.status = ai_agent_types_1.AgentToolCallStatus.Failed;
|
|
386
387
|
toolCall.output = {
|
|
387
388
|
type: 'execution-denied',
|
|
@@ -405,15 +406,15 @@ class ChatProcessor {
|
|
|
405
406
|
}
|
|
406
407
|
async processNewUserMessage(chat, payload, prevMessages, excludeSocketId) {
|
|
407
408
|
const userMessage = await this.createMessage(chat, ai_agent_types_1.MessageRole.User, { content: payload.content, agentName: undefined }, payload.attachments);
|
|
408
|
-
await
|
|
409
|
-
const agentOptions = await
|
|
409
|
+
await this.agentStore.shareAgentProcessEvent(chat.id, { type: store_1.AgentProcessEventType.Update, data: userMessage });
|
|
410
|
+
const agentOptions = await this.aiHelper.getAgentOptions({
|
|
410
411
|
contextKey: chat.contextKey,
|
|
411
|
-
messages:
|
|
412
|
+
messages: [...prevMessages, userMessage],
|
|
412
413
|
context: payload.context,
|
|
413
414
|
agentName: undefined,
|
|
414
415
|
modelId: chat.model,
|
|
415
416
|
});
|
|
416
|
-
const assistantMessage = await this.createMessage(chat, ai_agent_types_1.MessageRole.Assistant, { content: '
|
|
417
|
+
const assistantMessage = await this.createMessage(chat, ai_agent_types_1.MessageRole.Assistant, { content: '', agentName: agentOptions.name }, undefined, excludeSocketId);
|
|
417
418
|
assistantMessage.content = '';
|
|
418
419
|
return {
|
|
419
420
|
userMessage,
|
|
@@ -423,14 +424,14 @@ class ChatProcessor {
|
|
|
423
424
|
}
|
|
424
425
|
async streamMessage(chat, payload, excludeSocketId, onAgentStart) {
|
|
425
426
|
try {
|
|
426
|
-
const abortController =
|
|
427
|
-
onAgentStart
|
|
427
|
+
const abortController = this.agentStore.registerAgentProcess(chat.id);
|
|
428
|
+
onAgentStart?.();
|
|
428
429
|
let assistantMessage;
|
|
429
430
|
let agentOptions;
|
|
430
431
|
const existingMessages = await this.messageRepository.findByChatId(chat.id);
|
|
431
432
|
// Limit context to prevent exceeding token limits
|
|
432
|
-
const limitedMessages =
|
|
433
|
-
maxMessages:
|
|
433
|
+
const limitedMessages = helpers_2.ContextLimiter.limitContext(existingMessages, {
|
|
434
|
+
maxMessages: this.config.ai.maxContextMessages,
|
|
434
435
|
keepFirstUserMessage: true,
|
|
435
436
|
keepSystemMessages: true,
|
|
436
437
|
});
|
|
@@ -470,32 +471,32 @@ class ChatProcessor {
|
|
|
470
471
|
}
|
|
471
472
|
eventToChunk(event) {
|
|
472
473
|
switch (event.type) {
|
|
473
|
-
case
|
|
474
|
+
case store_1.AgentProcessEventType.Update:
|
|
474
475
|
return {
|
|
475
476
|
type: ai_agent_types_1.StreamChunkType.Message,
|
|
476
477
|
message: event.data
|
|
477
478
|
};
|
|
478
|
-
case
|
|
479
|
+
case store_1.AgentProcessEventType.Error:
|
|
479
480
|
return {
|
|
480
481
|
type: ai_agent_types_1.StreamChunkType.Error,
|
|
481
482
|
error: event.data.message || 'Unknown error occurred'
|
|
482
483
|
};
|
|
483
|
-
case
|
|
484
|
+
case store_1.AgentProcessEventType.Finished:
|
|
484
485
|
return {
|
|
485
486
|
type: ai_agent_types_1.StreamChunkType.Message,
|
|
486
487
|
message: event.data
|
|
487
488
|
};
|
|
488
|
-
case
|
|
489
|
+
case store_1.AgentProcessEventType.Aborted:
|
|
489
490
|
// Aborted events don't produce chunks, they just signal stream end
|
|
490
491
|
return null;
|
|
491
|
-
case
|
|
492
|
+
case store_1.AgentProcessEventType.Stop:
|
|
492
493
|
// Stop events don't produce chunks
|
|
493
494
|
return null;
|
|
494
495
|
default:
|
|
495
496
|
return null;
|
|
496
497
|
}
|
|
497
498
|
}
|
|
498
|
-
getMessageStream(chatId) {
|
|
499
|
+
getMessageStream(chatId, signal) {
|
|
499
500
|
const stream = new stream_1.PassThrough();
|
|
500
501
|
let ended = false;
|
|
501
502
|
const endStream = (error) => {
|
|
@@ -503,7 +504,7 @@ class ChatProcessor {
|
|
|
503
504
|
return;
|
|
504
505
|
ended = true;
|
|
505
506
|
if (error) {
|
|
506
|
-
|
|
507
|
+
logger_1.logger.error({ error }, 'Message stream error');
|
|
507
508
|
}
|
|
508
509
|
if (!stream.destroyed && !stream.writableEnded) {
|
|
509
510
|
try {
|
|
@@ -511,28 +512,29 @@ class ChatProcessor {
|
|
|
511
512
|
stream.end();
|
|
512
513
|
}
|
|
513
514
|
catch (e) {
|
|
514
|
-
|
|
515
|
+
logger_1.logger.error({ e }, 'Failed to end SSE stream');
|
|
515
516
|
}
|
|
516
517
|
}
|
|
517
518
|
};
|
|
518
519
|
const pushChunk = (chunk) => {
|
|
519
|
-
if (ended || stream.destroyed || stream.writableEnded)
|
|
520
|
+
if (ended || stream.destroyed || stream.writableEnded || signal?.aborted)
|
|
520
521
|
return;
|
|
521
522
|
stream.write(`data: ${JSON.stringify(chunk)}\n\n`);
|
|
522
523
|
};
|
|
523
524
|
const listener = (event) => {
|
|
524
|
-
if (
|
|
525
|
+
if (signal?.aborted) {
|
|
526
|
+
endStream();
|
|
525
527
|
return;
|
|
528
|
+
}
|
|
526
529
|
try {
|
|
527
530
|
const chunk = this.eventToChunk(event);
|
|
528
531
|
if (chunk) {
|
|
529
532
|
pushChunk(chunk);
|
|
530
533
|
}
|
|
531
|
-
if (event.type ===
|
|
532
|
-
event.type ===
|
|
533
|
-
event.type ===
|
|
534
|
+
if (event.type === store_1.AgentProcessEventType.Finished ||
|
|
535
|
+
event.type === store_1.AgentProcessEventType.Error ||
|
|
536
|
+
event.type === store_1.AgentProcessEventType.Aborted) {
|
|
534
537
|
endStream();
|
|
535
|
-
index_js_4.agentStore.removeListener(chatId, listener);
|
|
536
538
|
}
|
|
537
539
|
}
|
|
538
540
|
catch (err) {
|
|
@@ -541,21 +543,18 @@ class ChatProcessor {
|
|
|
541
543
|
error: err instanceof Error ? err.message : 'Unknown error occurred',
|
|
542
544
|
});
|
|
543
545
|
endStream(err);
|
|
544
|
-
index_js_4.agentStore.removeListener(chatId, listener);
|
|
545
546
|
}
|
|
546
547
|
};
|
|
547
|
-
// Cleanup on consumer side closing
|
|
548
548
|
const closeHandler = () => {
|
|
549
|
-
|
|
549
|
+
this.agentStore.removeListener(chatId, listener);
|
|
550
550
|
};
|
|
551
551
|
const errorHandler = (err) => {
|
|
552
|
-
|
|
553
|
-
index_js_4.agentStore.removeListener(chatId, listener);
|
|
552
|
+
signal?.removeEventListener('abort', endStream);
|
|
554
553
|
endStream(err);
|
|
555
554
|
};
|
|
556
555
|
stream.on('close', closeHandler);
|
|
557
556
|
stream.on('error', errorHandler);
|
|
558
|
-
const listenerAttached =
|
|
557
|
+
const listenerAttached = this.agentStore.addListener(chatId, listener);
|
|
559
558
|
if (!listenerAttached) {
|
|
560
559
|
// Remove stream listeners if listener attachment failed to prevent memory leak
|
|
561
560
|
stream.removeListener('close', closeHandler);
|
|
@@ -564,51 +563,28 @@ class ChatProcessor {
|
|
|
564
563
|
}
|
|
565
564
|
return stream;
|
|
566
565
|
}
|
|
567
|
-
async createMessageStream(payload, excludeSocketId) {
|
|
566
|
+
async createMessageStream(payload, excludeSocketId, signal) {
|
|
568
567
|
const stream = new stream_1.PassThrough();
|
|
569
|
-
(
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
// Send chat metadata first
|
|
573
|
-
if (!('chatId' in payload) && !('messageId' in payload) && chat) {
|
|
574
|
-
stream.write(`data: ${JSON.stringify({
|
|
575
|
-
type: ai_agent_types_1.StreamChunkType.Chat,
|
|
576
|
-
chatId: chat.id,
|
|
577
|
-
chat,
|
|
578
|
-
})}\n\n`);
|
|
579
|
-
}
|
|
580
|
-
await this.streamMessage(chat, payload, excludeSocketId, async () => {
|
|
581
|
-
if (stream.destroyed || stream.writableEnded) {
|
|
582
|
-
return;
|
|
583
|
-
}
|
|
584
|
-
const messageStream = this.getMessageStream(chat.id);
|
|
585
|
-
// If client disconnects, destroy inner stream
|
|
586
|
-
stream.on('close', () => {
|
|
587
|
-
if (!messageStream.destroyed) {
|
|
588
|
-
messageStream.destroy();
|
|
589
|
-
}
|
|
590
|
-
});
|
|
591
|
-
await pipelineAsync(messageStream, stream);
|
|
592
|
-
});
|
|
593
|
-
}
|
|
594
|
-
catch (error) {
|
|
595
|
-
index_js_6.logger.error({ error }, 'createMessageStream failed');
|
|
596
|
-
if (!stream.destroyed && !stream.writableEnded) {
|
|
597
|
-
stream.write(`data: ${JSON.stringify({
|
|
598
|
-
type: ai_agent_types_1.StreamChunkType.Error,
|
|
599
|
-
error: error instanceof Error ? error.message : 'Unknown error occurred',
|
|
600
|
-
})}\n\n`);
|
|
601
|
-
stream.write('data: [DONE]\n\n');
|
|
602
|
-
stream.end();
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
})().catch((err) => {
|
|
606
|
-
index_js_6.logger.error({ err }, 'Unhandled stream task error');
|
|
607
|
-
if (!stream.destroyed)
|
|
608
|
-
stream.destroy(err);
|
|
568
|
+
this.runMessageStream(stream, payload, excludeSocketId, signal)
|
|
569
|
+
.catch(err => {
|
|
570
|
+
logger_1.logger.error({ err }, 'Stream task failed');
|
|
609
571
|
});
|
|
610
572
|
return stream;
|
|
611
573
|
}
|
|
574
|
+
async runMessageStream(stream, payload, excludeSocketId, signal) {
|
|
575
|
+
const chat = await this.upsertAndGetChat(payload, excludeSocketId);
|
|
576
|
+
if (!('chatId' in payload) && !('messageId' in payload) && chat) {
|
|
577
|
+
stream.write(`data: ${JSON.stringify({
|
|
578
|
+
type: ai_agent_types_1.StreamChunkType.Chat,
|
|
579
|
+
chatId: chat.id,
|
|
580
|
+
chat,
|
|
581
|
+
})}\n\n`);
|
|
582
|
+
}
|
|
583
|
+
await this.streamMessage(chat, payload, excludeSocketId, () => {
|
|
584
|
+
const messageStream = this.getMessageStream(chat.id, signal);
|
|
585
|
+
messageStream.pipe(stream);
|
|
586
|
+
});
|
|
587
|
+
}
|
|
612
588
|
}
|
|
613
589
|
exports.ChatProcessor = ChatProcessor;
|
|
614
590
|
//# sourceMappingURL=ChatProcessor.js.map
|