@stackmemoryai/stackmemory 0.2.4 → 0.2.6
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/README.md +108 -0
- package/dist/index.js +382 -0
- package/dist/src/analytics/api/analytics-api.d.ts +24 -0
- package/dist/src/analytics/api/analytics-api.d.ts.map +1 -0
- package/dist/src/analytics/api/analytics-api.js +279 -0
- package/dist/src/analytics/api/analytics-api.js.map +1 -0
- package/dist/src/analytics/core/analytics-service.d.ts +23 -0
- package/dist/src/analytics/core/analytics-service.d.ts.map +1 -0
- package/dist/src/analytics/core/analytics-service.js +160 -0
- package/dist/src/analytics/core/analytics-service.js.map +1 -0
- package/dist/src/analytics/index.d.ts +12 -0
- package/dist/src/analytics/index.d.ts.map +1 -0
- package/dist/src/analytics/index.js +11 -0
- package/dist/src/analytics/index.js.map +1 -0
- package/dist/src/analytics/queries/metrics-queries.d.ts +11 -0
- package/dist/src/analytics/queries/metrics-queries.d.ts.map +1 -0
- package/dist/src/analytics/queries/metrics-queries.js +179 -0
- package/dist/src/analytics/queries/metrics-queries.js.map +1 -0
- package/dist/src/analytics/types/metrics.d.ts +60 -0
- package/dist/src/analytics/types/metrics.d.ts.map +1 -0
- package/dist/src/analytics/types/metrics.js +2 -0
- package/dist/src/analytics/types/metrics.js.map +1 -0
- package/dist/src/cli/analytics-viewer.d.ts +3 -0
- package/dist/src/cli/analytics-viewer.d.ts.map +1 -0
- package/dist/src/cli/analytics-viewer.js +89 -0
- package/dist/src/cli/analytics-viewer.js.map +1 -0
- package/dist/src/cli/browser-test.d.ts +6 -0
- package/dist/src/cli/browser-test.d.ts.map +1 -0
- package/dist/src/cli/browser-test.js +32 -0
- package/dist/src/cli/browser-test.js.map +1 -0
- package/dist/src/cli/cli.js +157 -0
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/commands/projects.d.ts +8 -0
- package/dist/src/cli/commands/projects.d.ts.map +1 -0
- package/dist/src/cli/commands/projects.js +220 -0
- package/dist/src/cli/commands/projects.js.map +1 -0
- package/dist/src/cli/index.d.ts +7 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +704 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/project-commands.d.ts +8 -0
- package/dist/src/cli/project-commands.d.ts.map +1 -0
- package/dist/src/cli/project-commands.js +212 -0
- package/dist/src/cli/project-commands.js.map +1 -0
- package/dist/src/cli/utils/viewer.d.ts +3 -0
- package/dist/src/cli/utils/viewer.d.ts.map +1 -0
- package/dist/src/cli/utils/viewer.js +89 -0
- package/dist/src/cli/utils/viewer.js.map +1 -0
- package/dist/src/core/context/frame-manager.d.ts +106 -0
- package/dist/src/core/context/frame-manager.d.ts.map +1 -0
- package/dist/src/core/context/frame-manager.js +387 -0
- package/dist/src/core/context/frame-manager.js.map +1 -0
- package/dist/src/core/logger.test.js +1 -1
- package/dist/src/core/logger.test.js.map +1 -1
- package/dist/src/core/monitoring/error-handler.d.ts +46 -0
- package/dist/src/core/monitoring/error-handler.d.ts.map +1 -0
- package/dist/src/core/monitoring/error-handler.js +212 -0
- package/dist/src/core/monitoring/error-handler.js.map +1 -0
- package/dist/src/core/monitoring/logger.d.ts +24 -0
- package/dist/src/core/monitoring/logger.d.ts.map +1 -0
- package/dist/src/core/monitoring/logger.js +121 -0
- package/dist/src/core/monitoring/logger.js.map +1 -0
- package/dist/src/core/monitoring/metrics.d.ts +7 -0
- package/dist/src/core/monitoring/metrics.d.ts.map +1 -0
- package/dist/src/core/monitoring/metrics.js +13 -0
- package/dist/src/core/monitoring/metrics.js.map +1 -0
- package/dist/src/core/monitoring/progress-tracker.d.ts +95 -0
- package/dist/src/core/monitoring/progress-tracker.d.ts.map +1 -0
- package/dist/src/core/monitoring/progress-tracker.js +178 -0
- package/dist/src/core/monitoring/progress-tracker.js.map +1 -0
- package/dist/src/core/project-manager.d.ts +130 -0
- package/dist/src/core/project-manager.d.ts.map +1 -0
- package/dist/src/core/project-manager.js +582 -0
- package/dist/src/core/project-manager.js.map +1 -0
- package/dist/src/core/projects/project-manager.d.ts +130 -0
- package/dist/src/core/projects/project-manager.d.ts.map +1 -0
- package/dist/src/core/projects/project-manager.js +591 -0
- package/dist/src/core/projects/project-manager.js.map +1 -0
- package/dist/src/core/utils/update-checker.d.ts +38 -0
- package/dist/src/core/utils/update-checker.d.ts.map +1 -0
- package/dist/src/core/utils/update-checker.js +156 -0
- package/dist/src/core/utils/update-checker.js.map +1 -0
- package/dist/src/features/analytics/api/analytics-api.d.ts +24 -0
- package/dist/src/features/analytics/api/analytics-api.d.ts.map +1 -0
- package/dist/src/features/analytics/api/analytics-api.js +289 -0
- package/dist/src/features/analytics/api/analytics-api.js.map +1 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts +23 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -0
- package/dist/src/features/analytics/core/analytics-service.js +160 -0
- package/dist/src/features/analytics/core/analytics-service.js.map +1 -0
- package/dist/src/features/analytics/index.d.ts +12 -0
- package/dist/src/features/analytics/index.d.ts.map +1 -0
- package/dist/src/features/analytics/index.js +11 -0
- package/dist/src/features/analytics/index.js.map +1 -0
- package/dist/src/features/analytics/queries/metrics-queries.d.ts +11 -0
- package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -0
- package/dist/src/features/analytics/queries/metrics-queries.js +183 -0
- package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -0
- package/dist/src/features/analytics/types/metrics.d.ts +60 -0
- package/dist/src/features/analytics/types/metrics.d.ts.map +1 -0
- package/dist/src/features/analytics/types/metrics.js +2 -0
- package/dist/src/features/analytics/types/metrics.js.map +1 -0
- package/dist/src/features/browser/browser-mcp.d.ts +94 -0
- package/dist/src/features/browser/browser-mcp.d.ts.map +1 -0
- package/dist/src/features/browser/browser-mcp.js +456 -0
- package/dist/src/features/browser/browser-mcp.js.map +1 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts +117 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -0
- package/dist/src/features/tasks/pebbles-task-store.js +335 -0
- package/dist/src/features/tasks/pebbles-task-store.js.map +1 -0
- package/dist/src/features/tasks/task-aware-context.d.ts +103 -0
- package/dist/src/features/tasks/task-aware-context.d.ts.map +1 -0
- package/dist/src/features/tasks/task-aware-context.js +412 -0
- package/dist/src/features/tasks/task-aware-context.js.map +1 -0
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/integrations/browser-mcp.d.ts +94 -0
- package/dist/src/integrations/browser-mcp.d.ts.map +1 -0
- package/dist/src/integrations/browser-mcp.js +431 -0
- package/dist/src/integrations/browser-mcp.js.map +1 -0
- package/dist/src/integrations/linear/auth.d.ts +99 -0
- package/dist/src/integrations/linear/auth.d.ts.map +1 -0
- package/dist/src/integrations/linear/auth.js +319 -0
- package/dist/src/integrations/linear/auth.js.map +1 -0
- package/dist/src/integrations/linear/auto-sync.d.ts +77 -0
- package/dist/src/integrations/linear/auto-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear/auto-sync.js +268 -0
- package/dist/src/integrations/linear/auto-sync.js.map +1 -0
- package/dist/src/integrations/linear/client.d.ts +86 -0
- package/dist/src/integrations/linear/client.d.ts.map +1 -0
- package/dist/src/integrations/linear/client.js +277 -0
- package/dist/src/integrations/linear/client.js.map +1 -0
- package/dist/src/integrations/linear/config.d.ts +51 -0
- package/dist/src/integrations/linear/config.d.ts.map +1 -0
- package/dist/src/integrations/linear/config.js +103 -0
- package/dist/src/integrations/linear/config.js.map +1 -0
- package/dist/src/integrations/linear/sync.d.ts +97 -0
- package/dist/src/integrations/linear/sync.d.ts.map +1 -0
- package/dist/src/integrations/linear/sync.js +391 -0
- package/dist/src/integrations/linear/sync.js.map +1 -0
- package/dist/src/integrations/mcp/server.d.ts +40 -0
- package/dist/src/integrations/mcp/server.d.ts.map +1 -0
- package/dist/src/integrations/mcp/server.js +828 -0
- package/dist/src/integrations/mcp/server.js.map +1 -0
- package/dist/src/mcp/mcp-server.d.ts +1 -0
- package/dist/src/mcp/mcp-server.d.ts.map +1 -1
- package/dist/src/mcp/mcp-server.js +11 -0
- package/dist/src/mcp/mcp-server.js.map +1 -1
- package/dist/src/railway/index.d.ts +7 -0
- package/dist/src/railway/index.d.ts.map +1 -0
- package/dist/src/railway/index.js +401 -0
- package/dist/src/railway/index.js.map +1 -0
- package/dist/src/runway/auth/auth-middleware.d.ts +66 -0
- package/dist/src/runway/auth/auth-middleware.d.ts.map +1 -0
- package/dist/src/runway/auth/auth-middleware.js +337 -0
- package/dist/src/runway/auth/auth-middleware.js.map +1 -0
- package/dist/src/runway/server/runway-mcp-server.d.ts +46 -0
- package/dist/src/runway/server/runway-mcp-server.d.ts.map +1 -0
- package/dist/src/runway/server/runway-mcp-server.js +601 -0
- package/dist/src/runway/server/runway-mcp-server.js.map +1 -0
- package/dist/src/runway.bak/auth/auth-middleware.d.ts +66 -0
- package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +1 -0
- package/dist/src/runway.bak/auth/auth-middleware.js +337 -0
- package/dist/src/runway.bak/auth/auth-middleware.js.map +1 -0
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts +46 -0
- package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +1 -0
- package/dist/src/runway.bak/server/runway-mcp-server.js +601 -0
- package/dist/src/runway.bak/server/runway-mcp-server.js.map +1 -0
- package/dist/src/servers/production/auth-middleware.d.ts +66 -0
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -0
- package/dist/src/servers/production/auth-middleware.js +346 -0
- package/dist/src/servers/production/auth-middleware.js.map +1 -0
- package/dist/src/servers/railway/index.d.ts +7 -0
- package/dist/src/servers/railway/index.d.ts.map +1 -0
- package/dist/src/servers/railway/index.js +401 -0
- package/dist/src/servers/railway/index.js.map +1 -0
- package/package.json +27 -5
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { AnalyticsService } from '../core/analytics-service.js';
|
|
3
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
4
|
+
export class AnalyticsAPI {
|
|
5
|
+
router;
|
|
6
|
+
analyticsService;
|
|
7
|
+
wss;
|
|
8
|
+
constructor(projectPath) {
|
|
9
|
+
this.router = express.Router();
|
|
10
|
+
this.analyticsService = new AnalyticsService(projectPath);
|
|
11
|
+
this.setupRoutes();
|
|
12
|
+
}
|
|
13
|
+
setupRoutes() {
|
|
14
|
+
this.router.use(express.json());
|
|
15
|
+
this.router.get('/metrics', this.getMetrics.bind(this));
|
|
16
|
+
this.router.get('/tasks', this.getTasks.bind(this));
|
|
17
|
+
this.router.get('/team/:userId', this.getTeamMetrics.bind(this));
|
|
18
|
+
this.router.post('/tasks', this.addTask.bind(this));
|
|
19
|
+
this.router.put('/tasks/:taskId', this.updateTask.bind(this));
|
|
20
|
+
this.router.post('/sync', this.syncLinear.bind(this));
|
|
21
|
+
this.router.get('/export', this.exportMetrics.bind(this));
|
|
22
|
+
}
|
|
23
|
+
async getMetrics(req, res) {
|
|
24
|
+
try {
|
|
25
|
+
const query = this.parseQuery(req.query);
|
|
26
|
+
const dashboardState = await this.analyticsService.getDashboardState(query);
|
|
27
|
+
res.json({
|
|
28
|
+
success: true,
|
|
29
|
+
data: {
|
|
30
|
+
metrics: dashboardState.metrics,
|
|
31
|
+
lastUpdated: dashboardState.lastUpdated
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
this.handleError(res, error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async getTasks(req, res) {
|
|
40
|
+
try {
|
|
41
|
+
const query = this.parseQuery(req.query);
|
|
42
|
+
const dashboardState = await this.analyticsService.getDashboardState(query);
|
|
43
|
+
res.json({
|
|
44
|
+
success: true,
|
|
45
|
+
data: {
|
|
46
|
+
tasks: dashboardState.recentTasks,
|
|
47
|
+
total: dashboardState.metrics.totalTasks
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
this.handleError(res, error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async getTeamMetrics(req, res) {
|
|
56
|
+
try {
|
|
57
|
+
const { userId } = req.params;
|
|
58
|
+
const query = this.parseQuery(req.query);
|
|
59
|
+
if (userId === 'all') {
|
|
60
|
+
const dashboardState = await this.analyticsService.getDashboardState(query);
|
|
61
|
+
res.json({
|
|
62
|
+
success: true,
|
|
63
|
+
data: dashboardState.teamMetrics
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const dashboardState = await this.analyticsService.getDashboardState({
|
|
68
|
+
...query,
|
|
69
|
+
userIds: [userId]
|
|
70
|
+
});
|
|
71
|
+
const userMetrics = dashboardState.teamMetrics.find(m => m.userId === userId);
|
|
72
|
+
if (!userMetrics) {
|
|
73
|
+
res.status(404).json({
|
|
74
|
+
success: false,
|
|
75
|
+
error: 'User metrics not found'
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
res.json({
|
|
80
|
+
success: true,
|
|
81
|
+
data: userMetrics
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.handleError(res, error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async addTask(req, res) {
|
|
90
|
+
try {
|
|
91
|
+
const task = {
|
|
92
|
+
...req.body,
|
|
93
|
+
createdAt: new Date(req.body.createdAt || Date.now()),
|
|
94
|
+
completedAt: req.body.completedAt ? new Date(req.body.completedAt) : undefined
|
|
95
|
+
};
|
|
96
|
+
await this.analyticsService.addTask(task);
|
|
97
|
+
res.status(201).json({
|
|
98
|
+
success: true,
|
|
99
|
+
message: 'Task added successfully'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
this.handleError(res, error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async updateTask(req, res) {
|
|
107
|
+
try {
|
|
108
|
+
const { taskId } = req.params;
|
|
109
|
+
const updates = req.body;
|
|
110
|
+
if (updates.completedAt) {
|
|
111
|
+
updates.completedAt = new Date(updates.completedAt);
|
|
112
|
+
}
|
|
113
|
+
await this.analyticsService.updateTask(taskId, updates);
|
|
114
|
+
res.json({
|
|
115
|
+
success: true,
|
|
116
|
+
message: 'Task updated successfully'
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
this.handleError(res, error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async syncLinear(req, res) {
|
|
124
|
+
try {
|
|
125
|
+
await this.analyticsService.syncLinearTasks();
|
|
126
|
+
res.json({
|
|
127
|
+
success: true,
|
|
128
|
+
message: 'Linear tasks synced successfully'
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
this.handleError(res, error);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async exportMetrics(req, res) {
|
|
136
|
+
try {
|
|
137
|
+
const query = this.parseQuery(req.query);
|
|
138
|
+
const format = req.query.format || 'json';
|
|
139
|
+
const dashboardState = await this.analyticsService.getDashboardState(query);
|
|
140
|
+
if (format === 'csv') {
|
|
141
|
+
const csv = this.convertToCSV(dashboardState);
|
|
142
|
+
res.setHeader('Content-Type', 'text/csv');
|
|
143
|
+
res.setHeader('Content-Disposition', 'attachment; filename="analytics-export.csv"');
|
|
144
|
+
res.send(csv);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
res.json({
|
|
148
|
+
success: true,
|
|
149
|
+
data: dashboardState
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
this.handleError(res, error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
parseQuery(query) {
|
|
158
|
+
const result = {};
|
|
159
|
+
if (query.start && query.end) {
|
|
160
|
+
result.timeRange = {
|
|
161
|
+
start: new Date(query.start),
|
|
162
|
+
end: new Date(query.end),
|
|
163
|
+
preset: query.preset
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
else if (query.preset) {
|
|
167
|
+
result.timeRange = this.getPresetTimeRange(query.preset);
|
|
168
|
+
}
|
|
169
|
+
if (query.users) {
|
|
170
|
+
result.userIds = Array.isArray(query.users) ? query.users : [query.users];
|
|
171
|
+
}
|
|
172
|
+
if (query.states) {
|
|
173
|
+
result.states = Array.isArray(query.states) ? query.states : [query.states];
|
|
174
|
+
}
|
|
175
|
+
if (query.priorities) {
|
|
176
|
+
result.priorities = Array.isArray(query.priorities) ? query.priorities : [query.priorities];
|
|
177
|
+
}
|
|
178
|
+
if (query.labels) {
|
|
179
|
+
result.labels = Array.isArray(query.labels) ? query.labels : [query.labels];
|
|
180
|
+
}
|
|
181
|
+
if (query.limit) {
|
|
182
|
+
result.limit = parseInt(query.limit);
|
|
183
|
+
}
|
|
184
|
+
if (query.offset) {
|
|
185
|
+
result.offset = parseInt(query.offset);
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
getPresetTimeRange(preset) {
|
|
190
|
+
const end = new Date();
|
|
191
|
+
const start = new Date();
|
|
192
|
+
switch (preset) {
|
|
193
|
+
case 'today':
|
|
194
|
+
start.setHours(0, 0, 0, 0);
|
|
195
|
+
break;
|
|
196
|
+
case '7d':
|
|
197
|
+
start.setDate(start.getDate() - 7);
|
|
198
|
+
break;
|
|
199
|
+
case '30d':
|
|
200
|
+
start.setDate(start.getDate() - 30);
|
|
201
|
+
break;
|
|
202
|
+
case '90d':
|
|
203
|
+
start.setDate(start.getDate() - 90);
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
start.setDate(start.getDate() - 7);
|
|
207
|
+
}
|
|
208
|
+
return { start, end, preset: preset };
|
|
209
|
+
}
|
|
210
|
+
convertToCSV(dashboardState) {
|
|
211
|
+
const tasks = dashboardState.recentTasks;
|
|
212
|
+
if (!tasks || tasks.length === 0)
|
|
213
|
+
return 'No data';
|
|
214
|
+
const headers = Object.keys(tasks[0]).join(',');
|
|
215
|
+
const rows = tasks.map((task) => Object.values(task).map(v => typeof v === 'object' ? JSON.stringify(v) : v).join(','));
|
|
216
|
+
return [headers, ...rows].join('\n');
|
|
217
|
+
}
|
|
218
|
+
handleError(res, error) {
|
|
219
|
+
console.error('Analytics API error:', error);
|
|
220
|
+
res.status(500).json({
|
|
221
|
+
success: false,
|
|
222
|
+
error: error.message || 'Internal server error'
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
setupWebSocket(server) {
|
|
226
|
+
this.wss = new WebSocketServer({
|
|
227
|
+
server,
|
|
228
|
+
path: '/ws/analytics'
|
|
229
|
+
});
|
|
230
|
+
this.wss.on('connection', (ws) => {
|
|
231
|
+
console.log('WebSocket client connected to analytics');
|
|
232
|
+
const unsubscribe = this.analyticsService.subscribeToUpdates((state) => {
|
|
233
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
234
|
+
ws.send(JSON.stringify({
|
|
235
|
+
type: 'update',
|
|
236
|
+
data: state
|
|
237
|
+
}));
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
ws.on('message', async (message) => {
|
|
241
|
+
try {
|
|
242
|
+
const data = JSON.parse(message);
|
|
243
|
+
if (data.type === 'subscribe') {
|
|
244
|
+
const query = this.parseQuery(data.query || {});
|
|
245
|
+
const state = await this.analyticsService.getDashboardState(query);
|
|
246
|
+
ws.send(JSON.stringify({
|
|
247
|
+
type: 'initial',
|
|
248
|
+
data: state
|
|
249
|
+
}));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
ws.send(JSON.stringify({
|
|
254
|
+
type: 'error',
|
|
255
|
+
error: 'Invalid message format'
|
|
256
|
+
}));
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
ws.on('close', () => {
|
|
260
|
+
unsubscribe();
|
|
261
|
+
console.log('WebSocket client disconnected');
|
|
262
|
+
});
|
|
263
|
+
ws.on('error', (error) => {
|
|
264
|
+
console.error('WebSocket error:', error);
|
|
265
|
+
unsubscribe();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
getRouter() {
|
|
270
|
+
return this.router;
|
|
271
|
+
}
|
|
272
|
+
close() {
|
|
273
|
+
this.analyticsService.close();
|
|
274
|
+
if (this.wss) {
|
|
275
|
+
this.wss.close();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=analytics-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-api.js","sourceRoot":"","sources":["../../../../src/analytics/api/analytics-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { TaskAnalytics, DashboardState, AnalyticsQuery } from '../types/metrics.js';
|
|
2
|
+
export declare class AnalyticsService {
|
|
3
|
+
private metricsQueries;
|
|
4
|
+
private linearClient?;
|
|
5
|
+
private dbPath;
|
|
6
|
+
private updateCallbacks;
|
|
7
|
+
constructor(projectPath?: string);
|
|
8
|
+
private ensureDirectoryExists;
|
|
9
|
+
private initializeLinearIntegration;
|
|
10
|
+
syncLinearTasks(): Promise<void>;
|
|
11
|
+
private mapLinearState;
|
|
12
|
+
private mapLinearPriority;
|
|
13
|
+
getDashboardState(query?: AnalyticsQuery): Promise<DashboardState>;
|
|
14
|
+
private getTeamMetrics;
|
|
15
|
+
private getUserName;
|
|
16
|
+
private getDefaultTimeRange;
|
|
17
|
+
subscribeToUpdates(callback: (state: DashboardState) => void): () => void;
|
|
18
|
+
private notifyUpdate;
|
|
19
|
+
addTask(task: TaskAnalytics): Promise<void>;
|
|
20
|
+
updateTask(taskId: string, updates: Partial<TaskAnalytics>): Promise<void>;
|
|
21
|
+
close(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=analytics-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-service.d.ts","sourceRoot":"","sources":["../../../../src/analytics/core/analytics-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,aAAa,EACb,cAAc,EAEd,cAAc,EACf,MAAM,qBAAqB,CAAC;AAK7B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAmD;gBAE9D,WAAW,CAAC,EAAE,MAAM;IAYhC,OAAO,CAAC,qBAAqB;YAOf,2BAA2B;IAanC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IActC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAOnB,iBAAiB,CAAC,KAAK,GAAE,cAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;YA0B9D,cAAc;YA+Bd,WAAW;IAKzB,OAAO,CAAC,mBAAmB;IAY3B,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;YAQ3D,YAAY;IAKpB,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { MetricsQueries } from '../queries/metrics-queries.js';
|
|
2
|
+
import { LinearClient } from '../../integrations/linear-client.js';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import os from 'os';
|
|
6
|
+
export class AnalyticsService {
|
|
7
|
+
metricsQueries;
|
|
8
|
+
linearClient;
|
|
9
|
+
dbPath;
|
|
10
|
+
updateCallbacks = new Set();
|
|
11
|
+
constructor(projectPath) {
|
|
12
|
+
const basePath = projectPath || process.cwd();
|
|
13
|
+
this.dbPath = path.join(basePath, '.stackmemory', 'analytics.db');
|
|
14
|
+
this.ensureDirectoryExists();
|
|
15
|
+
this.metricsQueries = new MetricsQueries(this.dbPath);
|
|
16
|
+
if (process.env.LINEAR_API_KEY) {
|
|
17
|
+
this.initializeLinearIntegration();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
ensureDirectoryExists() {
|
|
21
|
+
const dir = path.dirname(this.dbPath);
|
|
22
|
+
if (!fs.existsSync(dir)) {
|
|
23
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async initializeLinearIntegration() {
|
|
27
|
+
try {
|
|
28
|
+
const configPath = path.join(os.homedir(), '.stackmemory', 'linear-config.json');
|
|
29
|
+
if (fs.existsSync(configPath)) {
|
|
30
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
31
|
+
this.linearClient = new LinearClient(config);
|
|
32
|
+
await this.syncLinearTasks();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error('Failed to initialize Linear integration:', error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async syncLinearTasks() {
|
|
40
|
+
if (!this.linearClient)
|
|
41
|
+
return;
|
|
42
|
+
try {
|
|
43
|
+
// For now, we'll stub this as LinearClient doesn't expose a public query method
|
|
44
|
+
// In a real implementation, we'd need to add a public method to LinearClient
|
|
45
|
+
// or use LinearSyncEngine from linear-sync.ts
|
|
46
|
+
console.log('Linear sync not fully implemented - LinearClient needs public query method');
|
|
47
|
+
await this.notifyUpdate();
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Failed to sync Linear tasks:', error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
mapLinearState(linearState) {
|
|
54
|
+
const stateMap = {
|
|
55
|
+
'backlog': 'todo',
|
|
56
|
+
'unstarted': 'todo',
|
|
57
|
+
'started': 'in_progress',
|
|
58
|
+
'completed': 'completed',
|
|
59
|
+
'done': 'completed',
|
|
60
|
+
'canceled': 'blocked'
|
|
61
|
+
};
|
|
62
|
+
return stateMap[linearState.toLowerCase()] || 'todo';
|
|
63
|
+
}
|
|
64
|
+
mapLinearPriority(priority) {
|
|
65
|
+
if (priority === 1)
|
|
66
|
+
return 'urgent';
|
|
67
|
+
if (priority === 2)
|
|
68
|
+
return 'high';
|
|
69
|
+
if (priority === 3)
|
|
70
|
+
return 'medium';
|
|
71
|
+
return 'low';
|
|
72
|
+
}
|
|
73
|
+
async getDashboardState(query = {}) {
|
|
74
|
+
const timeRange = query.timeRange || this.getDefaultTimeRange();
|
|
75
|
+
const metrics = this.metricsQueries.getTaskMetrics({
|
|
76
|
+
...query,
|
|
77
|
+
timeRange
|
|
78
|
+
});
|
|
79
|
+
const recentTasks = this.metricsQueries.getRecentTasks({
|
|
80
|
+
...query,
|
|
81
|
+
limit: 20
|
|
82
|
+
});
|
|
83
|
+
const teamMetrics = await this.getTeamMetrics(query);
|
|
84
|
+
return {
|
|
85
|
+
metrics,
|
|
86
|
+
teamMetrics,
|
|
87
|
+
recentTasks,
|
|
88
|
+
timeRange,
|
|
89
|
+
teamFilter: query.userIds || [],
|
|
90
|
+
isLive: this.updateCallbacks.size > 0,
|
|
91
|
+
lastUpdated: new Date()
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async getTeamMetrics(query) {
|
|
95
|
+
const uniqueUserIds = new Set();
|
|
96
|
+
const tasks = this.metricsQueries.getRecentTasks({ limit: 1000 });
|
|
97
|
+
tasks.forEach(task => {
|
|
98
|
+
if (task.assigneeId) {
|
|
99
|
+
uniqueUserIds.add(task.assigneeId);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
const teamMetrics = [];
|
|
103
|
+
const totalCompleted = tasks.filter(t => t.state === 'completed').length;
|
|
104
|
+
for (const userId of uniqueUserIds) {
|
|
105
|
+
const userQuery = { ...query, userIds: [userId] };
|
|
106
|
+
const individualMetrics = this.metricsQueries.getTaskMetrics(userQuery);
|
|
107
|
+
teamMetrics.push({
|
|
108
|
+
userId,
|
|
109
|
+
userName: await this.getUserName(userId),
|
|
110
|
+
individualMetrics,
|
|
111
|
+
contributionPercentage: totalCompleted > 0
|
|
112
|
+
? (individualMetrics.completedTasks / totalCompleted) * 100
|
|
113
|
+
: 0,
|
|
114
|
+
lastActive: new Date()
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return teamMetrics.sort((a, b) => b.contributionPercentage - a.contributionPercentage);
|
|
118
|
+
}
|
|
119
|
+
async getUserName(userId) {
|
|
120
|
+
// Stub for now - would need LinearClient to expose user query method
|
|
121
|
+
return userId;
|
|
122
|
+
}
|
|
123
|
+
getDefaultTimeRange() {
|
|
124
|
+
const end = new Date();
|
|
125
|
+
const start = new Date();
|
|
126
|
+
start.setDate(start.getDate() - 7);
|
|
127
|
+
return {
|
|
128
|
+
start,
|
|
129
|
+
end,
|
|
130
|
+
preset: '7d'
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
subscribeToUpdates(callback) {
|
|
134
|
+
this.updateCallbacks.add(callback);
|
|
135
|
+
return () => {
|
|
136
|
+
this.updateCallbacks.delete(callback);
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async notifyUpdate() {
|
|
140
|
+
const state = await this.getDashboardState();
|
|
141
|
+
this.updateCallbacks.forEach(callback => callback(state));
|
|
142
|
+
}
|
|
143
|
+
async addTask(task) {
|
|
144
|
+
this.metricsQueries.upsertTask(task);
|
|
145
|
+
await this.notifyUpdate();
|
|
146
|
+
}
|
|
147
|
+
async updateTask(taskId, updates) {
|
|
148
|
+
const tasks = this.metricsQueries.getRecentTasks({ limit: 1 });
|
|
149
|
+
const existingTask = tasks.find(t => t.id === taskId);
|
|
150
|
+
if (existingTask) {
|
|
151
|
+
const updatedTask = { ...existingTask, ...updates };
|
|
152
|
+
this.metricsQueries.upsertTask(updatedTask);
|
|
153
|
+
await this.notifyUpdate();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
close() {
|
|
157
|
+
this.metricsQueries.close();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=analytics-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-service.js","sourceRoot":"","sources":["../../../../src/analytics/core/analytics-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './types/metrics.js';
|
|
2
|
+
export * from './core/analytics-service.js';
|
|
3
|
+
export * from './api/analytics-api.js';
|
|
4
|
+
export * from './queries/metrics-queries.js';
|
|
5
|
+
import { AnalyticsService } from './core/analytics-service.js';
|
|
6
|
+
import { AnalyticsAPI } from './api/analytics-api.js';
|
|
7
|
+
declare const _default: {
|
|
8
|
+
AnalyticsService: typeof AnalyticsService;
|
|
9
|
+
AnalyticsAPI: typeof AnalyticsAPI;
|
|
10
|
+
};
|
|
11
|
+
export default _default;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;;;;;AAEtD,wBAGE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from './types/metrics.js';
|
|
2
|
+
export * from './core/analytics-service.js';
|
|
3
|
+
export * from './api/analytics-api.js';
|
|
4
|
+
export * from './queries/metrics-queries.js';
|
|
5
|
+
import { AnalyticsService } from './core/analytics-service.js';
|
|
6
|
+
import { AnalyticsAPI } from './api/analytics-api.js';
|
|
7
|
+
export default {
|
|
8
|
+
AnalyticsService,
|
|
9
|
+
AnalyticsAPI,
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,eAAe;IACb,gBAAgB;IAChB,YAAY;CACb,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TaskAnalytics, TaskMetrics, AnalyticsQuery } from '../types/metrics.js';
|
|
2
|
+
export declare class MetricsQueries {
|
|
3
|
+
private db;
|
|
4
|
+
constructor(dbPath: string);
|
|
5
|
+
private initializeTables;
|
|
6
|
+
getTaskMetrics(query?: AnalyticsQuery): TaskMetrics;
|
|
7
|
+
getRecentTasks(query?: AnalyticsQuery): TaskAnalytics[];
|
|
8
|
+
upsertTask(task: TaskAnalytics): void;
|
|
9
|
+
close(): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=metrics-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-queries.d.ts","sourceRoot":"","sources":["../../../../src/analytics/queries/metrics-queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAa,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE5F,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,EAAE,MAAM;IAK1B,OAAO,CAAC,gBAAgB;IAuBxB,cAAc,CAAC,KAAK,GAAE,cAAmB,GAAG,WAAW;IAsFvD,cAAc,CAAC,KAAK,GAAE,cAAmB,GAAG,aAAa,EAAE;IAsC3D,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAuCrC,KAAK,IAAI,IAAI;CAGd"}
|