@autonomaai/conversation-tracker 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agentMiddleware.d.ts +38 -0
- package/dist/agentMiddleware.d.ts.map +1 -0
- package/dist/agentMiddleware.js +240 -0
- package/dist/agentMiddleware.js.map +1 -0
- package/dist/bffDataService.d.ts +68 -0
- package/dist/bffDataService.d.ts.map +1 -0
- package/dist/bffDataService.js +251 -0
- package/dist/bffDataService.js.map +1 -0
- package/dist/conversationService.d.ts +20 -0
- package/dist/conversationService.d.ts.map +1 -0
- package/dist/conversationService.js +336 -0
- package/dist/conversationService.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/operationsService.d.ts +27 -0
- package/dist/operationsService.d.ts.map +1 -0
- package/dist/operationsService.js +384 -0
- package/dist/operationsService.js.map +1 -0
- package/dist/types.d.ts +226 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ConversationTrackerConfig, AgentType, MessageMetadata, TradingOperationInput } from './types';
|
|
2
|
+
export declare class AgentTrackingMiddleware {
|
|
3
|
+
private conversationService;
|
|
4
|
+
private operationsService;
|
|
5
|
+
constructor(config: ConversationTrackerConfig);
|
|
6
|
+
createTrackingMiddleware(): (request: any, response: any, next: any) => Promise<void>;
|
|
7
|
+
trackUserMessage(sessionId: string, message: string): Promise<void>;
|
|
8
|
+
trackAgentResponse(sessionId: string, response: string, metadata: MessageMetadata): Promise<void>;
|
|
9
|
+
trackHummingbotOperation(executorData: any, userId: string): Promise<string>;
|
|
10
|
+
startNewSession(userId: string, agentType: AgentType, metadata?: Record<string, any>): Promise<string>;
|
|
11
|
+
endSession(sessionId: string): Promise<void>;
|
|
12
|
+
enhanceExistingAgent(agentConfig: {
|
|
13
|
+
userId: string;
|
|
14
|
+
agentType: AgentType;
|
|
15
|
+
onMessage?: (message: string, isUser: boolean) => void;
|
|
16
|
+
onTradingOperation?: (operation: any) => void;
|
|
17
|
+
}): {
|
|
18
|
+
startSession(): Promise<string>;
|
|
19
|
+
endSession(): Promise<void>;
|
|
20
|
+
logUserMessage(message: string): Promise<void>;
|
|
21
|
+
logAgentResponse(response: string, metadata?: MessageMetadata): Promise<void>;
|
|
22
|
+
logTradingOperation(operation: Omit<TradingOperationInput, "user_id">): Promise<string>;
|
|
23
|
+
getSessionId: () => string | null;
|
|
24
|
+
};
|
|
25
|
+
createReactHook(): (userId: string, agentType: AgentType) => {
|
|
26
|
+
startSession: () => Promise<string>;
|
|
27
|
+
endSession: () => Promise<void>;
|
|
28
|
+
logMessage: (message: string, isUser: boolean, metadata?: MessageMetadata) => Promise<void>;
|
|
29
|
+
getSessionId: () => string | null;
|
|
30
|
+
};
|
|
31
|
+
private extractUserId;
|
|
32
|
+
private extractAgentType;
|
|
33
|
+
private isValidAgentType;
|
|
34
|
+
private getClientIP;
|
|
35
|
+
}
|
|
36
|
+
export declare function createAgentTracker(config: ConversationTrackerConfig): AgentTrackingMiddleware;
|
|
37
|
+
export declare function trackAgentCall(middleware: AgentTrackingMiddleware, agentType: AgentType, userId: string): (_target: any, propertyName: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
|
|
38
|
+
//# sourceMappingURL=agentMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentMiddleware.d.ts","sourceRoot":"","sources":["../src/agentMiddleware.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,yBAAyB,EACzB,SAAS,EACT,eAAe,EACf,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB,qBAAa,uBAAuB;IAClC,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,iBAAiB,CAA4B;gBAEzC,MAAM,EAAE,yBAAyB;IAM7C,wBAAwB,KACR,SAAS,GAAG,EAAE,UAAU,GAAG,EAAE,MAAM,GAAG;IA4EhD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnE,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,IAAI,CAAC;IAKV,wBAAwB,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK5E,eAAe,CACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,MAAM,CAAC;IAIZ,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,oBAAoB,CAAC,WAAW,EAAE;QAChC,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,SAAS,CAAC;QACrB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACvD,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,IAAI,CAAC;KAC/C;wBAKyB,OAAO,CAAC,MAAM,CAAC;sBAKjB,OAAO,CAAC,IAAI,CAAC;gCAOH,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;mCAOnB,MAAM,aAAa,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;uCAO9C,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;;;IAcjG,eAAe,KACL,QAAQ,MAAM,EAAE,WAAW,SAAS;;;8BAeP,MAAM,UAAU,OAAO,aAAa,eAAe;;;IAuB1F,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,WAAW;CAQpB;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,2BAEnE;AAGD,wBAAgB,cAAc,CAC5B,UAAU,EAAE,uBAAuB,EACnC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,IAEG,SAAS,GAAG,EAAE,cAAc,MAAM,EAAE,YAAY,kBAAkB,wBA4CpF"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentTrackingMiddleware = void 0;
|
|
4
|
+
exports.createAgentTracker = createAgentTracker;
|
|
5
|
+
exports.trackAgentCall = trackAgentCall;
|
|
6
|
+
const conversationService_1 = require("./conversationService");
|
|
7
|
+
const operationsService_1 = require("./operationsService");
|
|
8
|
+
class AgentTrackingMiddleware {
|
|
9
|
+
conversationService;
|
|
10
|
+
operationsService;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.conversationService = new conversationService_1.ConversationTrackingService(config);
|
|
13
|
+
this.operationsService = new operationsService_1.OperationsTrackingService(config);
|
|
14
|
+
}
|
|
15
|
+
// Express/Next.js middleware factory
|
|
16
|
+
createTrackingMiddleware() {
|
|
17
|
+
return async (request, response, next) => {
|
|
18
|
+
const startTime = Date.now();
|
|
19
|
+
const userId = this.extractUserId(request);
|
|
20
|
+
const agentType = this.extractAgentType(request);
|
|
21
|
+
const userAgent = request.headers['user-agent'];
|
|
22
|
+
const ipAddress = this.getClientIP(request);
|
|
23
|
+
try {
|
|
24
|
+
// Start or get existing session
|
|
25
|
+
const sessionId = request.headers['x-session-id'] ||
|
|
26
|
+
await this.conversationService.startSession(userId, agentType, {
|
|
27
|
+
endpoint: request.url,
|
|
28
|
+
method: request.method
|
|
29
|
+
}, userAgent, ipAddress);
|
|
30
|
+
// Add tracking data to request
|
|
31
|
+
request.tracking = {
|
|
32
|
+
userId,
|
|
33
|
+
agentType,
|
|
34
|
+
sessionId,
|
|
35
|
+
startTime,
|
|
36
|
+
conversationService: this.conversationService,
|
|
37
|
+
operationsService: this.operationsService
|
|
38
|
+
};
|
|
39
|
+
// Add tracking utilities to response
|
|
40
|
+
response.tracking = {
|
|
41
|
+
logResponse: async (content, metadata) => {
|
|
42
|
+
const responseTime = Date.now() - startTime;
|
|
43
|
+
await this.conversationService.logMessage(sessionId, 'agent', content, {
|
|
44
|
+
responseTimeMs: responseTime,
|
|
45
|
+
...metadata
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
logError: async (error) => {
|
|
49
|
+
const responseTime = Date.now() - startTime;
|
|
50
|
+
await this.conversationService.logMessage(sessionId, 'agent', error.message, {
|
|
51
|
+
responseTimeMs: responseTime,
|
|
52
|
+
error: { occurred: true, message: error.message }
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
logTradingOperation: async (operation) => {
|
|
56
|
+
return await this.operationsService.logTradingOperation({
|
|
57
|
+
...operation,
|
|
58
|
+
user_id: userId
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
// Set session ID in response headers
|
|
63
|
+
response.setHeader('X-Session-ID', sessionId);
|
|
64
|
+
next();
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
// Log error but don't break the request if tracking fails
|
|
68
|
+
console.error('Tracking middleware error:', error);
|
|
69
|
+
next();
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Helper for tracking user messages manually
|
|
74
|
+
async trackUserMessage(sessionId, message) {
|
|
75
|
+
await this.conversationService.logMessage(sessionId, 'user', message);
|
|
76
|
+
}
|
|
77
|
+
// Helper for tracking agent responses with detailed metadata
|
|
78
|
+
async trackAgentResponse(sessionId, response, metadata) {
|
|
79
|
+
await this.conversationService.logMessage(sessionId, 'agent', response, metadata);
|
|
80
|
+
}
|
|
81
|
+
// Helper for tracking Hummingbot operations
|
|
82
|
+
async trackHummingbotOperation(executorData, userId) {
|
|
83
|
+
return await this.operationsService.trackHummingbotOperation(executorData, userId);
|
|
84
|
+
}
|
|
85
|
+
// Session lifecycle management
|
|
86
|
+
async startNewSession(userId, agentType, metadata) {
|
|
87
|
+
return await this.conversationService.startSession(userId, agentType, metadata);
|
|
88
|
+
}
|
|
89
|
+
async endSession(sessionId) {
|
|
90
|
+
await this.conversationService.endSession(sessionId);
|
|
91
|
+
}
|
|
92
|
+
// Integration helpers for existing agents
|
|
93
|
+
enhanceExistingAgent(agentConfig) {
|
|
94
|
+
let currentSessionId = null;
|
|
95
|
+
const self = this;
|
|
96
|
+
return {
|
|
97
|
+
async startSession() {
|
|
98
|
+
currentSessionId = await self.startNewSession(agentConfig.userId, agentConfig.agentType);
|
|
99
|
+
return currentSessionId;
|
|
100
|
+
},
|
|
101
|
+
async endSession() {
|
|
102
|
+
if (currentSessionId) {
|
|
103
|
+
await self.endSession(currentSessionId);
|
|
104
|
+
currentSessionId = null;
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
async logUserMessage(message) {
|
|
108
|
+
if (currentSessionId) {
|
|
109
|
+
await self.conversationService.logMessage(currentSessionId, 'user', message);
|
|
110
|
+
agentConfig.onMessage?.(message, true);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
async logAgentResponse(response, metadata) {
|
|
114
|
+
if (currentSessionId) {
|
|
115
|
+
await self.conversationService.logMessage(currentSessionId, 'agent', response, metadata);
|
|
116
|
+
agentConfig.onMessage?.(response, false);
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
async logTradingOperation(operation) {
|
|
120
|
+
const operationId = await self.operationsService.logTradingOperation({
|
|
121
|
+
...operation,
|
|
122
|
+
user_id: agentConfig.userId
|
|
123
|
+
});
|
|
124
|
+
agentConfig.onTradingOperation?.(operation);
|
|
125
|
+
return operationId;
|
|
126
|
+
},
|
|
127
|
+
getSessionId: () => currentSessionId
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Hook for React/Next.js components
|
|
131
|
+
createReactHook() {
|
|
132
|
+
return (userId, agentType) => {
|
|
133
|
+
let sessionId = null;
|
|
134
|
+
const startSession = async () => {
|
|
135
|
+
sessionId = await this.startNewSession(userId, agentType);
|
|
136
|
+
return sessionId;
|
|
137
|
+
};
|
|
138
|
+
const endSession = async () => {
|
|
139
|
+
if (sessionId) {
|
|
140
|
+
await this.endSession(sessionId);
|
|
141
|
+
sessionId = null;
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const logMessage = async (message, isUser, metadata) => {
|
|
145
|
+
if (!sessionId) {
|
|
146
|
+
sessionId = await startSession();
|
|
147
|
+
}
|
|
148
|
+
await this.conversationService.logMessage(sessionId, isUser ? 'user' : 'agent', message, metadata);
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
startSession,
|
|
152
|
+
endSession,
|
|
153
|
+
logMessage,
|
|
154
|
+
getSessionId: () => sessionId
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
// Private helper methods
|
|
159
|
+
extractUserId(request) {
|
|
160
|
+
// Try multiple sources for user ID
|
|
161
|
+
return request.headers['x-user-id'] ||
|
|
162
|
+
request.user?.id ||
|
|
163
|
+
request.query?.userId ||
|
|
164
|
+
'anonymous';
|
|
165
|
+
}
|
|
166
|
+
extractAgentType(request) {
|
|
167
|
+
// Try to determine agent type from headers, URL, or other indicators
|
|
168
|
+
const agentHeader = request.headers['x-agent-type'];
|
|
169
|
+
if (agentHeader && this.isValidAgentType(agentHeader)) {
|
|
170
|
+
return agentHeader;
|
|
171
|
+
}
|
|
172
|
+
// Fallback to URL-based detection
|
|
173
|
+
const url = request.url || request.path || '';
|
|
174
|
+
if (url.includes('market-maker') || url.includes(':3001'))
|
|
175
|
+
return 'market_maker';
|
|
176
|
+
if (url.includes('apy') || url.includes(':3003'))
|
|
177
|
+
return 'apy_strategy';
|
|
178
|
+
if (url.includes('portfolio') || url.includes(':3005'))
|
|
179
|
+
return 'portfolio_manager';
|
|
180
|
+
if (url.includes('memecoin') || url.includes(':3007'))
|
|
181
|
+
return 'memecoin';
|
|
182
|
+
// Default fallback
|
|
183
|
+
return 'market_maker';
|
|
184
|
+
}
|
|
185
|
+
isValidAgentType(type) {
|
|
186
|
+
return ['market_maker', 'apy_strategy', 'portfolio_manager', 'memecoin'].includes(type);
|
|
187
|
+
}
|
|
188
|
+
getClientIP(request) {
|
|
189
|
+
return request.headers['x-forwarded-for']?.split(',')[0] ||
|
|
190
|
+
request.headers['x-real-ip'] ||
|
|
191
|
+
request.connection?.remoteAddress ||
|
|
192
|
+
request.socket?.remoteAddress ||
|
|
193
|
+
request.ip ||
|
|
194
|
+
'unknown';
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.AgentTrackingMiddleware = AgentTrackingMiddleware;
|
|
198
|
+
// Factory function for easy instantiation
|
|
199
|
+
function createAgentTracker(config) {
|
|
200
|
+
return new AgentTrackingMiddleware(config);
|
|
201
|
+
}
|
|
202
|
+
// Decorator for agent functions
|
|
203
|
+
function trackAgentCall(middleware, agentType, userId) {
|
|
204
|
+
return function (_target, propertyName, descriptor) {
|
|
205
|
+
const method = descriptor.value;
|
|
206
|
+
descriptor.value = async function (...args) {
|
|
207
|
+
const startTime = Date.now();
|
|
208
|
+
try {
|
|
209
|
+
const result = await method.apply(this, args);
|
|
210
|
+
// Track successful call
|
|
211
|
+
const sessionId = await middleware.startNewSession(userId, agentType, {
|
|
212
|
+
method: propertyName,
|
|
213
|
+
args: args.length
|
|
214
|
+
});
|
|
215
|
+
await middleware.trackAgentResponse(sessionId, JSON.stringify(result), {
|
|
216
|
+
responseTimeMs: Date.now() - startTime,
|
|
217
|
+
toolsUsed: [propertyName]
|
|
218
|
+
});
|
|
219
|
+
await middleware.endSession(sessionId);
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
// Track error
|
|
224
|
+
const sessionId = await middleware.startNewSession(userId, agentType, {
|
|
225
|
+
method: propertyName,
|
|
226
|
+
error: true
|
|
227
|
+
});
|
|
228
|
+
await middleware.trackAgentResponse(sessionId, error.message, {
|
|
229
|
+
responseTimeMs: Date.now() - startTime,
|
|
230
|
+
error: { occurred: true, message: error.message },
|
|
231
|
+
toolsUsed: [propertyName]
|
|
232
|
+
});
|
|
233
|
+
await middleware.endSession(sessionId);
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
return descriptor;
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=agentMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentMiddleware.js","sourceRoot":"","sources":["../src/agentMiddleware.ts"],"names":[],"mappings":";;;AAkQA,gDAEC;AAGD,wCAiDC;AAxTD,+DAAoE;AACpE,2DAAgE;AAQhE,MAAa,uBAAuB;IAC1B,mBAAmB,CAA8B;IACjD,iBAAiB,CAA4B;IAErD,YAAY,MAAiC;QAC3C,IAAI,CAAC,mBAAmB,GAAG,IAAI,iDAA2B,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,iBAAiB,GAAG,IAAI,6CAAyB,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,qCAAqC;IACrC,wBAAwB;QACtB,OAAO,KAAK,EAAE,OAAY,EAAE,QAAa,EAAE,IAAS,EAAE,EAAE;YACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAE5C,IAAI,CAAC;gBACH,gCAAgC;gBAChC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;oBAC/C,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE;wBAC7D,QAAQ,EAAE,OAAO,CAAC,GAAG;wBACrB,MAAM,EAAE,OAAO,CAAC,MAAM;qBACvB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAE3B,+BAA+B;gBAC/B,OAAO,CAAC,QAAQ,GAAG;oBACjB,MAAM;oBACN,SAAS;oBACT,SAAS;oBACT,SAAS;oBACT,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;oBAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;iBAC1C,CAAC;gBAEF,qCAAqC;gBACrC,QAAQ,CAAC,QAAQ,GAAG;oBAClB,WAAW,EAAE,KAAK,EAAE,OAAe,EAAE,QAAmC,EAAE,EAAE;wBAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wBAE5C,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CACvC,SAAS,EACT,OAAO,EACP,OAAO,EACP;4BACE,cAAc,EAAE,YAAY;4BAC5B,GAAG,QAAQ;yBACZ,CACF,CAAC;oBACJ,CAAC;oBAED,QAAQ,EAAE,KAAK,EAAE,KAAY,EAAE,EAAE;wBAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wBAE5C,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CACvC,SAAS,EACT,OAAO,EACP,KAAK,CAAC,OAAO,EACb;4BACE,cAAc,EAAE,YAAY;4BAC5B,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;yBAClD,CACF,CAAC;oBACJ,CAAC;oBAED,mBAAmB,EAAE,KAAK,EAAE,SAAiD,EAAE,EAAE;wBAC/E,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC;4BACtD,GAAG,SAAS;4BACZ,OAAO,EAAE,MAAM;yBAChB,CAAC,CAAC;oBACL,CAAC;iBACF,CAAC;gBAEF,qCAAqC;gBACrC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;gBAE9C,IAAI,EAAE,CAAC;YACT,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,0DAA0D;gBAC1D,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;gBACnD,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,OAAe;QACvD,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,kBAAkB,CACtB,SAAiB,EACjB,QAAgB,EAChB,QAAyB;QAEzB,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpF,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,wBAAwB,CAAC,YAAiB,EAAE,MAAc;QAC9D,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACrF,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,eAAe,CACnB,MAAc,EACd,SAAoB,EACpB,QAA8B;QAE9B,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAED,0CAA0C;IAC1C,oBAAoB,CAAC,WAKpB;QACC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC;QAElB,OAAO;YACL,KAAK,CAAC,YAAY;gBAChB,gBAAgB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;gBACzF,OAAO,gBAAiB,CAAC;YAC3B,CAAC;YAED,KAAK,CAAC,UAAU;gBACd,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;oBACxC,gBAAgB,GAAG,IAAI,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,KAAK,CAAC,cAAc,CAAC,OAAe;gBAClC,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;oBAC7E,WAAW,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,QAA0B;gBACjE,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBACzF,WAAW,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,KAAK,CAAC,mBAAmB,CAAC,SAAiD;gBACzE,MAAM,WAAW,GAAW,MAAM,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC;oBAC3E,GAAG,SAAS;oBACZ,OAAO,EAAE,WAAW,CAAC,MAAM;iBAC5B,CAAC,CAAC;gBACH,WAAW,CAAC,kBAAkB,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC5C,OAAO,WAAW,CAAC;YACrB,CAAC;YAED,YAAY,EAAE,GAAG,EAAE,CAAC,gBAAgB;SACrC,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,eAAe;QACb,OAAO,CAAC,MAAc,EAAE,SAAoB,EAAE,EAAE;YAC9C,IAAI,SAAS,GAAkB,IAAI,CAAC;YAEpC,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;gBAC9B,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC1D,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC;YAEF,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;gBAC5B,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;oBACjC,SAAS,GAAG,IAAI,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,UAAU,GAAG,KAAK,EAAE,OAAe,EAAE,MAAe,EAAE,QAA0B,EAAE,EAAE;gBACxF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;gBACnC,CAAC;gBAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,CACvC,SAAS,EACT,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EACzB,OAAO,EACP,QAAQ,CACT,CAAC;YACJ,CAAC,CAAC;YAEF,OAAO;gBACL,YAAY;gBACZ,UAAU;gBACV,UAAU;gBACV,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;aAC9B,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED,yBAAyB;IACjB,aAAa,CAAC,OAAY;QAChC,mCAAmC;QACnC,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YAC5B,OAAO,CAAC,IAAI,EAAE,EAAE;YAChB,OAAO,CAAC,KAAK,EAAE,MAAM;YACrB,WAAW,CAAC;IACrB,CAAC;IAEO,gBAAgB,CAAC,OAAY;QACnC,qEAAqE;QACrE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,WAAW,IAAI,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,CAAC;YACtD,OAAO,WAAwB,CAAC;QAClC,CAAC;QAED,kCAAkC;QAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,cAAc,CAAC;QACjF,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,cAAc,CAAC;QACxE,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,mBAAmB,CAAC;QACnF,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,UAAU,CAAC;QAEzE,mBAAmB;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAEO,gBAAgB,CAAC,IAAY;QACnC,OAAO,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC;IAEO,WAAW,CAAC,OAAY;QAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;YAC5B,OAAO,CAAC,UAAU,EAAE,aAAa;YACjC,OAAO,CAAC,MAAM,EAAE,aAAa;YAC7B,OAAO,CAAC,EAAE;YACV,SAAS,CAAC;IACnB,CAAC;CACF;AAtPD,0DAsPC;AAED,0CAA0C;AAC1C,SAAgB,kBAAkB,CAAC,MAAiC;IAClE,OAAO,IAAI,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,gCAAgC;AAChC,SAAgB,cAAc,CAC5B,UAAmC,EACnC,SAAoB,EACpB,MAAc;IAEd,OAAO,UAAU,OAAY,EAAE,YAAoB,EAAE,UAA8B;QACjF,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC;QAEhC,UAAU,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAW;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAE9C,wBAAwB;gBACxB,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE;oBACpE,MAAM,EAAE,YAAY;oBACpB,IAAI,EAAE,IAAI,CAAC,MAAM;iBAClB,CAAC,CAAC;gBAEH,MAAM,UAAU,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;oBACrE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACtC,SAAS,EAAE,CAAC,YAAY,CAAC;iBAC1B,CAAC,CAAC;gBAEH,MAAM,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAEvC,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc;gBACd,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE;oBACpE,MAAM,EAAE,YAAY;oBACpB,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;gBAEH,MAAM,UAAU,CAAC,kBAAkB,CAAC,SAAS,EAAG,KAAe,CAAC,OAAO,EAAE;oBACvE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACtC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAG,KAAe,CAAC,OAAO,EAAE;oBAC5D,SAAS,EAAE,CAAC,YAAY,CAAC;iBAC1B,CAAC,CAAC;gBAEH,MAAM,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;gBAEvC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { DashboardData, PortfolioChartData, AgentAnalytics, ConversationTrackerConfig } from './types';
|
|
2
|
+
export declare class BFFDataService {
|
|
3
|
+
private conversationService;
|
|
4
|
+
private operationsService;
|
|
5
|
+
constructor(config: ConversationTrackerConfig);
|
|
6
|
+
getDashboardData(userId: string): Promise<DashboardData>;
|
|
7
|
+
getPortfolioChartData(userId: string, timeframe?: string): Promise<PortfolioChartData>;
|
|
8
|
+
getAgentAnalytics(userId: string): Promise<AgentAnalytics>;
|
|
9
|
+
getActiveConversationsStatus(userId: string): Promise<{
|
|
10
|
+
active_sessions: number;
|
|
11
|
+
sessions: {
|
|
12
|
+
id: string;
|
|
13
|
+
agent_type: import("./types").AgentType;
|
|
14
|
+
started_at: Date;
|
|
15
|
+
message_count: number;
|
|
16
|
+
duration_seconds: number;
|
|
17
|
+
}[];
|
|
18
|
+
}>;
|
|
19
|
+
getTradingActivitySummary(userId: string, timeframe?: string): Promise<{
|
|
20
|
+
timeframe: string;
|
|
21
|
+
trading_performance: import("./types").TradingPerformance;
|
|
22
|
+
current_portfolio_value: number;
|
|
23
|
+
last_updated: Date | null;
|
|
24
|
+
active_positions: number;
|
|
25
|
+
}>;
|
|
26
|
+
getAgentPerformanceComparison(userId: string, timeframeDays?: number): Promise<{
|
|
27
|
+
timeframe_days: number;
|
|
28
|
+
agents: any[];
|
|
29
|
+
summary: {
|
|
30
|
+
most_active: any;
|
|
31
|
+
most_profitable: any;
|
|
32
|
+
fastest_response: any;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
getSystemHealthMetrics(): Promise<{
|
|
36
|
+
status: string;
|
|
37
|
+
timestamp: string;
|
|
38
|
+
services: {
|
|
39
|
+
conversation_tracking: string;
|
|
40
|
+
operations_tracking: string;
|
|
41
|
+
database: string;
|
|
42
|
+
};
|
|
43
|
+
metrics: {
|
|
44
|
+
uptime_hours: number;
|
|
45
|
+
memory_usage_mb: number;
|
|
46
|
+
cpu_usage_percent: number;
|
|
47
|
+
};
|
|
48
|
+
error?: undefined;
|
|
49
|
+
} | {
|
|
50
|
+
status: string;
|
|
51
|
+
timestamp: string;
|
|
52
|
+
error: string;
|
|
53
|
+
services?: undefined;
|
|
54
|
+
metrics?: undefined;
|
|
55
|
+
}>;
|
|
56
|
+
private calculatePerformanceSummary;
|
|
57
|
+
refreshDashboardCache(userId: string): Promise<{
|
|
58
|
+
status: string;
|
|
59
|
+
timestamp: string;
|
|
60
|
+
data_points: {
|
|
61
|
+
conversations: number;
|
|
62
|
+
trading_operations: number;
|
|
63
|
+
portfolio_snapshots: number;
|
|
64
|
+
agent_metrics: number;
|
|
65
|
+
};
|
|
66
|
+
}>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=bffDataService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bffDataService.d.ts","sourceRoot":"","sources":["../src/bffDataService.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,yBAAyB,EAE1B,MAAM,SAAS,CAAC;AAEjB,qBAAa,cAAc;IACzB,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,iBAAiB,CAA4B;gBAEzC,MAAM,EAAE,yBAAyB;IAMvC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA2BxD,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkB7F,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuC1D,4BAA4B,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;IAsB3C,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc;;;;;;;IAoBnE,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,GAAE,MAAW;;;;;;;;;IAuExE,sBAAsB;;;;;;;;;;;;;;;;;;;;;IA2B5B,OAAO,CAAC,2BAA2B;IAwB7B,qBAAqB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;CAqB3C"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BFFDataService = void 0;
|
|
4
|
+
const conversationService_1 = require("./conversationService");
|
|
5
|
+
const operationsService_1 = require("./operationsService");
|
|
6
|
+
class BFFDataService {
|
|
7
|
+
conversationService;
|
|
8
|
+
operationsService;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.conversationService = new conversationService_1.ConversationTrackingService(config);
|
|
11
|
+
this.operationsService = new operationsService_1.OperationsTrackingService(config);
|
|
12
|
+
}
|
|
13
|
+
// Main dashboard data for frontend
|
|
14
|
+
async getDashboardData(userId) {
|
|
15
|
+
try {
|
|
16
|
+
const [conversationMetrics, tradingPerformance, portfolioSnapshot, agentMetrics] = await Promise.all([
|
|
17
|
+
this.conversationService.getConversationMetrics(userId, '7d'),
|
|
18
|
+
this.operationsService.getTradingPerformance(userId, '30d'),
|
|
19
|
+
this.operationsService.getLatestPortfolioSnapshot(userId),
|
|
20
|
+
this.operationsService.getAgentPerformanceMetrics(userId)
|
|
21
|
+
]);
|
|
22
|
+
return {
|
|
23
|
+
conversations: conversationMetrics,
|
|
24
|
+
trading: tradingPerformance,
|
|
25
|
+
portfolio: portfolioSnapshot,
|
|
26
|
+
agents: agentMetrics,
|
|
27
|
+
generated_at: new Date().toISOString()
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new Error(`Failed to get dashboard data: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Portfolio performance chart data
|
|
35
|
+
async getPortfolioChartData(userId, timeframe = '30d') {
|
|
36
|
+
try {
|
|
37
|
+
const history = await this.operationsService.getPortfolioHistory(userId, timeframe);
|
|
38
|
+
const performanceSummary = this.calculatePerformanceSummary(history);
|
|
39
|
+
return {
|
|
40
|
+
timeframe,
|
|
41
|
+
data_points: history.length,
|
|
42
|
+
portfolio_values: history,
|
|
43
|
+
performance_summary: performanceSummary
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new Error(`Failed to get portfolio chart data: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Agent usage analytics
|
|
51
|
+
async getAgentAnalytics(userId) {
|
|
52
|
+
try {
|
|
53
|
+
const conversations = await this.conversationService.getConversationHistory(userId, undefined, 100);
|
|
54
|
+
const agentUsage = conversations.reduce((acc, conv) => {
|
|
55
|
+
acc[conv.agent_type] = (acc[conv.agent_type] || 0) + 1;
|
|
56
|
+
return acc;
|
|
57
|
+
}, {});
|
|
58
|
+
const totalSessions = conversations.length;
|
|
59
|
+
const agentDistribution = Object.entries(agentUsage).map(([agent, count]) => ({
|
|
60
|
+
agent_type: agent,
|
|
61
|
+
sessions: count,
|
|
62
|
+
percentage: totalSessions > 0 ? (count / totalSessions) * 100 : 0
|
|
63
|
+
}));
|
|
64
|
+
const mostActiveAgent = Object.entries(agentUsage)
|
|
65
|
+
.sort(([, a], [, b]) => b - a)[0]?.[0] || 'market_maker';
|
|
66
|
+
const recentActivity = conversations.slice(0, 10).map(conv => ({
|
|
67
|
+
agent_type: conv.agent_type,
|
|
68
|
+
session_start: conv.session_start,
|
|
69
|
+
message_count: conv.total_messages,
|
|
70
|
+
duration_minutes: conv.session_duration_seconds ? Math.floor(conv.session_duration_seconds / 60) : null
|
|
71
|
+
}));
|
|
72
|
+
return {
|
|
73
|
+
total_sessions: totalSessions,
|
|
74
|
+
agent_distribution: agentDistribution,
|
|
75
|
+
most_active_agent: mostActiveAgent,
|
|
76
|
+
recent_activity: recentActivity
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
throw new Error(`Failed to get agent analytics: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Real-time conversation status
|
|
84
|
+
async getActiveConversationsStatus(userId) {
|
|
85
|
+
try {
|
|
86
|
+
const activeConversations = await this.conversationService.getActiveConversations(userId);
|
|
87
|
+
return {
|
|
88
|
+
active_sessions: activeConversations.length,
|
|
89
|
+
sessions: activeConversations.map(session => ({
|
|
90
|
+
id: session.id,
|
|
91
|
+
agent_type: session.agent_type,
|
|
92
|
+
started_at: session.session_start,
|
|
93
|
+
message_count: session.total_messages,
|
|
94
|
+
duration_seconds: session.session_start
|
|
95
|
+
? Math.floor((Date.now() - new Date(session.session_start).getTime()) / 1000)
|
|
96
|
+
: 0
|
|
97
|
+
}))
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw new Error(`Failed to get active conversations status: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Trading activity summary
|
|
105
|
+
async getTradingActivitySummary(userId, timeframe = '24h') {
|
|
106
|
+
try {
|
|
107
|
+
const [tradingPerformance, latestSnapshot] = await Promise.all([
|
|
108
|
+
this.operationsService.getTradingPerformance(userId, timeframe),
|
|
109
|
+
this.operationsService.getLatestPortfolioSnapshot(userId)
|
|
110
|
+
]);
|
|
111
|
+
return {
|
|
112
|
+
timeframe,
|
|
113
|
+
trading_performance: tradingPerformance,
|
|
114
|
+
current_portfolio_value: latestSnapshot?.total_value_usd || 0,
|
|
115
|
+
last_updated: latestSnapshot?.snapshot_time || null,
|
|
116
|
+
active_positions: latestSnapshot?.active_positions_count || 0
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw new Error(`Failed to get trading activity summary: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Agent performance comparison
|
|
124
|
+
async getAgentPerformanceComparison(userId, timeframeDays = 30) {
|
|
125
|
+
try {
|
|
126
|
+
const agentMetrics = await this.operationsService.getAgentPerformanceMetrics(userId);
|
|
127
|
+
// Filter to the specified timeframe
|
|
128
|
+
const cutoffDate = new Date(Date.now() - timeframeDays * 24 * 60 * 60 * 1000);
|
|
129
|
+
const recentMetrics = agentMetrics.filter(metric => new Date(metric.metric_date) >= cutoffDate);
|
|
130
|
+
// Group by agent type and aggregate
|
|
131
|
+
const agentPerformance = recentMetrics.reduce((acc, metric) => {
|
|
132
|
+
if (!acc[metric.agent_type]) {
|
|
133
|
+
acc[metric.agent_type] = {
|
|
134
|
+
agent_type: metric.agent_type,
|
|
135
|
+
total_conversations: 0,
|
|
136
|
+
total_messages: 0,
|
|
137
|
+
avg_response_time: 0,
|
|
138
|
+
success_rate: 0,
|
|
139
|
+
total_trades: 0,
|
|
140
|
+
total_pnl: 0,
|
|
141
|
+
avg_roi: 0,
|
|
142
|
+
total_cost: 0,
|
|
143
|
+
data_points: 0
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const agent = acc[metric.agent_type];
|
|
147
|
+
agent.total_conversations += metric.total_conversations;
|
|
148
|
+
agent.total_messages += metric.total_messages;
|
|
149
|
+
agent.avg_response_time += metric.avg_response_time_ms;
|
|
150
|
+
agent.success_rate += metric.success_rate;
|
|
151
|
+
agent.total_trades += metric.trades_executed;
|
|
152
|
+
agent.total_pnl += metric.total_pnl_usd;
|
|
153
|
+
agent.avg_roi += metric.avg_roi_percentage;
|
|
154
|
+
agent.total_cost += metric.total_cost_usd;
|
|
155
|
+
agent.data_points += 1;
|
|
156
|
+
return acc;
|
|
157
|
+
}, {});
|
|
158
|
+
// Calculate averages
|
|
159
|
+
Object.values(agentPerformance).forEach((agent) => {
|
|
160
|
+
if (agent.data_points > 0) {
|
|
161
|
+
agent.avg_response_time = Math.round(agent.avg_response_time / agent.data_points);
|
|
162
|
+
agent.success_rate = Number((agent.success_rate / agent.data_points).toFixed(4));
|
|
163
|
+
agent.avg_roi = Number((agent.avg_roi / agent.data_points).toFixed(4));
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
timeframe_days: timeframeDays,
|
|
168
|
+
agents: Object.values(agentPerformance),
|
|
169
|
+
summary: {
|
|
170
|
+
most_active: Object.values(agentPerformance).sort((a, b) => b.total_conversations - a.total_conversations)[0] || null,
|
|
171
|
+
most_profitable: Object.values(agentPerformance).sort((a, b) => b.total_pnl - a.total_pnl)[0] || null,
|
|
172
|
+
fastest_response: Object.values(agentPerformance).sort((a, b) => a.avg_response_time - b.avg_response_time)[0] || null
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
throw new Error(`Failed to get agent performance comparison: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// System health metrics
|
|
181
|
+
async getSystemHealthMetrics() {
|
|
182
|
+
try {
|
|
183
|
+
// This could be expanded to check various system health indicators
|
|
184
|
+
return {
|
|
185
|
+
status: 'healthy',
|
|
186
|
+
timestamp: new Date().toISOString(),
|
|
187
|
+
services: {
|
|
188
|
+
conversation_tracking: 'operational',
|
|
189
|
+
operations_tracking: 'operational',
|
|
190
|
+
database: 'operational'
|
|
191
|
+
},
|
|
192
|
+
metrics: {
|
|
193
|
+
uptime_hours: Math.floor(process.uptime() / 3600),
|
|
194
|
+
memory_usage_mb: Math.round(process.memoryUsage().heapUsed / 1024 / 1024),
|
|
195
|
+
cpu_usage_percent: process.cpuUsage().user / 1000000 // Rough estimate
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
return {
|
|
201
|
+
status: 'error',
|
|
202
|
+
timestamp: new Date().toISOString(),
|
|
203
|
+
error: error instanceof Error ? error.message : 'Unknown error'
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Private helper methods
|
|
208
|
+
calculatePerformanceSummary(history) {
|
|
209
|
+
if (history.length === 0) {
|
|
210
|
+
return {
|
|
211
|
+
start_value: 0,
|
|
212
|
+
end_value: 0,
|
|
213
|
+
total_return: 0,
|
|
214
|
+
max_drawdown: 0
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const startValue = history[0]?.total_value_usd || 0;
|
|
218
|
+
const endValue = history[history.length - 1]?.total_value_usd || 0;
|
|
219
|
+
const totalReturn = startValue > 0 ? ((endValue - startValue) / startValue) * 100 : 0;
|
|
220
|
+
const maxDrawdown = this.operationsService.calculateMaxDrawdown(history);
|
|
221
|
+
return {
|
|
222
|
+
start_value: startValue,
|
|
223
|
+
end_value: endValue,
|
|
224
|
+
total_return: Number(totalReturn.toFixed(2)),
|
|
225
|
+
max_drawdown: Number(maxDrawdown.toFixed(2))
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
// Batch data update for efficiency
|
|
229
|
+
async refreshDashboardCache(userId) {
|
|
230
|
+
try {
|
|
231
|
+
const dashboardData = await this.getDashboardData(userId);
|
|
232
|
+
// In a real implementation, you might cache this data in Redis
|
|
233
|
+
// or another fast storage system for quick retrieval
|
|
234
|
+
return {
|
|
235
|
+
status: 'refreshed',
|
|
236
|
+
timestamp: new Date().toISOString(),
|
|
237
|
+
data_points: {
|
|
238
|
+
conversations: dashboardData.conversations.total_sessions,
|
|
239
|
+
trading_operations: dashboardData.trading.total_trades,
|
|
240
|
+
portfolio_snapshots: dashboardData.portfolio ? 1 : 0,
|
|
241
|
+
agent_metrics: dashboardData.agents.length
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
throw new Error(`Failed to refresh dashboard cache: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
exports.BFFDataService = BFFDataService;
|
|
251
|
+
//# sourceMappingURL=bffDataService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bffDataService.js","sourceRoot":"","sources":["../src/bffDataService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ConversationSession, ConversationMessage, ConversationMetrics, MessageMetadata, AgentType, MessageSender, ConversationTrackerConfig } from './types';
|
|
2
|
+
export declare class ConversationTrackingService {
|
|
3
|
+
private supabase;
|
|
4
|
+
private logger;
|
|
5
|
+
private _config;
|
|
6
|
+
constructor(config: ConversationTrackerConfig);
|
|
7
|
+
startSession(userId: string, agentType: AgentType, metadata?: Record<string, any>, userAgent?: string, ipAddress?: string): Promise<string>;
|
|
8
|
+
endSession(sessionId: string): Promise<void>;
|
|
9
|
+
logMessage(sessionId: string, sender: MessageSender, content: string, metadata?: MessageMetadata): Promise<void>;
|
|
10
|
+
getConversationHistory(userId: string, agentType?: AgentType, limit?: number): Promise<ConversationSession[]>;
|
|
11
|
+
getActiveConversations(userId: string): Promise<ConversationSession[]>;
|
|
12
|
+
getConversationMetrics(userId: string, timeframe?: string): Promise<ConversationMetrics>;
|
|
13
|
+
getSessionMessages(sessionId: string, limit?: number): Promise<ConversationMessage[]>;
|
|
14
|
+
private getSession;
|
|
15
|
+
private getMessageCount;
|
|
16
|
+
private parseTimeframe;
|
|
17
|
+
private getMostUsedAgent;
|
|
18
|
+
cleanupOldSessions(daysOld?: number): Promise<number>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=conversationService.d.ts.map
|