@codemieai/code 0.0.13 → 0.0.15

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 (173) hide show
  1. package/README.md +19 -17
  2. package/dist/agents/codemie-code/agent.d.ts.map +1 -1
  3. package/dist/agents/codemie-code/agent.js +4 -4
  4. package/dist/agents/codemie-code/agent.js.map +1 -1
  5. package/dist/agents/codemie-code/config.d.ts.map +1 -1
  6. package/dist/agents/codemie-code/config.js +2 -1
  7. package/dist/agents/codemie-code/config.js.map +1 -1
  8. package/dist/agents/codemie-code/filters.js +12 -12
  9. package/dist/agents/codemie-code/filters.js.map +1 -1
  10. package/dist/agents/codemie-code/index.d.ts.map +1 -1
  11. package/dist/agents/codemie-code/index.js +3 -1
  12. package/dist/agents/codemie-code/index.js.map +1 -1
  13. package/dist/agents/codemie-code/storage/todoStorage.js +1 -1
  14. package/dist/agents/codemie-code/storage/todoStorage.js.map +1 -1
  15. package/dist/agents/codemie-code/tools/planning.d.ts +1 -1
  16. package/dist/agents/codemie-code/ui.js +1 -1
  17. package/dist/agents/codemie-code/ui.js.map +1 -1
  18. package/dist/agents/core/AgentCLI.js +1 -1
  19. package/dist/agents/core/AgentCLI.js.map +1 -1
  20. package/dist/agents/core/types.d.ts +5 -0
  21. package/dist/agents/core/types.d.ts.map +1 -1
  22. package/dist/agents/plugins/codemie-code.plugin.js +1 -1
  23. package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
  24. package/dist/analytics/aggregation/adapters/claude.adapter.d.ts.map +1 -1
  25. package/dist/analytics/aggregation/adapters/claude.adapter.js +75 -15
  26. package/dist/analytics/aggregation/adapters/claude.adapter.js.map +1 -1
  27. package/dist/analytics/aggregation/adapters/codex.adapter.d.ts.map +1 -1
  28. package/dist/analytics/aggregation/adapters/codex.adapter.js +20 -0
  29. package/dist/analytics/aggregation/adapters/codex.adapter.js.map +1 -1
  30. package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts +8 -0
  31. package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts.map +1 -1
  32. package/dist/analytics/aggregation/adapters/gemini.adapter.js +46 -1
  33. package/dist/analytics/aggregation/adapters/gemini.adapter.js.map +1 -1
  34. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts +36 -0
  35. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts.map +1 -1
  36. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js +52 -0
  37. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js.map +1 -1
  38. package/dist/analytics/aggregation/core/adapter.interface.d.ts +11 -0
  39. package/dist/analytics/aggregation/core/adapter.interface.d.ts.map +1 -1
  40. package/dist/analytics/aggregation/core/aggregation-utils.d.ts +20 -0
  41. package/dist/analytics/aggregation/core/aggregation-utils.d.ts.map +1 -1
  42. package/dist/analytics/aggregation/core/aggregation-utils.js +43 -0
  43. package/dist/analytics/aggregation/core/aggregation-utils.js.map +1 -1
  44. package/dist/analytics/aggregation/core/file-utils.d.ts +2 -1
  45. package/dist/analytics/aggregation/core/file-utils.d.ts.map +1 -1
  46. package/dist/analytics/aggregation/core/file-utils.js +20 -85
  47. package/dist/analytics/aggregation/core/file-utils.js.map +1 -1
  48. package/dist/analytics/aggregation/core/index.d.ts +3 -0
  49. package/dist/analytics/aggregation/core/index.d.ts.map +1 -1
  50. package/dist/analytics/aggregation/core/index.js +3 -0
  51. package/dist/analytics/aggregation/core/index.js.map +1 -1
  52. package/dist/analytics/aggregation/core/user-prompt-source.d.ts +81 -0
  53. package/dist/analytics/aggregation/core/user-prompt-source.d.ts.map +1 -0
  54. package/dist/analytics/aggregation/core/user-prompt-source.js +69 -0
  55. package/dist/analytics/aggregation/core/user-prompt-source.js.map +1 -0
  56. package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts +49 -0
  57. package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts.map +1 -0
  58. package/dist/analytics/aggregation/core/user-prompt-sources/json.js +66 -0
  59. package/dist/analytics/aggregation/core/user-prompt-sources/json.js.map +1 -0
  60. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts +43 -0
  61. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts.map +1 -0
  62. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js +56 -0
  63. package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js.map +1 -0
  64. package/dist/analytics/aggregation/types.d.ts +20 -0
  65. package/dist/analytics/aggregation/types.d.ts.map +1 -1
  66. package/dist/analytics/remote-submission/cursor-manager.d.ts +71 -0
  67. package/dist/analytics/remote-submission/cursor-manager.d.ts.map +1 -0
  68. package/dist/analytics/remote-submission/cursor-manager.js +204 -0
  69. package/dist/analytics/remote-submission/cursor-manager.js.map +1 -0
  70. package/dist/analytics/remote-submission/index.d.ts +12 -0
  71. package/dist/analytics/remote-submission/index.d.ts.map +1 -0
  72. package/dist/analytics/remote-submission/index.js +11 -0
  73. package/dist/analytics/remote-submission/index.js.map +1 -0
  74. package/dist/analytics/remote-submission/lock-manager.d.ts +71 -0
  75. package/dist/analytics/remote-submission/lock-manager.d.ts.map +1 -0
  76. package/dist/analytics/remote-submission/lock-manager.js +238 -0
  77. package/dist/analytics/remote-submission/lock-manager.js.map +1 -0
  78. package/dist/analytics/remote-submission/metric-transformer.d.ts +49 -0
  79. package/dist/analytics/remote-submission/metric-transformer.d.ts.map +1 -0
  80. package/dist/analytics/remote-submission/metric-transformer.js +175 -0
  81. package/dist/analytics/remote-submission/metric-transformer.js.map +1 -0
  82. package/dist/analytics/remote-submission/submitter.d.ts +78 -0
  83. package/dist/analytics/remote-submission/submitter.d.ts.map +1 -0
  84. package/dist/analytics/remote-submission/submitter.js +381 -0
  85. package/dist/analytics/remote-submission/submitter.js.map +1 -0
  86. package/dist/analytics/remote-submission/types.d.ts +169 -0
  87. package/dist/analytics/remote-submission/types.d.ts.map +1 -0
  88. package/dist/analytics/remote-submission/types.js +13 -0
  89. package/dist/analytics/remote-submission/types.js.map +1 -0
  90. package/dist/cli/commands/analytics.d.ts.map +1 -1
  91. package/dist/cli/commands/analytics.js +181 -12
  92. package/dist/cli/commands/analytics.js.map +1 -1
  93. package/dist/cli/commands/doctor/index.d.ts.map +1 -1
  94. package/dist/cli/commands/doctor/index.js +13 -1
  95. package/dist/cli/commands/doctor/index.js.map +1 -1
  96. package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.d.ts.map +1 -1
  97. package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.js +81 -9
  98. package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.js.map +1 -1
  99. package/dist/cli/commands/profile.d.ts.map +1 -1
  100. package/dist/cli/commands/profile.js +25 -57
  101. package/dist/cli/commands/profile.js.map +1 -1
  102. package/dist/cli/commands/setup.d.ts.map +1 -1
  103. package/dist/cli/commands/setup.js +10 -0
  104. package/dist/cli/commands/setup.js.map +1 -1
  105. package/dist/cli/commands/workflow.js +1 -1
  106. package/dist/cli/commands/workflow.js.map +1 -1
  107. package/dist/cli/index.js +0 -4
  108. package/dist/cli/index.js.map +1 -1
  109. package/dist/utils/analytics-reader.js +1 -1
  110. package/dist/utils/analytics-reader.js.map +1 -1
  111. package/dist/utils/codemie-model-fetcher.d.ts.map +1 -1
  112. package/dist/utils/codemie-model-fetcher.js +197 -122
  113. package/dist/utils/codemie-model-fetcher.js.map +1 -1
  114. package/dist/utils/codemie-proxy.d.ts +41 -21
  115. package/dist/utils/codemie-proxy.d.ts.map +1 -1
  116. package/dist/utils/codemie-proxy.js +151 -86
  117. package/dist/utils/codemie-proxy.js.map +1 -1
  118. package/dist/utils/config-loader.d.ts +4 -0
  119. package/dist/utils/config-loader.d.ts.map +1 -1
  120. package/dist/utils/config-loader.js +42 -2
  121. package/dist/utils/config-loader.js.map +1 -1
  122. package/dist/utils/first-time.d.ts +0 -4
  123. package/dist/utils/first-time.d.ts.map +1 -1
  124. package/dist/utils/first-time.js +5 -117
  125. package/dist/utils/first-time.js.map +1 -1
  126. package/dist/utils/logger.d.ts +31 -1
  127. package/dist/utils/logger.d.ts.map +1 -1
  128. package/dist/utils/logger.js +112 -2
  129. package/dist/utils/logger.js.map +1 -1
  130. package/dist/utils/proxy/plugins/analytics.plugin.d.ts +19 -0
  131. package/dist/utils/proxy/plugins/analytics.plugin.d.ts.map +1 -0
  132. package/dist/utils/proxy/plugins/analytics.plugin.js +84 -0
  133. package/dist/utils/proxy/plugins/analytics.plugin.js.map +1 -0
  134. package/dist/utils/proxy/plugins/header-injection.plugin.d.ts +16 -0
  135. package/dist/utils/proxy/plugins/header-injection.plugin.d.ts.map +1 -0
  136. package/dist/utils/proxy/plugins/header-injection.plugin.js +48 -0
  137. package/dist/utils/proxy/plugins/header-injection.plugin.js.map +1 -0
  138. package/dist/utils/proxy/plugins/index.d.ts +18 -0
  139. package/dist/utils/proxy/plugins/index.d.ts.map +1 -0
  140. package/dist/utils/proxy/plugins/index.js +30 -0
  141. package/dist/utils/proxy/plugins/index.js.map +1 -0
  142. package/dist/utils/proxy/plugins/registry.d.ts +50 -0
  143. package/dist/utils/proxy/plugins/registry.d.ts.map +1 -0
  144. package/dist/utils/proxy/plugins/registry.js +124 -0
  145. package/dist/utils/proxy/plugins/registry.js.map +1 -0
  146. package/dist/utils/proxy/plugins/sso-auth.plugin.d.ts +16 -0
  147. package/dist/utils/proxy/plugins/sso-auth.plugin.d.ts.map +1 -0
  148. package/dist/utils/proxy/plugins/sso-auth.plugin.js +35 -0
  149. package/dist/utils/proxy/plugins/sso-auth.plugin.js.map +1 -0
  150. package/dist/utils/proxy/plugins/types.d.ts +79 -0
  151. package/dist/utils/proxy/plugins/types.d.ts.map +1 -0
  152. package/dist/utils/proxy/plugins/types.js +8 -0
  153. package/dist/utils/proxy/plugins/types.js.map +1 -0
  154. package/dist/utils/sanitize.d.ts +28 -0
  155. package/dist/utils/sanitize.d.ts.map +1 -0
  156. package/dist/utils/sanitize.js +213 -0
  157. package/dist/utils/sanitize.js.map +1 -0
  158. package/dist/workflows/installer.d.ts.map +1 -1
  159. package/dist/workflows/installer.js +3 -4
  160. package/dist/workflows/installer.js.map +1 -1
  161. package/package.json +1 -1
  162. package/dist/cli/commands/config.d.ts +0 -3
  163. package/dist/cli/commands/config.d.ts.map +0 -1
  164. package/dist/cli/commands/config.js +0 -198
  165. package/dist/cli/commands/config.js.map +0 -1
  166. package/dist/cli/commands/env.d.ts +0 -3
  167. package/dist/cli/commands/env.d.ts.map +0 -1
  168. package/dist/cli/commands/env.js +0 -19
  169. package/dist/cli/commands/env.js.map +0 -1
  170. package/dist/utils/proxy/interceptors.d.ts +0 -69
  171. package/dist/utils/proxy/interceptors.d.ts.map +0 -1
  172. package/dist/utils/proxy/interceptors.js +0 -308
  173. package/dist/utils/proxy/interceptors.js.map +0 -1
@@ -0,0 +1,381 @@
1
+ /**
2
+ * Remote Analytics Submitter
3
+ *
4
+ * Orchestrates periodic submission of analytics metrics to /v1/metrics endpoint.
5
+ * Handles event-level tracking, concurrency control, and backend-aligned metrics.
6
+ *
7
+ * Key Features:
8
+ * - 5-minute submission interval
9
+ * - Event-level tracking (message IDs, tool call IDs)
10
+ * - Multi-terminal safety via file locking
11
+ * - Inactivity-based session end detection
12
+ * - Backend-aligned metric transformation (3+1 pattern)
13
+ */
14
+ import { appendFile, mkdir } from 'node:fs/promises';
15
+ import { existsSync } from 'node:fs';
16
+ import { join } from 'node:path';
17
+ import { homedir } from 'node:os';
18
+ import { AgentRegistry } from '../../agents/registry.js';
19
+ import { CursorManager } from './cursor-manager.js';
20
+ import { LockManager } from './lock-manager.js';
21
+ import { transformSessionToMetrics, createSessionMetric } from './metric-transformer.js';
22
+ import { logger } from '../../utils/logger.js';
23
+ /**
24
+ * Remote Analytics Submitter
25
+ */
26
+ export class RemoteAnalyticsSubmitter {
27
+ config;
28
+ cursorManager;
29
+ lockManager;
30
+ intervalTimer = null;
31
+ isRunning = false;
32
+ constructor(config) {
33
+ this.config = config;
34
+ this.cursorManager = new CursorManager();
35
+ this.lockManager = new LockManager();
36
+ }
37
+ /**
38
+ * Start periodic submission
39
+ */
40
+ start() {
41
+ if (this.intervalTimer) {
42
+ logger.debug('RemoteAnalyticsSubmitter already started');
43
+ return;
44
+ }
45
+ logger.debug(`Starting remote analytics submission (interval: ${this.config.interval}ms)`);
46
+ // Run immediately, then periodically
47
+ this.submitCycle().catch(error => {
48
+ logger.debug(`Initial submission cycle failed: ${error}`);
49
+ });
50
+ this.intervalTimer = setInterval(() => {
51
+ this.submitCycle().catch(error => {
52
+ logger.debug(`Submission cycle failed: ${error}`);
53
+ });
54
+ }, this.config.interval);
55
+ // Ensure timer doesn't prevent process exit
56
+ this.intervalTimer.unref();
57
+ }
58
+ /**
59
+ * Stop periodic submission
60
+ */
61
+ stop() {
62
+ if (this.intervalTimer) {
63
+ clearInterval(this.intervalTimer);
64
+ this.intervalTimer = null;
65
+ logger.debug('Remote analytics submission stopped');
66
+ }
67
+ }
68
+ /**
69
+ * Main submission cycle
70
+ */
71
+ async submitCycle() {
72
+ // Prevent overlapping cycles
73
+ if (this.isRunning) {
74
+ logger.debug('Submission cycle already running, skipping');
75
+ return;
76
+ }
77
+ this.isRunning = true;
78
+ try {
79
+ // 1. Acquire lock (with retry)
80
+ const lockAcquired = await this.lockManager.acquire('remote-submitter', 3);
81
+ if (!lockAcquired) {
82
+ logger.debug('Could not acquire lock, skipping cycle');
83
+ return;
84
+ }
85
+ // 2. Load cursor
86
+ const cursor = await this.cursorManager.load();
87
+ // 3. Process all external agents
88
+ await this.processExternalAgents(cursor);
89
+ // 4. Save cursor
90
+ await this.cursorManager.save(cursor);
91
+ this.cursorManager.resetFailures(cursor);
92
+ }
93
+ catch (error) {
94
+ logger.debug(`Submission cycle error: ${error}`);
95
+ const cursor = await this.cursorManager.load();
96
+ this.cursorManager.recordFailure(cursor);
97
+ await this.cursorManager.save(cursor);
98
+ }
99
+ finally {
100
+ // 5. Release lock
101
+ await this.lockManager.release();
102
+ this.isRunning = false;
103
+ }
104
+ }
105
+ /**
106
+ * Process all external agents
107
+ */
108
+ async processExternalAgents(cursor) {
109
+ // Get all analytics adapters from registry
110
+ const adapters = AgentRegistry.getAllAnalyticsAdapters();
111
+ for (const adapter of adapters) {
112
+ // Skip native agent
113
+ if (adapter.agentName === 'codemie-code') {
114
+ continue;
115
+ }
116
+ try {
117
+ // Validate source
118
+ if (!(await adapter.validateSource())) {
119
+ logger.debug(`Data source not available for ${adapter.displayName}, skipping`);
120
+ continue;
121
+ }
122
+ // Process agent
123
+ await this.processAgent(adapter, cursor);
124
+ // Update scan time
125
+ this.cursorManager.updateScanTime(cursor, adapter.agentName);
126
+ }
127
+ catch (error) {
128
+ logger.debug(`Failed to process agent ${adapter.displayName}: ${error}`);
129
+ }
130
+ }
131
+ }
132
+ /**
133
+ * Process single agent
134
+ */
135
+ async processAgent(adapter, cursor) {
136
+ logger.debug(`Processing ${adapter.displayName}...`);
137
+ // Find all sessions
138
+ const descriptors = await adapter.findSessions();
139
+ logger.debug(`Found ${descriptors.length} sessions for ${adapter.displayName}`);
140
+ // Process each session
141
+ for (const descriptor of descriptors) {
142
+ try {
143
+ await this.processSession(adapter, descriptor, cursor);
144
+ }
145
+ catch (error) {
146
+ logger.debug(`Failed to process session ${descriptor.sessionId}: ${error}`);
147
+ }
148
+ }
149
+ }
150
+ /**
151
+ * Process single session
152
+ */
153
+ async processSession(adapter, descriptor, cursor) {
154
+ const sessionId = descriptor.sessionId;
155
+ const agentCursor = this.cursorManager.getAgentCursor(cursor, adapter.agentName);
156
+ const sessionState = this.cursorManager.getSessionState(agentCursor, sessionId);
157
+ // Extract session and raw events
158
+ const [session, rawData] = await Promise.all([
159
+ adapter.extractSession(descriptor),
160
+ adapter.extractRawEvents(descriptor)
161
+ ]);
162
+ // Filter to NEW events only (not yet sent)
163
+ const newMessages = this.cursorManager.filterNewEvents(rawData.messages, sessionState, 'message');
164
+ const newToolCalls = this.cursorManager.filterNewEvents(rawData.toolCalls, sessionState, 'toolCall');
165
+ // Check session status
166
+ const status = this.determineSessionStatus(session, rawData, sessionState);
167
+ const metricsToSubmit = [];
168
+ // 1. Tool-level metrics (if new tool calls)
169
+ if (newToolCalls.length > 0) {
170
+ logger.debug(`Session ${sessionId}: ${newToolCalls.length} new tool calls, ` +
171
+ `${newMessages.length} new messages`);
172
+ const toolMetrics = transformSessionToMetrics(session, {
173
+ messages: newMessages,
174
+ toolCalls: newToolCalls,
175
+ fileModifications: rawData.fileModifications.filter(fm => newToolCalls.some(tc => tc.toolCallId === fm.toolCallId))
176
+ }, {
177
+ userId: this.config.baseUrl?.includes('ai-run') ? 'INSTALLATION_ID' : 'unknown',
178
+ userName: process.env.USER || 'unknown'
179
+ });
180
+ metricsToSubmit.push(...toolMetrics);
181
+ }
182
+ else {
183
+ logger.debug(`Session ${sessionId}: no new events, skipping tool metrics`);
184
+ }
185
+ // 2. Session metric (if session ended or resumed)
186
+ const sessionMetric = await this.maybeSubmitSessionMetric(session, rawData, sessionState, status);
187
+ if (sessionMetric) {
188
+ metricsToSubmit.push(sessionMetric);
189
+ }
190
+ // 3. Submit metrics
191
+ if (metricsToSubmit.length > 0) {
192
+ await this.submitBatch(metricsToSubmit);
193
+ // 4. Update cursor
194
+ this.cursorManager.updateSessionState(cursor, adapter.agentName, sessionId, {
195
+ newMessageIds: newMessages.map(m => m.messageId),
196
+ newToolCallIds: newToolCalls.map(tc => tc.toolCallId),
197
+ metricsSubmitted: metricsToSubmit.length,
198
+ lastActivityTime: this.getLastActivityTime(session, rawData).toISOString(),
199
+ sessionMetrics: sessionMetric ? {
200
+ timeoutSent: status === 'ended' && !session.endTime,
201
+ resumedSent: sessionState.sessionMetrics.timeoutSent && newToolCalls.length > 0,
202
+ completedSent: !!session.endTime
203
+ } : undefined
204
+ });
205
+ // Update global stats
206
+ if (!sessionState.submitted) {
207
+ cursor.stats.totalSessionsSubmitted++;
208
+ }
209
+ logger.debug(`✓ Submitted ${metricsToSubmit.length} metrics for session ${sessionId}`);
210
+ }
211
+ else {
212
+ logger.debug(`Session ${sessionId}: no metrics to submit`);
213
+ }
214
+ }
215
+ /**
216
+ * Determine session status based on activity
217
+ */
218
+ determineSessionStatus(session, rawData, sessionState) {
219
+ // Already sent final metric
220
+ if (sessionState.sessionMetrics.completedSent) {
221
+ return 'final';
222
+ }
223
+ // Explicit end time
224
+ if (session.endTime) {
225
+ return 'ended';
226
+ }
227
+ // Check inactivity
228
+ const lastActivity = this.getLastActivityTime(session, rawData);
229
+ const inactiveMs = Date.now() - lastActivity.getTime();
230
+ // Import SESSION_TIMEOUTS
231
+ const { INACTIVE, ENDED } = {
232
+ INACTIVE: 30 * 60 * 1000,
233
+ ENDED: 24 * 60 * 60 * 1000
234
+ };
235
+ if (inactiveMs < INACTIVE) {
236
+ return 'active';
237
+ }
238
+ else if (inactiveMs < ENDED) {
239
+ return 'inactive';
240
+ }
241
+ else {
242
+ return 'ended';
243
+ }
244
+ }
245
+ /**
246
+ * Get last activity time from session
247
+ */
248
+ getLastActivityTime(session, rawData) {
249
+ // Priority: explicit endTime > latest message timestamp > startTime
250
+ if (session.endTime)
251
+ return session.endTime;
252
+ // Get latest timestamp from messages
253
+ const messageTimes = rawData.messages.map(m => m.timestamp.getTime());
254
+ if (messageTimes.length > 0) {
255
+ return new Date(Math.max(...messageTimes));
256
+ }
257
+ return session.startTime;
258
+ }
259
+ /**
260
+ * Maybe submit session metric based on status
261
+ */
262
+ async maybeSubmitSessionMetric(session, rawData, sessionState, status) {
263
+ const sessionMetrics = sessionState.sessionMetrics;
264
+ // Case 1: Explicit end (ideal case)
265
+ if (session.endTime && !sessionMetrics.completedSent) {
266
+ return createSessionMetric(session, rawData, {
267
+ userId: this.config.baseUrl?.includes('ai-run') ? 'INSTALLATION_ID' : 'unknown',
268
+ userName: process.env.USER || 'unknown'
269
+ }, {
270
+ status: 'completed',
271
+ exitReason: session.exitReason || 'user_exit',
272
+ isFinal: true
273
+ });
274
+ }
275
+ // Case 2: Inactivity timeout (24 hours)
276
+ if (status === 'ended' && !sessionMetrics.timeoutSent) {
277
+ return createSessionMetric(session, rawData, {
278
+ userId: this.config.baseUrl?.includes('ai-run') ? 'INSTALLATION_ID' : 'unknown',
279
+ userName: process.env.USER || 'unknown'
280
+ }, {
281
+ status: 'timeout',
282
+ exitReason: 'inactivity_timeout',
283
+ isFinal: false
284
+ });
285
+ }
286
+ // Case 3: Resumed after timeout (new activity after timeout was sent)
287
+ if (sessionMetrics.timeoutSent && !sessionMetrics.resumedSent) {
288
+ // Check if there are new events
289
+ const hasNewActivity = rawData.toolCalls.length > sessionState.sentEventIds.toolCalls.length;
290
+ if (hasNewActivity) {
291
+ return createSessionMetric(session, rawData, {
292
+ userId: this.config.baseUrl?.includes('ai-run') ? 'INSTALLATION_ID' : 'unknown',
293
+ userName: process.env.USER || 'unknown'
294
+ }, {
295
+ status: 'resumed',
296
+ exitReason: 'resumed_after_timeout',
297
+ isFinal: false
298
+ });
299
+ }
300
+ }
301
+ return null;
302
+ }
303
+ /**
304
+ * Submit batch of metrics - writes to local file and/or remote endpoint
305
+ */
306
+ async submitBatch(metrics) {
307
+ // Write to local file if target is 'local' or 'both'
308
+ if (this.config.target === 'local' || this.config.target === 'both') {
309
+ await this.writeMetricsToLocalFile(metrics);
310
+ }
311
+ // Submit to remote endpoint if target is 'remote' or 'both'
312
+ if (this.config.target === 'remote' || this.config.target === 'both') {
313
+ await this.submitToRemote(metrics);
314
+ }
315
+ }
316
+ /**
317
+ * Write metrics to local JSONL file
318
+ */
319
+ async writeMetricsToLocalFile(metrics) {
320
+ try {
321
+ // Get today's date for filename
322
+ const today = new Date().toISOString().split('T')[0];
323
+ const analyticsDir = join(homedir(), '.codemie', 'analytics', '.remote');
324
+ const filePath = join(analyticsDir, `${today}.jsonl`);
325
+ // Ensure directory exists
326
+ if (!existsSync(analyticsDir)) {
327
+ await mkdir(analyticsDir, { recursive: true });
328
+ }
329
+ // Write metrics as JSONL (one JSON object per line)
330
+ const lines = metrics.map(metric => JSON.stringify(metric)).join('\n') + '\n';
331
+ // Append to file (or create if doesn't exist)
332
+ await appendFile(filePath, lines, 'utf-8');
333
+ logger.debug(`Wrote ${metrics.length} metrics to ${filePath}`);
334
+ }
335
+ catch (error) {
336
+ logger.debug(`Failed to write metrics to local file: ${error}`);
337
+ throw error;
338
+ }
339
+ }
340
+ /**
341
+ * Submit metrics to remote /v1/metrics endpoint
342
+ */
343
+ async submitToRemote(metrics) {
344
+ if (!this.config.baseUrl || !this.config.cookies) {
345
+ throw new Error('baseUrl and cookies required for remote submission');
346
+ }
347
+ // Create batches
348
+ const batches = this.createBatches(metrics, this.config.batchSize);
349
+ for (const batch of batches) {
350
+ try {
351
+ const response = await fetch(`${this.config.baseUrl}/v1/metrics`, {
352
+ method: 'POST',
353
+ headers: {
354
+ 'Content-Type': 'application/json',
355
+ 'Cookie': this.config.cookies
356
+ },
357
+ body: JSON.stringify(batch)
358
+ });
359
+ if (!response.ok) {
360
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
361
+ }
362
+ logger.debug(`Submitted batch of ${batch.length} metrics to remote endpoint`);
363
+ }
364
+ catch (error) {
365
+ logger.debug(`Failed to submit batch to remote: ${error}`);
366
+ throw error;
367
+ }
368
+ }
369
+ }
370
+ /**
371
+ * Create batches from metrics
372
+ */
373
+ createBatches(items, batchSize) {
374
+ const batches = [];
375
+ for (let i = 0; i < items.length; i += batchSize) {
376
+ batches.push(items.slice(i, i + batchSize));
377
+ }
378
+ return batches;
379
+ }
380
+ }
381
+ //# sourceMappingURL=submitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submitter.js","sourceRoot":"","sources":["../../../src/analytics/remote-submission/submitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Remote Metrics Submission - Type Definitions
3
+ *
4
+ * Backend-aligned metric payload structures for submitting to /v1/metrics endpoint
5
+ */
6
+ /**
7
+ * Metric names following backend convention
8
+ */
9
+ export type MetricName = 'codemie_tools_usage_total' | 'codemie_tools_usage_tokens' | 'codemie_tools_usage_errors_total' | 'codemie_coding_agent_usage';
10
+ /**
11
+ * Base metric payload structure (what gets sent to /v1/metrics)
12
+ */
13
+ export interface MetricPayload {
14
+ metric_name: MetricName;
15
+ attributes: Record<string, string | number | boolean>;
16
+ time: string;
17
+ }
18
+ /**
19
+ * Core attributes shared across all CLI tool metrics
20
+ */
21
+ export interface BaseMetricAttributes {
22
+ tool_name: string;
23
+ tool_type: 'cli';
24
+ agent: string;
25
+ agent_version: string;
26
+ llm_model: string;
27
+ user_id: string;
28
+ user_name: string;
29
+ project: string;
30
+ session_id: string;
31
+ count: number;
32
+ }
33
+ /**
34
+ * Tool execution success metric attributes (with ALL details)
35
+ */
36
+ export interface ToolSuccessAttributes extends BaseMetricAttributes {
37
+ duration_ms: number;
38
+ file_extension?: string;
39
+ operation?: 'create' | 'update' | 'delete';
40
+ lines_added?: number;
41
+ lines_removed?: number;
42
+ was_new_file?: boolean;
43
+ }
44
+ /**
45
+ * Token consumption metric attributes
46
+ */
47
+ export interface TokenMetricAttributes extends Omit<BaseMetricAttributes, 'count'> {
48
+ input_tokens: number;
49
+ output_tokens: number;
50
+ cache_read_input_tokens: number;
51
+ count: number;
52
+ }
53
+ /**
54
+ * Tool execution failure metric attributes
55
+ */
56
+ export interface ToolErrorAttributes extends BaseMetricAttributes {
57
+ error: string;
58
+ status: 'failure';
59
+ duration_ms: number;
60
+ }
61
+ /**
62
+ * Session aggregation metric attributes (no tool_name, different structure)
63
+ */
64
+ export interface SessionMetricAttributes {
65
+ user_id: string;
66
+ user_name: string;
67
+ agent: string;
68
+ agent_version: string;
69
+ llm_model: string;
70
+ project: string;
71
+ session_id: string;
72
+ total_user_prompts: number;
73
+ total_ai_requests: number;
74
+ total_ai_responses: number;
75
+ total_tool_calls: number;
76
+ successful_tool_calls: number;
77
+ failed_tool_calls: number;
78
+ total_input_tokens: number;
79
+ total_output_tokens: number;
80
+ total_cache_read_input_tokens: number;
81
+ total_money_spent: number;
82
+ total_cached_tokens_money_spent: number;
83
+ files_created: number;
84
+ files_modified: number;
85
+ files_deleted: number;
86
+ total_lines_added: number;
87
+ total_lines_removed: number;
88
+ session_duration_ms: number;
89
+ total_execution_time: number;
90
+ exit_reason: string;
91
+ had_errors: boolean;
92
+ status: 'completed' | 'timeout' | 'resumed';
93
+ is_final?: boolean;
94
+ count: number;
95
+ }
96
+ /**
97
+ * Root cursor state file structure
98
+ */
99
+ export interface CursorState {
100
+ version: number;
101
+ lastRun: string;
102
+ agents: Record<string, AgentCursorState>;
103
+ stats: {
104
+ totalSessionsSubmitted: number;
105
+ totalMetricsSubmitted: number;
106
+ consecutiveFailures: number;
107
+ };
108
+ }
109
+ /**
110
+ * Per-agent cursor state
111
+ */
112
+ export interface AgentCursorState {
113
+ lastScan: string;
114
+ sessions: Record<string, SessionSubmissionState>;
115
+ }
116
+ /**
117
+ * Per-session submission tracking (event-level)
118
+ */
119
+ export interface SessionSubmissionState {
120
+ submitted: boolean;
121
+ timestamp: string;
122
+ sentEventIds: {
123
+ messages: string[];
124
+ toolCalls: string[];
125
+ };
126
+ sessionMetrics: {
127
+ timeoutSent: boolean;
128
+ resumedSent: boolean;
129
+ completedSent: boolean;
130
+ };
131
+ lastActivityTime: string;
132
+ metricsSubmitted: number;
133
+ lastUpdate: string;
134
+ projectHash?: string;
135
+ failureCount?: number;
136
+ lastAttempt?: string;
137
+ }
138
+ /**
139
+ * Lock file information
140
+ */
141
+ export interface LockInfo {
142
+ pid: number;
143
+ timestamp: string;
144
+ hostname: string;
145
+ agent: string;
146
+ }
147
+ /**
148
+ * Remote submission configuration
149
+ */
150
+ export interface RemoteSubmissionConfig {
151
+ enabled: boolean;
152
+ target: 'local' | 'remote' | 'both';
153
+ baseUrl?: string;
154
+ cookies?: string;
155
+ interval: number;
156
+ batchSize: number;
157
+ }
158
+ /**
159
+ * Session activity status
160
+ */
161
+ export type SessionStatus = 'active' | 'inactive' | 'ended' | 'final';
162
+ /**
163
+ * Session timeouts
164
+ */
165
+ export declare const SESSION_TIMEOUTS: {
166
+ readonly INACTIVE: number;
167
+ readonly ENDED: number;
168
+ };
169
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analytics/remote-submission/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Remote Metrics Submission - Type Definitions
3
+ *
4
+ * Backend-aligned metric payload structures for submitting to /v1/metrics endpoint
5
+ */
6
+ /**
7
+ * Session timeouts
8
+ */
9
+ export const SESSION_TIMEOUTS = {
10
+ INACTIVE: 30 * 60 * 1000, // 30 minutes - consider inactive
11
+ ENDED: 24 * 60 * 60 * 1000, // 24 hours - consider ended
12
+ };
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analytics/remote-submission/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0OH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAO,iCAAiC;IAChE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAK,4BAA4B;CACnD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,sBAAsB,IAAI,OAAO,CAuChD"}
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,sBAAsB,IAAI,OAAO,CAuChD"}