@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.
Files changed (179) hide show
  1. package/README.md +108 -0
  2. package/dist/index.js +382 -0
  3. package/dist/src/analytics/api/analytics-api.d.ts +24 -0
  4. package/dist/src/analytics/api/analytics-api.d.ts.map +1 -0
  5. package/dist/src/analytics/api/analytics-api.js +279 -0
  6. package/dist/src/analytics/api/analytics-api.js.map +1 -0
  7. package/dist/src/analytics/core/analytics-service.d.ts +23 -0
  8. package/dist/src/analytics/core/analytics-service.d.ts.map +1 -0
  9. package/dist/src/analytics/core/analytics-service.js +160 -0
  10. package/dist/src/analytics/core/analytics-service.js.map +1 -0
  11. package/dist/src/analytics/index.d.ts +12 -0
  12. package/dist/src/analytics/index.d.ts.map +1 -0
  13. package/dist/src/analytics/index.js +11 -0
  14. package/dist/src/analytics/index.js.map +1 -0
  15. package/dist/src/analytics/queries/metrics-queries.d.ts +11 -0
  16. package/dist/src/analytics/queries/metrics-queries.d.ts.map +1 -0
  17. package/dist/src/analytics/queries/metrics-queries.js +179 -0
  18. package/dist/src/analytics/queries/metrics-queries.js.map +1 -0
  19. package/dist/src/analytics/types/metrics.d.ts +60 -0
  20. package/dist/src/analytics/types/metrics.d.ts.map +1 -0
  21. package/dist/src/analytics/types/metrics.js +2 -0
  22. package/dist/src/analytics/types/metrics.js.map +1 -0
  23. package/dist/src/cli/analytics-viewer.d.ts +3 -0
  24. package/dist/src/cli/analytics-viewer.d.ts.map +1 -0
  25. package/dist/src/cli/analytics-viewer.js +89 -0
  26. package/dist/src/cli/analytics-viewer.js.map +1 -0
  27. package/dist/src/cli/browser-test.d.ts +6 -0
  28. package/dist/src/cli/browser-test.d.ts.map +1 -0
  29. package/dist/src/cli/browser-test.js +32 -0
  30. package/dist/src/cli/browser-test.js.map +1 -0
  31. package/dist/src/cli/cli.js +157 -0
  32. package/dist/src/cli/cli.js.map +1 -1
  33. package/dist/src/cli/commands/projects.d.ts +8 -0
  34. package/dist/src/cli/commands/projects.d.ts.map +1 -0
  35. package/dist/src/cli/commands/projects.js +220 -0
  36. package/dist/src/cli/commands/projects.js.map +1 -0
  37. package/dist/src/cli/index.d.ts +7 -0
  38. package/dist/src/cli/index.d.ts.map +1 -0
  39. package/dist/src/cli/index.js +704 -0
  40. package/dist/src/cli/index.js.map +1 -0
  41. package/dist/src/cli/project-commands.d.ts +8 -0
  42. package/dist/src/cli/project-commands.d.ts.map +1 -0
  43. package/dist/src/cli/project-commands.js +212 -0
  44. package/dist/src/cli/project-commands.js.map +1 -0
  45. package/dist/src/cli/utils/viewer.d.ts +3 -0
  46. package/dist/src/cli/utils/viewer.d.ts.map +1 -0
  47. package/dist/src/cli/utils/viewer.js +89 -0
  48. package/dist/src/cli/utils/viewer.js.map +1 -0
  49. package/dist/src/core/context/frame-manager.d.ts +106 -0
  50. package/dist/src/core/context/frame-manager.d.ts.map +1 -0
  51. package/dist/src/core/context/frame-manager.js +387 -0
  52. package/dist/src/core/context/frame-manager.js.map +1 -0
  53. package/dist/src/core/logger.test.js +1 -1
  54. package/dist/src/core/logger.test.js.map +1 -1
  55. package/dist/src/core/monitoring/error-handler.d.ts +46 -0
  56. package/dist/src/core/monitoring/error-handler.d.ts.map +1 -0
  57. package/dist/src/core/monitoring/error-handler.js +212 -0
  58. package/dist/src/core/monitoring/error-handler.js.map +1 -0
  59. package/dist/src/core/monitoring/logger.d.ts +24 -0
  60. package/dist/src/core/monitoring/logger.d.ts.map +1 -0
  61. package/dist/src/core/monitoring/logger.js +121 -0
  62. package/dist/src/core/monitoring/logger.js.map +1 -0
  63. package/dist/src/core/monitoring/metrics.d.ts +7 -0
  64. package/dist/src/core/monitoring/metrics.d.ts.map +1 -0
  65. package/dist/src/core/monitoring/metrics.js +13 -0
  66. package/dist/src/core/monitoring/metrics.js.map +1 -0
  67. package/dist/src/core/monitoring/progress-tracker.d.ts +95 -0
  68. package/dist/src/core/monitoring/progress-tracker.d.ts.map +1 -0
  69. package/dist/src/core/monitoring/progress-tracker.js +178 -0
  70. package/dist/src/core/monitoring/progress-tracker.js.map +1 -0
  71. package/dist/src/core/project-manager.d.ts +130 -0
  72. package/dist/src/core/project-manager.d.ts.map +1 -0
  73. package/dist/src/core/project-manager.js +582 -0
  74. package/dist/src/core/project-manager.js.map +1 -0
  75. package/dist/src/core/projects/project-manager.d.ts +130 -0
  76. package/dist/src/core/projects/project-manager.d.ts.map +1 -0
  77. package/dist/src/core/projects/project-manager.js +591 -0
  78. package/dist/src/core/projects/project-manager.js.map +1 -0
  79. package/dist/src/core/utils/update-checker.d.ts +38 -0
  80. package/dist/src/core/utils/update-checker.d.ts.map +1 -0
  81. package/dist/src/core/utils/update-checker.js +156 -0
  82. package/dist/src/core/utils/update-checker.js.map +1 -0
  83. package/dist/src/features/analytics/api/analytics-api.d.ts +24 -0
  84. package/dist/src/features/analytics/api/analytics-api.d.ts.map +1 -0
  85. package/dist/src/features/analytics/api/analytics-api.js +289 -0
  86. package/dist/src/features/analytics/api/analytics-api.js.map +1 -0
  87. package/dist/src/features/analytics/core/analytics-service.d.ts +23 -0
  88. package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -0
  89. package/dist/src/features/analytics/core/analytics-service.js +160 -0
  90. package/dist/src/features/analytics/core/analytics-service.js.map +1 -0
  91. package/dist/src/features/analytics/index.d.ts +12 -0
  92. package/dist/src/features/analytics/index.d.ts.map +1 -0
  93. package/dist/src/features/analytics/index.js +11 -0
  94. package/dist/src/features/analytics/index.js.map +1 -0
  95. package/dist/src/features/analytics/queries/metrics-queries.d.ts +11 -0
  96. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -0
  97. package/dist/src/features/analytics/queries/metrics-queries.js +183 -0
  98. package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -0
  99. package/dist/src/features/analytics/types/metrics.d.ts +60 -0
  100. package/dist/src/features/analytics/types/metrics.d.ts.map +1 -0
  101. package/dist/src/features/analytics/types/metrics.js +2 -0
  102. package/dist/src/features/analytics/types/metrics.js.map +1 -0
  103. package/dist/src/features/browser/browser-mcp.d.ts +94 -0
  104. package/dist/src/features/browser/browser-mcp.d.ts.map +1 -0
  105. package/dist/src/features/browser/browser-mcp.js +456 -0
  106. package/dist/src/features/browser/browser-mcp.js.map +1 -0
  107. package/dist/src/features/tasks/pebbles-task-store.d.ts +117 -0
  108. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -0
  109. package/dist/src/features/tasks/pebbles-task-store.js +335 -0
  110. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -0
  111. package/dist/src/features/tasks/task-aware-context.d.ts +103 -0
  112. package/dist/src/features/tasks/task-aware-context.d.ts.map +1 -0
  113. package/dist/src/features/tasks/task-aware-context.js +412 -0
  114. package/dist/src/features/tasks/task-aware-context.js.map +1 -0
  115. package/dist/src/index.d.ts +4 -4
  116. package/dist/src/index.d.ts.map +1 -1
  117. package/dist/src/index.js +4 -4
  118. package/dist/src/index.js.map +1 -1
  119. package/dist/src/integrations/browser-mcp.d.ts +94 -0
  120. package/dist/src/integrations/browser-mcp.d.ts.map +1 -0
  121. package/dist/src/integrations/browser-mcp.js +431 -0
  122. package/dist/src/integrations/browser-mcp.js.map +1 -0
  123. package/dist/src/integrations/linear/auth.d.ts +99 -0
  124. package/dist/src/integrations/linear/auth.d.ts.map +1 -0
  125. package/dist/src/integrations/linear/auth.js +319 -0
  126. package/dist/src/integrations/linear/auth.js.map +1 -0
  127. package/dist/src/integrations/linear/auto-sync.d.ts +77 -0
  128. package/dist/src/integrations/linear/auto-sync.d.ts.map +1 -0
  129. package/dist/src/integrations/linear/auto-sync.js +268 -0
  130. package/dist/src/integrations/linear/auto-sync.js.map +1 -0
  131. package/dist/src/integrations/linear/client.d.ts +86 -0
  132. package/dist/src/integrations/linear/client.d.ts.map +1 -0
  133. package/dist/src/integrations/linear/client.js +277 -0
  134. package/dist/src/integrations/linear/client.js.map +1 -0
  135. package/dist/src/integrations/linear/config.d.ts +51 -0
  136. package/dist/src/integrations/linear/config.d.ts.map +1 -0
  137. package/dist/src/integrations/linear/config.js +103 -0
  138. package/dist/src/integrations/linear/config.js.map +1 -0
  139. package/dist/src/integrations/linear/sync.d.ts +97 -0
  140. package/dist/src/integrations/linear/sync.d.ts.map +1 -0
  141. package/dist/src/integrations/linear/sync.js +391 -0
  142. package/dist/src/integrations/linear/sync.js.map +1 -0
  143. package/dist/src/integrations/mcp/server.d.ts +40 -0
  144. package/dist/src/integrations/mcp/server.d.ts.map +1 -0
  145. package/dist/src/integrations/mcp/server.js +828 -0
  146. package/dist/src/integrations/mcp/server.js.map +1 -0
  147. package/dist/src/mcp/mcp-server.d.ts +1 -0
  148. package/dist/src/mcp/mcp-server.d.ts.map +1 -1
  149. package/dist/src/mcp/mcp-server.js +11 -0
  150. package/dist/src/mcp/mcp-server.js.map +1 -1
  151. package/dist/src/railway/index.d.ts +7 -0
  152. package/dist/src/railway/index.d.ts.map +1 -0
  153. package/dist/src/railway/index.js +401 -0
  154. package/dist/src/railway/index.js.map +1 -0
  155. package/dist/src/runway/auth/auth-middleware.d.ts +66 -0
  156. package/dist/src/runway/auth/auth-middleware.d.ts.map +1 -0
  157. package/dist/src/runway/auth/auth-middleware.js +337 -0
  158. package/dist/src/runway/auth/auth-middleware.js.map +1 -0
  159. package/dist/src/runway/server/runway-mcp-server.d.ts +46 -0
  160. package/dist/src/runway/server/runway-mcp-server.d.ts.map +1 -0
  161. package/dist/src/runway/server/runway-mcp-server.js +601 -0
  162. package/dist/src/runway/server/runway-mcp-server.js.map +1 -0
  163. package/dist/src/runway.bak/auth/auth-middleware.d.ts +66 -0
  164. package/dist/src/runway.bak/auth/auth-middleware.d.ts.map +1 -0
  165. package/dist/src/runway.bak/auth/auth-middleware.js +337 -0
  166. package/dist/src/runway.bak/auth/auth-middleware.js.map +1 -0
  167. package/dist/src/runway.bak/server/runway-mcp-server.d.ts +46 -0
  168. package/dist/src/runway.bak/server/runway-mcp-server.d.ts.map +1 -0
  169. package/dist/src/runway.bak/server/runway-mcp-server.js +601 -0
  170. package/dist/src/runway.bak/server/runway-mcp-server.js.map +1 -0
  171. package/dist/src/servers/production/auth-middleware.d.ts +66 -0
  172. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -0
  173. package/dist/src/servers/production/auth-middleware.js +346 -0
  174. package/dist/src/servers/production/auth-middleware.js.map +1 -0
  175. package/dist/src/servers/railway/index.d.ts +7 -0
  176. package/dist/src/servers/railway/index.d.ts.map +1 -0
  177. package/dist/src/servers/railway/index.js +401 -0
  178. package/dist/src/servers/railway/index.js.map +1 -0
  179. package/package.json +27 -5
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Update checker for StackMemory
3
+ * Checks npm registry for newer versions
4
+ */
5
+ import { execSync } from 'child_process';
6
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { homedir } from 'os';
9
+ import { logger } from '../monitoring/logger.js';
10
+ export class UpdateChecker {
11
+ static CACHE_FILE = join(homedir(), '.stackmemory', 'update-check.json');
12
+ static CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
13
+ static PACKAGE_NAME = '@stackmemoryai/stackmemory';
14
+ /**
15
+ * Check for updates and display notification if needed
16
+ */
17
+ static async checkForUpdates(currentVersion, silent = false) {
18
+ try {
19
+ // Check cache first
20
+ const cache = this.loadCache();
21
+ const now = Date.now();
22
+ // Skip check if we checked recently
23
+ if (cache && now - cache.lastChecked < this.CHECK_INTERVAL) {
24
+ if (!silent &&
25
+ cache.latestVersion &&
26
+ cache.latestVersion !== currentVersion) {
27
+ this.displayUpdateNotification(currentVersion, cache.latestVersion);
28
+ }
29
+ return;
30
+ }
31
+ // Fetch latest version from npm
32
+ const latestVersion = await this.fetchLatestVersion();
33
+ // Update cache
34
+ this.saveCache({
35
+ lastChecked: now,
36
+ latestVersion,
37
+ currentVersion,
38
+ });
39
+ // Display notification if update available
40
+ if (!silent &&
41
+ latestVersion &&
42
+ this.isNewerVersion(currentVersion, latestVersion)) {
43
+ this.displayUpdateNotification(currentVersion, latestVersion);
44
+ }
45
+ }
46
+ catch (error) {
47
+ // Silently fail - don't interrupt user workflow
48
+ logger.debug('Update check failed:', { error: error.message });
49
+ }
50
+ }
51
+ /**
52
+ * Fetch latest version from npm registry
53
+ */
54
+ static async fetchLatestVersion() {
55
+ try {
56
+ const output = execSync(`npm view ${this.PACKAGE_NAME} version`, {
57
+ encoding: 'utf-8',
58
+ stdio: ['pipe', 'pipe', 'ignore'],
59
+ }).trim();
60
+ return output;
61
+ }
62
+ catch (error) {
63
+ logger.debug('Failed to fetch latest version:', {
64
+ error: error.message,
65
+ });
66
+ return '';
67
+ }
68
+ }
69
+ /**
70
+ * Compare version strings
71
+ */
72
+ static isNewerVersion(current, latest) {
73
+ const currentParts = current.split('.').map(Number);
74
+ const latestParts = latest.split('.').map(Number);
75
+ for (let i = 0; i < 3; i++) {
76
+ if (latestParts[i] > currentParts[i])
77
+ return true;
78
+ if (latestParts[i] < currentParts[i])
79
+ return false;
80
+ }
81
+ return false;
82
+ }
83
+ /**
84
+ * Display update notification
85
+ */
86
+ static displayUpdateNotification(current, latest) {
87
+ console.log('\n' + '─'.repeat(60));
88
+ console.log('📦 StackMemory Update Available!');
89
+ console.log(` Current: v${current}`);
90
+ console.log(` Latest: v${latest}`);
91
+ console.log('\n Update with:');
92
+ console.log(' npm install -g @stackmemoryai/stackmemory@latest');
93
+ console.log('─'.repeat(60) + '\n');
94
+ }
95
+ /**
96
+ * Load update cache
97
+ */
98
+ static loadCache() {
99
+ try {
100
+ if (existsSync(this.CACHE_FILE)) {
101
+ const data = readFileSync(this.CACHE_FILE, 'utf-8');
102
+ return JSON.parse(data);
103
+ }
104
+ }
105
+ catch (error) {
106
+ logger.debug('Failed to load update cache:', {
107
+ error: error.message,
108
+ });
109
+ }
110
+ return null;
111
+ }
112
+ /**
113
+ * Save update cache
114
+ */
115
+ static saveCache(cache) {
116
+ try {
117
+ const dir = join(homedir(), '.stackmemory');
118
+ if (!existsSync(dir)) {
119
+ // Create directory if it doesn't exist
120
+ execSync(`mkdir -p "${dir}"`, { stdio: 'ignore' });
121
+ }
122
+ writeFileSync(this.CACHE_FILE, JSON.stringify(cache, null, 2));
123
+ }
124
+ catch (error) {
125
+ logger.debug('Failed to save update cache:', {
126
+ error: error.message,
127
+ });
128
+ }
129
+ }
130
+ /**
131
+ * Force check for updates (ignores cache)
132
+ */
133
+ static async forceCheck(currentVersion) {
134
+ try {
135
+ const latestVersion = await this.fetchLatestVersion();
136
+ // Update cache
137
+ this.saveCache({
138
+ lastChecked: Date.now(),
139
+ latestVersion,
140
+ currentVersion,
141
+ });
142
+ if (latestVersion) {
143
+ if (this.isNewerVersion(currentVersion, latestVersion)) {
144
+ this.displayUpdateNotification(currentVersion, latestVersion);
145
+ }
146
+ else {
147
+ console.log(`✅ StackMemory is up to date (v${currentVersion})`);
148
+ }
149
+ }
150
+ }
151
+ catch (error) {
152
+ console.error('❌ Update check failed:', error.message);
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../../../src/core/utils/update-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Router } from 'express';
2
+ import { Server } from 'http';
3
+ export declare class AnalyticsAPI {
4
+ private router;
5
+ private analyticsService;
6
+ private wss?;
7
+ constructor(projectPath?: string);
8
+ private setupRoutes;
9
+ private getMetrics;
10
+ private getTasks;
11
+ private getTeamMetrics;
12
+ private addTask;
13
+ private updateTask;
14
+ private syncLinear;
15
+ private exportMetrics;
16
+ private parseQuery;
17
+ private getPresetTimeRange;
18
+ private convertToCSV;
19
+ private handleError;
20
+ setupWebSocket(server: Server): void;
21
+ getRouter(): Router;
22
+ close(): void;
23
+ }
24
+ //# sourceMappingURL=analytics-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-api.d.ts","sourceRoot":"","sources":["../../../../../src/features/analytics/api/analytics-api.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAI7D,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,GAAG,CAAC,CAAkB;gBAElB,WAAW,CAAC,EAAE,MAAM;IAMhC,OAAO,CAAC,WAAW;YAYL,UAAU;YAkBV,QAAQ;YAkBR,cAAc;YAwCd,OAAO;YAqBP,UAAU;YAoBV,UAAU;YAaV,aAAa;IA0B3B,OAAO,CAAC,UAAU;IA8ClB,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,WAAW;IAQnB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAyDpC,SAAS,IAAI,MAAM;IAInB,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,289 @@
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
95
+ ? new Date(req.body.completedAt)
96
+ : undefined,
97
+ };
98
+ await this.analyticsService.addTask(task);
99
+ res.status(201).json({
100
+ success: true,
101
+ message: 'Task added successfully',
102
+ });
103
+ }
104
+ catch (error) {
105
+ this.handleError(res, error);
106
+ }
107
+ }
108
+ async updateTask(req, res) {
109
+ try {
110
+ const { taskId } = req.params;
111
+ const updates = req.body;
112
+ if (updates.completedAt) {
113
+ updates.completedAt = new Date(updates.completedAt);
114
+ }
115
+ await this.analyticsService.updateTask(taskId, updates);
116
+ res.json({
117
+ success: true,
118
+ message: 'Task updated successfully',
119
+ });
120
+ }
121
+ catch (error) {
122
+ this.handleError(res, error);
123
+ }
124
+ }
125
+ async syncLinear(req, res) {
126
+ try {
127
+ await this.analyticsService.syncLinearTasks();
128
+ res.json({
129
+ success: true,
130
+ message: 'Linear tasks synced successfully',
131
+ });
132
+ }
133
+ catch (error) {
134
+ this.handleError(res, error);
135
+ }
136
+ }
137
+ async exportMetrics(req, res) {
138
+ try {
139
+ const query = this.parseQuery(req.query);
140
+ const format = req.query.format || 'json';
141
+ const dashboardState = await this.analyticsService.getDashboardState(query);
142
+ if (format === 'csv') {
143
+ const csv = this.convertToCSV(dashboardState);
144
+ res.setHeader('Content-Type', 'text/csv');
145
+ res.setHeader('Content-Disposition', 'attachment; filename="analytics-export.csv"');
146
+ res.send(csv);
147
+ }
148
+ else {
149
+ res.json({
150
+ success: true,
151
+ data: dashboardState,
152
+ });
153
+ }
154
+ }
155
+ catch (error) {
156
+ this.handleError(res, error);
157
+ }
158
+ }
159
+ parseQuery(query) {
160
+ const result = {};
161
+ if (query.start && query.end) {
162
+ result.timeRange = {
163
+ start: new Date(query.start),
164
+ end: new Date(query.end),
165
+ preset: query.preset,
166
+ };
167
+ }
168
+ else if (query.preset) {
169
+ result.timeRange = this.getPresetTimeRange(query.preset);
170
+ }
171
+ if (query.users) {
172
+ result.userIds = Array.isArray(query.users) ? query.users : [query.users];
173
+ }
174
+ if (query.states) {
175
+ result.states = Array.isArray(query.states)
176
+ ? query.states
177
+ : [query.states];
178
+ }
179
+ if (query.priorities) {
180
+ result.priorities = Array.isArray(query.priorities)
181
+ ? query.priorities
182
+ : [query.priorities];
183
+ }
184
+ if (query.labels) {
185
+ result.labels = Array.isArray(query.labels)
186
+ ? query.labels
187
+ : [query.labels];
188
+ }
189
+ if (query.limit) {
190
+ result.limit = parseInt(query.limit);
191
+ }
192
+ if (query.offset) {
193
+ result.offset = parseInt(query.offset);
194
+ }
195
+ return result;
196
+ }
197
+ getPresetTimeRange(preset) {
198
+ const end = new Date();
199
+ const start = new Date();
200
+ switch (preset) {
201
+ case 'today':
202
+ start.setHours(0, 0, 0, 0);
203
+ break;
204
+ case '7d':
205
+ start.setDate(start.getDate() - 7);
206
+ break;
207
+ case '30d':
208
+ start.setDate(start.getDate() - 30);
209
+ break;
210
+ case '90d':
211
+ start.setDate(start.getDate() - 90);
212
+ break;
213
+ default:
214
+ start.setDate(start.getDate() - 7);
215
+ }
216
+ return { start, end, preset: preset };
217
+ }
218
+ convertToCSV(dashboardState) {
219
+ const tasks = dashboardState.recentTasks;
220
+ if (!tasks || tasks.length === 0)
221
+ return 'No data';
222
+ const headers = Object.keys(tasks[0]).join(',');
223
+ const rows = tasks.map((task) => Object.values(task)
224
+ .map((v) => (typeof v === 'object' ? JSON.stringify(v) : v))
225
+ .join(','));
226
+ return [headers, ...rows].join('\n');
227
+ }
228
+ handleError(res, error) {
229
+ console.error('Analytics API error:', error);
230
+ res.status(500).json({
231
+ success: false,
232
+ error: error.message || 'Internal server error',
233
+ });
234
+ }
235
+ setupWebSocket(server) {
236
+ this.wss = new WebSocketServer({
237
+ server,
238
+ path: '/ws/analytics',
239
+ });
240
+ this.wss.on('connection', (ws) => {
241
+ console.log('WebSocket client connected to analytics');
242
+ const unsubscribe = this.analyticsService.subscribeToUpdates((state) => {
243
+ if (ws.readyState === WebSocket.OPEN) {
244
+ ws.send(JSON.stringify({
245
+ type: 'update',
246
+ data: state,
247
+ }));
248
+ }
249
+ });
250
+ ws.on('message', async (message) => {
251
+ try {
252
+ const data = JSON.parse(message);
253
+ if (data.type === 'subscribe') {
254
+ const query = this.parseQuery(data.query || {});
255
+ const state = await this.analyticsService.getDashboardState(query);
256
+ ws.send(JSON.stringify({
257
+ type: 'initial',
258
+ data: state,
259
+ }));
260
+ }
261
+ }
262
+ catch (error) {
263
+ ws.send(JSON.stringify({
264
+ type: 'error',
265
+ error: 'Invalid message format',
266
+ }));
267
+ }
268
+ });
269
+ ws.on('close', () => {
270
+ unsubscribe();
271
+ console.log('WebSocket client disconnected');
272
+ });
273
+ ws.on('error', (error) => {
274
+ console.error('WebSocket error:', error);
275
+ unsubscribe();
276
+ });
277
+ });
278
+ }
279
+ getRouter() {
280
+ return this.router;
281
+ }
282
+ close() {
283
+ this.analyticsService.close();
284
+ if (this.wss) {
285
+ this.wss.close();
286
+ }
287
+ }
288
+ }
289
+ //# sourceMappingURL=analytics-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-api.js","sourceRoot":"","sources":["../../../../../src/features/analytics/api/analytics-api.ts"],"names":[],"mappings":"AAAA,OAAO,OAAsC,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAGhD,MAAM,OAAO,YAAY;IACf,MAAM,CAAS;IACf,gBAAgB,CAAmB;IACnC,GAAG,CAAmB;IAE9B,YAAY,WAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAEhC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAY,EAAE,GAAa;QAClD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,cAAc,GAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEvD,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,OAAO,EAAE,cAAc,CAAC,OAAO;oBAC/B,WAAW,EAAE,cAAc,CAAC,WAAW;iBACxC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,GAAY,EAAE,GAAa;QAChD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,cAAc,GAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEvD,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,KAAK,EAAE,cAAc,CAAC,WAAW;oBACjC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,UAAU;iBACzC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAY,EAAE,GAAa;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEzC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,MAAM,cAAc,GAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACvD,GAAG,CAAC,IAAI,CAAC;oBACP,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,cAAc,CAAC,WAAW;iBACjC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC;oBACnE,GAAG,KAAK;oBACR,OAAO,EAAE,CAAC,MAAM,CAAC;iBAClB,CAAC,CAAC;gBAEH,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAC3B,CAAC;gBAEF,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACnB,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,wBAAwB;qBAChC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,GAAG,CAAC,IAAI,CAAC;oBACP,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,WAAW;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,GAAY,EAAE,GAAa;QAC/C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG;gBACX,GAAG,GAAG,CAAC,IAAI;gBACX,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACrD,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW;oBAC/B,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;oBAChC,CAAC,CAAC,SAAS;aACd,CAAC;YAEF,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAY,EAAE,GAAa;QAClD,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;YAEzB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,OAAO,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAExD,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,2BAA2B;aACrC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAY,EAAE,GAAa;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC;YAE9C,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,kCAAkC;aAC5C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,GAAY,EAAE,GAAa;QACrD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,MAAM,GAAI,GAAG,CAAC,KAAK,CAAC,MAAyB,IAAI,MAAM,CAAC;YAC9D,MAAM,cAAc,GAClB,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEvD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;gBAC9C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;gBAC1C,GAAG,CAAC,SAAS,CACX,qBAAqB,EACrB,6CAA6C,CAC9C,CAAC;gBACF,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC;oBACP,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE,cAAc;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAAU;QAC3B,MAAM,MAAM,GAAmB,EAAE,CAAC;QAElC,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,CAAC,SAAS,GAAG;gBACjB,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC5B,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;gBACzC,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;gBACjD,CAAC,CAAC,KAAK,CAAC,UAAU;gBAClB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;gBACzC,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QAEzB,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,OAAO;gBACV,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3B,MAAM;YACR,KAAK,IAAI;gBACP,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,KAAK;gBACR,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;gBACpC,MAAM;YACR,KAAK,KAAK;gBACR,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;gBACpC,MAAM;YACR;gBACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAA6B,EAAE,CAAC;IAC/D,CAAC;IAEO,YAAY,CAAC,cAAmB;QACtC,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAEnD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3D,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;QAEF,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEO,WAAW,CAAC,GAAa,EAAE,KAAU;QAC3C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,uBAAuB;SAChD,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC;YAC7B,MAAM;YACN,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAa,EAAE,EAAE;YAC1C,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YAEvD,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrE,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBACrC,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,KAAK;qBACZ,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE;gBACzC,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAEjC,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;wBAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;wBAEnE,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;4BACb,IAAI,EAAE,SAAS;4BACf,IAAI,EAAE,KAAK;yBACZ,CAAC,CACH,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE,wBAAwB;qBAChC,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;gBACzC,WAAW,EAAE,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
@@ -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/features/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;IAiBnC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBtC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAOnB,iBAAiB,CAAC,KAAK,GAAE,cAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;YA0B9D,cAAc;YAkCd,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,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAWhB,KAAK,IAAI,IAAI;CAGd"}