@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.
@@ -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":"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"}
@@ -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