@multiplayer-app/ai-agent-node 0.0.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/.env.example +45 -0
- package/README.md +611 -0
- package/config.example.json +73 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/helpers/AIHelper.d.ts +23 -0
- package/dist/helpers/AIHelper.d.ts.map +1 -0
- package/dist/helpers/AIHelper.js +326 -0
- package/dist/helpers/AIHelper.js.map +1 -0
- package/dist/helpers/AIHelper.test.d.ts +2 -0
- package/dist/helpers/AIHelper.test.d.ts.map +1 -0
- package/dist/helpers/AIHelper.test.js +332 -0
- package/dist/helpers/AIHelper.test.js.map +1 -0
- package/dist/helpers/ConfigHelper.d.ts +20 -0
- package/dist/helpers/ConfigHelper.d.ts.map +1 -0
- package/dist/helpers/ConfigHelper.js +118 -0
- package/dist/helpers/ConfigHelper.js.map +1 -0
- package/dist/helpers/ContextLimiter.d.ts +82 -0
- package/dist/helpers/ContextLimiter.d.ts.map +1 -0
- package/dist/helpers/ContextLimiter.js +165 -0
- package/dist/helpers/ContextLimiter.js.map +1 -0
- package/dist/helpers/FileHelper.d.ts +31 -0
- package/dist/helpers/FileHelper.d.ts.map +1 -0
- package/dist/helpers/FileHelper.js +175 -0
- package/dist/helpers/FileHelper.js.map +1 -0
- package/dist/helpers/SetupHelper.d.ts +5 -0
- package/dist/helpers/SetupHelper.d.ts.map +1 -0
- package/dist/helpers/SetupHelper.js +32 -0
- package/dist/helpers/SetupHelper.js.map +1 -0
- package/dist/helpers/index.d.ts +6 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +6 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/libs/index.d.ts +4 -0
- package/dist/libs/index.d.ts.map +1 -0
- package/dist/libs/index.js +4 -0
- package/dist/libs/index.js.map +1 -0
- package/dist/libs/kafka/config.d.ts +5 -0
- package/dist/libs/kafka/config.d.ts.map +1 -0
- package/dist/libs/kafka/config.js +5 -0
- package/dist/libs/kafka/config.js.map +1 -0
- package/dist/libs/kafka/consumer.d.ts +16 -0
- package/dist/libs/kafka/consumer.d.ts.map +1 -0
- package/dist/libs/kafka/consumer.js +126 -0
- package/dist/libs/kafka/consumer.js.map +1 -0
- package/dist/libs/kafka/index.d.ts +3 -0
- package/dist/libs/kafka/index.d.ts.map +1 -0
- package/dist/libs/kafka/index.js +3 -0
- package/dist/libs/kafka/index.js.map +1 -0
- package/dist/libs/kafka/kafka.d.ts +3 -0
- package/dist/libs/kafka/kafka.d.ts.map +1 -0
- package/dist/libs/kafka/kafka.js +24 -0
- package/dist/libs/kafka/kafka.js.map +1 -0
- package/dist/libs/kafka/producer.d.ts +11 -0
- package/dist/libs/kafka/producer.d.ts.map +1 -0
- package/dist/libs/kafka/producer.js +44 -0
- package/dist/libs/kafka/producer.js.map +1 -0
- package/dist/libs/logger/config.d.ts +5 -0
- package/dist/libs/logger/config.d.ts.map +1 -0
- package/dist/libs/logger/config.js +6 -0
- package/dist/libs/logger/config.js.map +1 -0
- package/dist/libs/logger/index.d.ts +10 -0
- package/dist/libs/logger/index.d.ts.map +1 -0
- package/dist/libs/logger/index.js +20 -0
- package/dist/libs/logger/index.js.map +1 -0
- package/dist/libs/logger/kafkajs-logger-creator.d.ts +12 -0
- package/dist/libs/logger/kafkajs-logger-creator.d.ts.map +1 -0
- package/dist/libs/logger/kafkajs-logger-creator.js +29 -0
- package/dist/libs/logger/kafkajs-logger-creator.js.map +1 -0
- package/dist/libs/logger/logger.d.ts +42 -0
- package/dist/libs/logger/logger.d.ts.map +1 -0
- package/dist/libs/logger/logger.js +44 -0
- package/dist/libs/logger/logger.js.map +1 -0
- package/dist/libs/s3/config.d.ts +7 -0
- package/dist/libs/s3/config.d.ts.map +1 -0
- package/dist/libs/s3/config.js +7 -0
- package/dist/libs/s3/config.js.map +1 -0
- package/dist/libs/s3/index.d.ts +4 -0
- package/dist/libs/s3/index.d.ts.map +1 -0
- package/dist/libs/s3/index.js +4 -0
- package/dist/libs/s3/index.js.map +1 -0
- package/dist/libs/s3/s3.lib.d.ts +25 -0
- package/dist/libs/s3/s3.lib.d.ts.map +1 -0
- package/dist/libs/s3/s3.lib.js +202 -0
- package/dist/libs/s3/s3.lib.js.map +1 -0
- package/dist/processors/ChatProcessor.d.ts +66 -0
- package/dist/processors/ChatProcessor.d.ts.map +1 -0
- package/dist/processors/ChatProcessor.js +610 -0
- package/dist/processors/ChatProcessor.js.map +1 -0
- package/dist/processors/ModelsProcessor.d.ts +11 -0
- package/dist/processors/ModelsProcessor.d.ts.map +1 -0
- package/dist/processors/ModelsProcessor.js +30 -0
- package/dist/processors/ModelsProcessor.js.map +1 -0
- package/dist/processors/index.d.ts +3 -0
- package/dist/processors/index.d.ts.map +1 -0
- package/dist/processors/index.js +3 -0
- package/dist/processors/index.js.map +1 -0
- package/dist/services/AIService.d.ts +48 -0
- package/dist/services/AIService.d.ts.map +1 -0
- package/dist/services/AIService.js +196 -0
- package/dist/services/AIService.js.map +1 -0
- package/dist/services/InternalEventsHandler.d.ts +21 -0
- package/dist/services/InternalEventsHandler.d.ts.map +1 -0
- package/dist/services/InternalEventsHandler.js +56 -0
- package/dist/services/InternalEventsHandler.js.map +1 -0
- package/dist/services/KafkaService.d.ts +35 -0
- package/dist/services/KafkaService.d.ts.map +1 -0
- package/dist/services/KafkaService.js +120 -0
- package/dist/services/KafkaService.js.map +1 -0
- package/dist/services/ModelFetcher.d.ts +54 -0
- package/dist/services/ModelFetcher.d.ts.map +1 -0
- package/dist/services/ModelFetcher.js +247 -0
- package/dist/services/ModelFetcher.js.map +1 -0
- package/dist/services/RedisService.d.ts +90 -0
- package/dist/services/RedisService.d.ts.map +1 -0
- package/dist/services/RedisService.js +236 -0
- package/dist/services/RedisService.js.map +1 -0
- package/dist/services/SocketService.d.ts +39 -0
- package/dist/services/SocketService.d.ts.map +1 -0
- package/dist/services/SocketService.js +128 -0
- package/dist/services/SocketService.js.map +1 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +7 -0
- package/dist/services/index.js.map +1 -0
- package/dist/store/AgentStore.d.ts +48 -0
- package/dist/store/AgentStore.d.ts.map +1 -0
- package/dist/store/AgentStore.js +98 -0
- package/dist/store/AgentStore.js.map +1 -0
- package/dist/store/ArtifactStore.d.ts +13 -0
- package/dist/store/ArtifactStore.d.ts.map +1 -0
- package/dist/store/ArtifactStore.js +27 -0
- package/dist/store/ArtifactStore.js.map +1 -0
- package/dist/store/ConfigStore.d.ts +89 -0
- package/dist/store/ConfigStore.d.ts.map +1 -0
- package/dist/store/ConfigStore.js +214 -0
- package/dist/store/ConfigStore.js.map +1 -0
- package/dist/store/ConfigStore.test.d.ts +2 -0
- package/dist/store/ConfigStore.test.d.ts.map +1 -0
- package/dist/store/ConfigStore.test.js +259 -0
- package/dist/store/ConfigStore.test.js.map +1 -0
- package/dist/store/ModelStore.d.ts +44 -0
- package/dist/store/ModelStore.d.ts.map +1 -0
- package/dist/store/ModelStore.js +81 -0
- package/dist/store/ModelStore.js.map +1 -0
- package/dist/store/ModelStore.test.d.ts +2 -0
- package/dist/store/ModelStore.test.d.ts.map +1 -0
- package/dist/store/ModelStore.test.js +390 -0
- package/dist/store/ModelStore.test.js.map +1 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +5 -0
- package/dist/store/index.js.map +1 -0
- package/dist/tools/generateChartTool.d.ts +24 -0
- package/dist/tools/generateChartTool.d.ts.map +1 -0
- package/dist/tools/generateChartTool.js +124 -0
- package/dist/tools/generateChartTool.js.map +1 -0
- package/dist/tools/proposeFormValuesTool.d.ts +35 -0
- package/dist/tools/proposeFormValuesTool.d.ts.map +1 -0
- package/dist/tools/proposeFormValuesTool.js +56 -0
- package/dist/tools/proposeFormValuesTool.js.map +1 -0
- package/package.json +71 -0
- package/src/config.ts +46 -0
- package/src/helpers/AIHelper.test.ts +375 -0
- package/src/helpers/AIHelper.ts +353 -0
- package/src/helpers/ConfigHelper.ts +130 -0
- package/src/helpers/ContextLimiter.ts +228 -0
- package/src/helpers/FileHelper.ts +197 -0
- package/src/helpers/SetupHelper.ts +35 -0
- package/src/helpers/index.ts +5 -0
- package/src/index.ts +18 -0
- package/src/libs/index.ts +3 -0
- package/src/libs/kafka/config.ts +4 -0
- package/src/libs/kafka/consumer.ts +161 -0
- package/src/libs/kafka/index.ts +2 -0
- package/src/libs/kafka/kafka.ts +27 -0
- package/src/libs/kafka/producer.ts +48 -0
- package/src/libs/logger/config.ts +4 -0
- package/src/libs/logger/index.ts +21 -0
- package/src/libs/logger/kafkajs-logger-creator.ts +28 -0
- package/src/libs/logger/logger.ts +60 -0
- package/src/libs/s3/config.ts +7 -0
- package/src/libs/s3/index.ts +3 -0
- package/src/libs/s3/s3.lib.ts +284 -0
- package/src/processors/ChatProcessor.ts +713 -0
- package/src/processors/ModelsProcessor.ts +34 -0
- package/src/processors/index.ts +2 -0
- package/src/services/AIService.ts +241 -0
- package/src/services/InternalEventsHandler.ts +61 -0
- package/src/services/KafkaService.ts +142 -0
- package/src/services/ModelFetcher.ts +286 -0
- package/src/services/RedisService.ts +285 -0
- package/src/services/SocketService.ts +153 -0
- package/src/services/index.ts +6 -0
- package/src/store/AgentStore.ts +138 -0
- package/src/store/ArtifactStore.ts +29 -0
- package/src/store/ConfigStore.test.ts +314 -0
- package/src/store/ConfigStore.ts +239 -0
- package/src/store/ModelStore.test.ts +473 -0
- package/src/store/ModelStore.ts +93 -0
- package/src/store/index.ts +4 -0
- package/src/tools/generateChartTool.ts +131 -0
- package/src/tools/proposeFormValuesTool.ts +67 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Server as SocketIOServer } from 'socket.io';
|
|
2
|
+
import { createAdapter } from '@socket.io/redis-adapter';
|
|
3
|
+
import { SocketIOEvents, SocketIOConfig } from '@multiplayer-app/ai-agent-types';
|
|
4
|
+
import { redisService } from './RedisService';
|
|
5
|
+
import { logger } from '../libs/logger';
|
|
6
|
+
export class SocketIOError extends Error {
|
|
7
|
+
constructor(message, code) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.data = { code };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
const authWrap = (middleware, reqParams) => async (socket, next) => {
|
|
13
|
+
var _a;
|
|
14
|
+
if (!middleware) {
|
|
15
|
+
return next();
|
|
16
|
+
}
|
|
17
|
+
const req = socket.request;
|
|
18
|
+
const _headers = Object.fromEntries(Object.entries(((_a = socket === null || socket === void 0 ? void 0 : socket.handshake) === null || _a === void 0 ? void 0 : _a.auth) || {})
|
|
19
|
+
.map(([key, value]) => ([key.toLowerCase(), value])));
|
|
20
|
+
req.headers = {
|
|
21
|
+
...(req.headers || {}),
|
|
22
|
+
...(_headers),
|
|
23
|
+
};
|
|
24
|
+
if (reqParams) {
|
|
25
|
+
req.params = reqParams;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
await middleware(req, {}, (err) => {
|
|
29
|
+
if (err) {
|
|
30
|
+
return next(new SocketIOError(err.message, (err === null || err === void 0 ? void 0 : err.statusCode) || 401));
|
|
31
|
+
}
|
|
32
|
+
return next();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return next(new SocketIOError((error === null || error === void 0 ? void 0 : error.message) || 'Authorization failed', (error === null || error === void 0 ? void 0 : error.statusCode) || 401));
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
export class SocketService {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.io = null;
|
|
42
|
+
}
|
|
43
|
+
async initialize(httpServer, authorizationMiddleware) {
|
|
44
|
+
this.io = new SocketIOServer(httpServer, {
|
|
45
|
+
cors: {
|
|
46
|
+
origin: true,
|
|
47
|
+
credentials: true
|
|
48
|
+
},
|
|
49
|
+
path: SocketIOConfig.Path
|
|
50
|
+
});
|
|
51
|
+
// Set up Redis adapter for multi-server support
|
|
52
|
+
try {
|
|
53
|
+
const { pubClient, subClient } = await redisService.getPubSubClients('socketio');
|
|
54
|
+
this.io.adapter(createAdapter(pubClient, subClient));
|
|
55
|
+
logger.debug('Socket.IO Redis adapter initialized');
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
logger.error('Failed to initialize Redis adapter for Socket.IO:', error);
|
|
59
|
+
// Continue without adapter - single server mode
|
|
60
|
+
logger.warn('Socket.IO running without Redis adapter (single server mode)');
|
|
61
|
+
}
|
|
62
|
+
this.io.use(authWrap(authorizationMiddleware));
|
|
63
|
+
this.io.on('connection', (socket) => {
|
|
64
|
+
// Extract userId from handshake auth or query
|
|
65
|
+
const userId = socket.request.userId;
|
|
66
|
+
// Reject connection if no userId is provided
|
|
67
|
+
if (!userId) {
|
|
68
|
+
logger.debug(`Socket connection rejected: no userId provided for socket ${socket.id}`);
|
|
69
|
+
socket.disconnect(true);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Join user-specific room
|
|
73
|
+
const userRoom = `${SocketIOConfig.UserRoomPrefix}${userId}`;
|
|
74
|
+
socket.join(userRoom);
|
|
75
|
+
logger.debug(`Socket connected: ${socket.id} for user: ${userId}`);
|
|
76
|
+
socket.on('disconnect', () => {
|
|
77
|
+
logger.debug(`Socket disconnected: ${socket.id} for user: ${userId}`);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Emit a new chat event to a specific user
|
|
83
|
+
*/
|
|
84
|
+
emitNewChat(userId, chat) {
|
|
85
|
+
if (!this.io)
|
|
86
|
+
return;
|
|
87
|
+
const userRoom = `${SocketIOConfig.UserRoomPrefix}${userId}`;
|
|
88
|
+
this.io.to(userRoom).emit(SocketIOEvents.ChatNew, chat);
|
|
89
|
+
logger.debug(`Emitted ${SocketIOEvents.ChatNew} to user ${userId}:`, { chatId: chat.id });
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Emit a new message event to a specific user
|
|
93
|
+
*/
|
|
94
|
+
emitMessageUpdate(userId, message, excludeSocketId) {
|
|
95
|
+
if (!this.io || !userId)
|
|
96
|
+
return;
|
|
97
|
+
const userRoom = `${SocketIOConfig.UserRoomPrefix}${userId}`;
|
|
98
|
+
if (excludeSocketId) {
|
|
99
|
+
this.io.to(userRoom).except(excludeSocketId).emit(SocketIOEvents.MessageNew, message);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
this.io.to(userRoom).emit(SocketIOEvents.MessageNew, message);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Emit a chat update event to a specific user
|
|
107
|
+
*/
|
|
108
|
+
emitChatUpdate(userId, chat, excludeSocketId) {
|
|
109
|
+
if (!this.io)
|
|
110
|
+
return;
|
|
111
|
+
const userRoom = `${SocketIOConfig.UserRoomPrefix}${userId}`;
|
|
112
|
+
if (excludeSocketId) {
|
|
113
|
+
this.io.to(userRoom).except(excludeSocketId).emit(SocketIOEvents.ChatUpdate, chat);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this.io.to(userRoom).emit(SocketIOEvents.ChatUpdate, chat);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get the Socket.IO server instance
|
|
121
|
+
*/
|
|
122
|
+
getIO() {
|
|
123
|
+
return this.io;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Singleton instance
|
|
127
|
+
export const socketService = new SocketService();
|
|
128
|
+
//# sourceMappingURL=SocketService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SocketService.js","sourceRoot":"","sources":["../../src/services/SocketService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AgentMessage } from "@multiplayer-app/ai-agent-types";
|
|
2
|
+
export type AgentProcessListener = (payload: AgentProcessEvent) => void;
|
|
3
|
+
export interface AgentProcess {
|
|
4
|
+
chatId: string;
|
|
5
|
+
abortController: AbortController;
|
|
6
|
+
listeners: AgentProcessListener[];
|
|
7
|
+
}
|
|
8
|
+
export declare enum AgentProcessEventType {
|
|
9
|
+
Stop = "stop",
|
|
10
|
+
Finished = "finished",
|
|
11
|
+
Error = "error",
|
|
12
|
+
Aborted = "aborted",
|
|
13
|
+
Update = "update"
|
|
14
|
+
}
|
|
15
|
+
export type AgentProcessEvent = {
|
|
16
|
+
type: AgentProcessEventType.Update;
|
|
17
|
+
data: AgentMessage;
|
|
18
|
+
} | {
|
|
19
|
+
type: AgentProcessEventType.Finished;
|
|
20
|
+
data: AgentMessage;
|
|
21
|
+
} | {
|
|
22
|
+
type: AgentProcessEventType.Error;
|
|
23
|
+
data: Error;
|
|
24
|
+
} | {
|
|
25
|
+
type: AgentProcessEventType.Aborted;
|
|
26
|
+
data: void;
|
|
27
|
+
} | {
|
|
28
|
+
type: AgentProcessEventType.Stop;
|
|
29
|
+
data: void;
|
|
30
|
+
};
|
|
31
|
+
export interface AgentProcessEventPayload {
|
|
32
|
+
chatId: string;
|
|
33
|
+
event: AgentProcessEvent;
|
|
34
|
+
}
|
|
35
|
+
export declare class AgentStore {
|
|
36
|
+
private readonly internalEventsHandler;
|
|
37
|
+
private readonly agentProcesses;
|
|
38
|
+
initialize(): Promise<void>;
|
|
39
|
+
shareAgentProcessEvent(chatId: string, event: AgentProcessEvent): Promise<void>;
|
|
40
|
+
registerAgentProcess(chatId: string): AbortController;
|
|
41
|
+
unregisterAgentProcess(chatId: string): void;
|
|
42
|
+
addListener(chatId: string, listener: AgentProcessListener): boolean;
|
|
43
|
+
removeListener(chatId: string, listener: AgentProcessListener): void;
|
|
44
|
+
publishEvent(chatId: string, event: AgentProcessEvent): void;
|
|
45
|
+
private stopAgentProcess;
|
|
46
|
+
}
|
|
47
|
+
export declare const agentStore: AgentStore;
|
|
48
|
+
//# sourceMappingURL=AgentStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentStore.d.ts","sourceRoot":"","sources":["../../src/store/AgentStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAG/D,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAExE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,oBAAY,qBAAqB;IAC/B,IAAI,SAAS;IACb,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,YAAY,CAAC;CACpB,GAAG;IACF,IAAI,EAAE,qBAAqB,CAAC,QAAQ,CAAC;IACrC,IAAI,EAAE,YAAY,CAAC;CACpB,GAAG;IACF,IAAI,EAAE,qBAAqB,CAAC,KAAK,CAAC;IAClC,IAAI,EAAE,KAAK,CAAC;CACb,GAAG;IACF,IAAI,EAAE,qBAAqB,CAAC,OAAO,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC;CACZ,GAAG;IACF,IAAI,EAAE,qBAAqB,CAAC,IAAI,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC;CACZ,CAAA;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA6C;IACnF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAE5D,UAAU;IAmBV,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB;IAsBrE,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAWrD,sBAAsB,CAAC,MAAM,EAAE,MAAM;IAIrC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO;IASpE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB;IAO7D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB;IAOrD,OAAO,CAAC,gBAAgB;CAUzB;AAED,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { InternalEventsHandler } from "../services/InternalEventsHandler";
|
|
2
|
+
export var AgentProcessEventType;
|
|
3
|
+
(function (AgentProcessEventType) {
|
|
4
|
+
AgentProcessEventType["Stop"] = "stop";
|
|
5
|
+
AgentProcessEventType["Finished"] = "finished";
|
|
6
|
+
AgentProcessEventType["Error"] = "error";
|
|
7
|
+
AgentProcessEventType["Aborted"] = "aborted";
|
|
8
|
+
AgentProcessEventType["Update"] = "update";
|
|
9
|
+
})(AgentProcessEventType || (AgentProcessEventType = {}));
|
|
10
|
+
export class AgentStore {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.internalEventsHandler = new InternalEventsHandler('agent-events');
|
|
13
|
+
this.agentProcesses = new Map();
|
|
14
|
+
}
|
|
15
|
+
async initialize() {
|
|
16
|
+
await this.internalEventsHandler.listen((payload) => {
|
|
17
|
+
switch (payload.event.type) {
|
|
18
|
+
case AgentProcessEventType.Stop:
|
|
19
|
+
this.stopAgentProcess(payload.chatId);
|
|
20
|
+
break;
|
|
21
|
+
case AgentProcessEventType.Finished:
|
|
22
|
+
case AgentProcessEventType.Error:
|
|
23
|
+
case AgentProcessEventType.Aborted:
|
|
24
|
+
this.publishEvent(payload.chatId, payload.event);
|
|
25
|
+
this.unregisterAgentProcess(payload.chatId);
|
|
26
|
+
break;
|
|
27
|
+
default:
|
|
28
|
+
this.publishEvent(payload.chatId, payload.event);
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async shareAgentProcessEvent(chatId, event) {
|
|
34
|
+
try {
|
|
35
|
+
await this.internalEventsHandler.publish({ chatId, event });
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
// Fallback: publish locally if Redis fails
|
|
39
|
+
if (event.type === AgentProcessEventType.Stop) {
|
|
40
|
+
// Stop must actually abort the running controller, not just notify listeners.
|
|
41
|
+
this.stopAgentProcess(chatId);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.publishEvent(chatId, event);
|
|
45
|
+
// If this is a terminal event, also unregister locally
|
|
46
|
+
if (event.type === AgentProcessEventType.Finished ||
|
|
47
|
+
event.type === AgentProcessEventType.Error ||
|
|
48
|
+
event.type === AgentProcessEventType.Aborted) {
|
|
49
|
+
this.unregisterAgentProcess(chatId);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
registerAgentProcess(chatId) {
|
|
54
|
+
if (!this.agentProcesses.has(chatId)) {
|
|
55
|
+
this.agentProcesses.set(chatId, {
|
|
56
|
+
chatId,
|
|
57
|
+
abortController: new AbortController(),
|
|
58
|
+
listeners: [],
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return this.agentProcesses.get(chatId).abortController;
|
|
62
|
+
}
|
|
63
|
+
unregisterAgentProcess(chatId) {
|
|
64
|
+
this.agentProcesses.delete(chatId);
|
|
65
|
+
}
|
|
66
|
+
addListener(chatId, listener) {
|
|
67
|
+
const agentProcess = this.agentProcesses.get(chatId);
|
|
68
|
+
if (agentProcess) {
|
|
69
|
+
agentProcess.listeners.push(listener);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
removeListener(chatId, listener) {
|
|
75
|
+
const agentProcess = this.agentProcesses.get(chatId);
|
|
76
|
+
if (agentProcess) {
|
|
77
|
+
agentProcess.listeners = agentProcess.listeners.filter((l) => l !== listener);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
publishEvent(chatId, event) {
|
|
81
|
+
const agentProcess = this.agentProcesses.get(chatId);
|
|
82
|
+
if (agentProcess) {
|
|
83
|
+
agentProcess.listeners.forEach((listener) => listener(event));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
stopAgentProcess(chatId) {
|
|
87
|
+
const agentProcess = this.agentProcesses.get(chatId);
|
|
88
|
+
if (agentProcess) {
|
|
89
|
+
agentProcess.abortController.abort();
|
|
90
|
+
this.publishEvent(chatId, { type: AgentProcessEventType.Aborted, data: undefined });
|
|
91
|
+
// This is terminal. If we keep the process registered, the next send reuses an already-aborted controller
|
|
92
|
+
// and immediately aborts again, which looks like "next messages not processing".
|
|
93
|
+
this.unregisterAgentProcess(chatId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export const agentStore = new AgentStore();
|
|
98
|
+
//# sourceMappingURL=AgentStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentStore.js","sourceRoot":"","sources":["../../src/store/AgentStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentArtifact } from '@multiplayer-app/ai-agent-types';
|
|
2
|
+
/**
|
|
3
|
+
* Simple in-memory store for artifacts.
|
|
4
|
+
* In the future, this could be moved to MongoDB or a separate collection.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ArtifactStore {
|
|
7
|
+
private artifacts;
|
|
8
|
+
listArtifacts(chatId: string): AgentArtifact[];
|
|
9
|
+
setArtifacts(chatId: string, artifacts: AgentArtifact[]): void;
|
|
10
|
+
addArtifact(chatId: string, artifact: AgentArtifact): void;
|
|
11
|
+
deleteArtifacts(chatId: string): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ArtifactStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArtifactStore.d.ts","sourceRoot":"","sources":["../../src/store/ArtifactStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAsC;IAEvD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE;IAI9C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,IAAI;IAI9D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAO1D,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGtC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory store for artifacts.
|
|
3
|
+
* In the future, this could be moved to MongoDB or a separate collection.
|
|
4
|
+
*/
|
|
5
|
+
export class ArtifactStore {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.artifacts = new Map();
|
|
8
|
+
}
|
|
9
|
+
listArtifacts(chatId) {
|
|
10
|
+
var _a;
|
|
11
|
+
return (_a = this.artifacts.get(chatId)) !== null && _a !== void 0 ? _a : [];
|
|
12
|
+
}
|
|
13
|
+
setArtifacts(chatId, artifacts) {
|
|
14
|
+
this.artifacts.set(chatId, artifacts);
|
|
15
|
+
}
|
|
16
|
+
addArtifact(chatId, artifact) {
|
|
17
|
+
var _a;
|
|
18
|
+
const artifacts = (_a = this.artifacts.get(chatId)) !== null && _a !== void 0 ? _a : [];
|
|
19
|
+
artifacts.unshift(artifact);
|
|
20
|
+
// Keep only the last 5 artifacts
|
|
21
|
+
this.artifacts.set(chatId, artifacts.slice(0, 5));
|
|
22
|
+
}
|
|
23
|
+
deleteArtifacts(chatId) {
|
|
24
|
+
this.artifacts.delete(chatId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=ArtifactStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArtifactStore.js","sourceRoot":"","sources":["../../src/store/ArtifactStore.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,aAAa;IAA1B;QACU,cAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAoBzD,CAAC;IAlBC,aAAa,CAAC,MAAc;;QAC1B,OAAO,MAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,mCAAI,EAAE,CAAC;IAC1C,CAAC;IAED,YAAY,CAAC,MAAc,EAAE,SAA0B;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,MAAc,EAAE,QAAuB;;QACjD,MAAM,SAAS,GAAG,MAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,mCAAI,EAAE,CAAC;QACnD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5B,iCAAiC;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,eAAe,CAAC,MAAc;QAC5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { AgentConfig, AgentTool } from '@multiplayer-app/ai-agent-types';
|
|
2
|
+
export declare class ConfigStore {
|
|
3
|
+
private static instance;
|
|
4
|
+
private config;
|
|
5
|
+
private allowedModels;
|
|
6
|
+
private agentsMap;
|
|
7
|
+
readonly defaultAgentConfig: AgentConfig;
|
|
8
|
+
private constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Get the singleton instance of ConfigStore
|
|
11
|
+
*/
|
|
12
|
+
static getInstance(): ConfigStore;
|
|
13
|
+
/**
|
|
14
|
+
* Load the app config from a file path
|
|
15
|
+
* This method is idempotent - if config is already loaded, it returns the existing promise
|
|
16
|
+
* @param rawConfig - Raw config object (may include models array)
|
|
17
|
+
* @throws Error if config cannot be loaded
|
|
18
|
+
*/
|
|
19
|
+
loadConfig(rawConfig: Record<string, any>): void;
|
|
20
|
+
addAllowedModelPattern(pattern: string): void;
|
|
21
|
+
addAgent<T = any>(contextKeys: string[], agentConfig: AgentConfig<T>): void;
|
|
22
|
+
/**
|
|
23
|
+
* Add a tool to every loaded agent (across all contexts).
|
|
24
|
+
* This is intended for built-in tools that should always be available.
|
|
25
|
+
* @param tool - The tool to add to all agents
|
|
26
|
+
*/
|
|
27
|
+
addToolToAllAgents(tool: AgentTool): void;
|
|
28
|
+
getAgentConfigByName(agentName: string | undefined): AgentConfig;
|
|
29
|
+
/**
|
|
30
|
+
* Get all agents for a specific context key
|
|
31
|
+
* @param contextKey - The context key to get agents for
|
|
32
|
+
* @returns Array of AgentConfig for the context, or empty array if context not found
|
|
33
|
+
*/
|
|
34
|
+
getAgentsForContext(contextKey: string): AgentConfig[];
|
|
35
|
+
/**
|
|
36
|
+
* Get a specific agent by name for a context
|
|
37
|
+
* @param contextKey - The context key
|
|
38
|
+
* @param agentName - The name of the agent
|
|
39
|
+
* @returns AgentConfig if found, undefined otherwise
|
|
40
|
+
*/
|
|
41
|
+
getAgentForContext(contextKey: string, agentName: string): AgentConfig;
|
|
42
|
+
/**
|
|
43
|
+
* Get all context keys
|
|
44
|
+
* @returns Array of context key strings
|
|
45
|
+
*/
|
|
46
|
+
getContextKeys(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Check if a context key exists
|
|
49
|
+
* @param contextKey - The context key to check
|
|
50
|
+
* @returns true if context exists, false otherwise
|
|
51
|
+
*/
|
|
52
|
+
hasContext(contextKey: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Get the total number of agents across all contexts
|
|
55
|
+
* @returns Total count of agents
|
|
56
|
+
*/
|
|
57
|
+
getTotalAgentsCount(): number;
|
|
58
|
+
/**
|
|
59
|
+
* Get all unique agent names across all contexts
|
|
60
|
+
* @returns Array of unique agent names
|
|
61
|
+
*/
|
|
62
|
+
getAllAgentNames(): string[];
|
|
63
|
+
/**
|
|
64
|
+
* Check if config has been loaded
|
|
65
|
+
* @returns true if config is loaded, false otherwise
|
|
66
|
+
*/
|
|
67
|
+
isLoaded(): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Check if a model is allowed based on the configured allowedModels patterns
|
|
70
|
+
* Patterns support wildcards (*) which match any sequence of characters
|
|
71
|
+
* - Patterns without a provider prefix (e.g., 'gpt-4') match the model ID across all providers
|
|
72
|
+
* - Patterns with a provider prefix (e.g., 'openai/gpt-4') only match that specific provider
|
|
73
|
+
* @param model - The model identifier to check (e.g., 'openai/gpt-4o', 'anthropic/claude-3-5-sonnet', 'gpt-4')
|
|
74
|
+
* @param provider - Optional provider name. If provided and model doesn't contain '/', constructs as 'provider/model'.
|
|
75
|
+
* For OpenRouter, the model should already contain the full path (e.g., 'openai/gpt-4')
|
|
76
|
+
* @returns true if model matches any allowed pattern, false otherwise
|
|
77
|
+
*/
|
|
78
|
+
isModelAllowed(model: string, provider?: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Get the allowed model patterns
|
|
81
|
+
* @returns Array of allowed model patterns
|
|
82
|
+
*/
|
|
83
|
+
getAllowedModels(): string[];
|
|
84
|
+
/**
|
|
85
|
+
* Clear the loaded config (useful for testing or reloading)
|
|
86
|
+
*/
|
|
87
|
+
clear(): void;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=ConfigStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigStore.d.ts","sourceRoot":"","sources":["../../src/store/ConfigStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,WAAW,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAK9F,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAuC;IAGxD,SAAgB,kBAAkB,EAAE,WAAW,CAM7C;IACF,OAAO;IAEP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,WAAW;IAOjC;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAUhD,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7C,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAU3E;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAiBzC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW;IAOhE;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE;IAItD;;;;;OAKG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW;IAKtE;;;OAGG;IACH,cAAc,IAAI,MAAM,EAAE;IAQ1B;;;;OAIG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAQvC;;;OAGG;IACH,mBAAmB,IAAI,MAAM;IAQ7B;;;OAGG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAc5B;;;OAGG;IACH,QAAQ,IAAI,OAAO;IAInB;;;;;;;;;OASG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAwCzD;;;OAGG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|