@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.
- package/README.md +19 -17
- package/dist/agents/codemie-code/agent.d.ts.map +1 -1
- package/dist/agents/codemie-code/agent.js +4 -4
- package/dist/agents/codemie-code/agent.js.map +1 -1
- package/dist/agents/codemie-code/config.d.ts.map +1 -1
- package/dist/agents/codemie-code/config.js +2 -1
- package/dist/agents/codemie-code/config.js.map +1 -1
- package/dist/agents/codemie-code/filters.js +12 -12
- package/dist/agents/codemie-code/filters.js.map +1 -1
- package/dist/agents/codemie-code/index.d.ts.map +1 -1
- package/dist/agents/codemie-code/index.js +3 -1
- package/dist/agents/codemie-code/index.js.map +1 -1
- package/dist/agents/codemie-code/storage/todoStorage.js +1 -1
- package/dist/agents/codemie-code/storage/todoStorage.js.map +1 -1
- package/dist/agents/codemie-code/tools/planning.d.ts +1 -1
- package/dist/agents/codemie-code/ui.js +1 -1
- package/dist/agents/codemie-code/ui.js.map +1 -1
- package/dist/agents/core/AgentCLI.js +1 -1
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/types.d.ts +5 -0
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
- package/dist/analytics/aggregation/adapters/claude.adapter.d.ts.map +1 -1
- package/dist/analytics/aggregation/adapters/claude.adapter.js +75 -15
- package/dist/analytics/aggregation/adapters/claude.adapter.js.map +1 -1
- package/dist/analytics/aggregation/adapters/codex.adapter.d.ts.map +1 -1
- package/dist/analytics/aggregation/adapters/codex.adapter.js +20 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.js.map +1 -1
- package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts +8 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts.map +1 -1
- package/dist/analytics/aggregation/adapters/gemini.adapter.js +46 -1
- package/dist/analytics/aggregation/adapters/gemini.adapter.js.map +1 -1
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts +36 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts.map +1 -1
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js +52 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js.map +1 -1
- package/dist/analytics/aggregation/core/adapter.interface.d.ts +11 -0
- package/dist/analytics/aggregation/core/adapter.interface.d.ts.map +1 -1
- package/dist/analytics/aggregation/core/aggregation-utils.d.ts +20 -0
- package/dist/analytics/aggregation/core/aggregation-utils.d.ts.map +1 -1
- package/dist/analytics/aggregation/core/aggregation-utils.js +43 -0
- package/dist/analytics/aggregation/core/aggregation-utils.js.map +1 -1
- package/dist/analytics/aggregation/core/file-utils.d.ts +2 -1
- package/dist/analytics/aggregation/core/file-utils.d.ts.map +1 -1
- package/dist/analytics/aggregation/core/file-utils.js +20 -85
- package/dist/analytics/aggregation/core/file-utils.js.map +1 -1
- package/dist/analytics/aggregation/core/index.d.ts +3 -0
- package/dist/analytics/aggregation/core/index.d.ts.map +1 -1
- package/dist/analytics/aggregation/core/index.js +3 -0
- package/dist/analytics/aggregation/core/index.js.map +1 -1
- package/dist/analytics/aggregation/core/user-prompt-source.d.ts +81 -0
- package/dist/analytics/aggregation/core/user-prompt-source.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/user-prompt-source.js +69 -0
- package/dist/analytics/aggregation/core/user-prompt-source.js.map +1 -0
- package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts +49 -0
- package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/user-prompt-sources/json.js +66 -0
- package/dist/analytics/aggregation/core/user-prompt-sources/json.js.map +1 -0
- package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts +43 -0
- package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js +56 -0
- package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js.map +1 -0
- package/dist/analytics/aggregation/types.d.ts +20 -0
- package/dist/analytics/aggregation/types.d.ts.map +1 -1
- package/dist/analytics/remote-submission/cursor-manager.d.ts +71 -0
- package/dist/analytics/remote-submission/cursor-manager.d.ts.map +1 -0
- package/dist/analytics/remote-submission/cursor-manager.js +204 -0
- package/dist/analytics/remote-submission/cursor-manager.js.map +1 -0
- package/dist/analytics/remote-submission/index.d.ts +12 -0
- package/dist/analytics/remote-submission/index.d.ts.map +1 -0
- package/dist/analytics/remote-submission/index.js +11 -0
- package/dist/analytics/remote-submission/index.js.map +1 -0
- package/dist/analytics/remote-submission/lock-manager.d.ts +71 -0
- package/dist/analytics/remote-submission/lock-manager.d.ts.map +1 -0
- package/dist/analytics/remote-submission/lock-manager.js +238 -0
- package/dist/analytics/remote-submission/lock-manager.js.map +1 -0
- package/dist/analytics/remote-submission/metric-transformer.d.ts +49 -0
- package/dist/analytics/remote-submission/metric-transformer.d.ts.map +1 -0
- package/dist/analytics/remote-submission/metric-transformer.js +175 -0
- package/dist/analytics/remote-submission/metric-transformer.js.map +1 -0
- package/dist/analytics/remote-submission/submitter.d.ts +78 -0
- package/dist/analytics/remote-submission/submitter.d.ts.map +1 -0
- package/dist/analytics/remote-submission/submitter.js +381 -0
- package/dist/analytics/remote-submission/submitter.js.map +1 -0
- package/dist/analytics/remote-submission/types.d.ts +169 -0
- package/dist/analytics/remote-submission/types.d.ts.map +1 -0
- package/dist/analytics/remote-submission/types.js +13 -0
- package/dist/analytics/remote-submission/types.js.map +1 -0
- package/dist/cli/commands/analytics.d.ts.map +1 -1
- package/dist/cli/commands/analytics.js +181 -12
- package/dist/cli/commands/analytics.js.map +1 -1
- package/dist/cli/commands/doctor/index.d.ts.map +1 -1
- package/dist/cli/commands/doctor/index.js +13 -1
- package/dist/cli/commands/doctor/index.js.map +1 -1
- package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.d.ts.map +1 -1
- package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.js +81 -9
- package/dist/cli/commands/doctor/providers/AIRunSSOProviderCheck.js.map +1 -1
- package/dist/cli/commands/profile.d.ts.map +1 -1
- package/dist/cli/commands/profile.js +25 -57
- package/dist/cli/commands/profile.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +10 -0
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/workflow.js +1 -1
- package/dist/cli/commands/workflow.js.map +1 -1
- package/dist/cli/index.js +0 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/utils/analytics-reader.js +1 -1
- package/dist/utils/analytics-reader.js.map +1 -1
- package/dist/utils/codemie-model-fetcher.d.ts.map +1 -1
- package/dist/utils/codemie-model-fetcher.js +197 -122
- package/dist/utils/codemie-model-fetcher.js.map +1 -1
- package/dist/utils/codemie-proxy.d.ts +41 -21
- package/dist/utils/codemie-proxy.d.ts.map +1 -1
- package/dist/utils/codemie-proxy.js +151 -86
- package/dist/utils/codemie-proxy.js.map +1 -1
- package/dist/utils/config-loader.d.ts +4 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +42 -2
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/first-time.d.ts +0 -4
- package/dist/utils/first-time.d.ts.map +1 -1
- package/dist/utils/first-time.js +5 -117
- package/dist/utils/first-time.js.map +1 -1
- package/dist/utils/logger.d.ts +31 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +112 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/proxy/plugins/analytics.plugin.d.ts +19 -0
- package/dist/utils/proxy/plugins/analytics.plugin.d.ts.map +1 -0
- package/dist/utils/proxy/plugins/analytics.plugin.js +84 -0
- package/dist/utils/proxy/plugins/analytics.plugin.js.map +1 -0
- package/dist/utils/proxy/plugins/header-injection.plugin.d.ts +16 -0
- package/dist/utils/proxy/plugins/header-injection.plugin.d.ts.map +1 -0
- package/dist/utils/proxy/plugins/header-injection.plugin.js +48 -0
- package/dist/utils/proxy/plugins/header-injection.plugin.js.map +1 -0
- package/dist/utils/proxy/plugins/index.d.ts +18 -0
- package/dist/utils/proxy/plugins/index.d.ts.map +1 -0
- package/dist/utils/proxy/plugins/index.js +30 -0
- package/dist/utils/proxy/plugins/index.js.map +1 -0
- package/dist/utils/proxy/plugins/registry.d.ts +50 -0
- package/dist/utils/proxy/plugins/registry.d.ts.map +1 -0
- package/dist/utils/proxy/plugins/registry.js +124 -0
- package/dist/utils/proxy/plugins/registry.js.map +1 -0
- package/dist/utils/proxy/plugins/sso-auth.plugin.d.ts +16 -0
- package/dist/utils/proxy/plugins/sso-auth.plugin.d.ts.map +1 -0
- package/dist/utils/proxy/plugins/sso-auth.plugin.js +35 -0
- package/dist/utils/proxy/plugins/sso-auth.plugin.js.map +1 -0
- package/dist/utils/proxy/plugins/types.d.ts +79 -0
- package/dist/utils/proxy/plugins/types.d.ts.map +1 -0
- package/dist/utils/proxy/plugins/types.js +8 -0
- package/dist/utils/proxy/plugins/types.js.map +1 -0
- package/dist/utils/sanitize.d.ts +28 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +213 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/workflows/installer.d.ts.map +1 -1
- package/dist/workflows/installer.js +3 -4
- package/dist/workflows/installer.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/config.d.ts +0 -3
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js +0 -198
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/env.d.ts +0 -3
- package/dist/cli/commands/env.d.ts.map +0 -1
- package/dist/cli/commands/env.js +0 -19
- package/dist/cli/commands/env.js.map +0 -1
- package/dist/utils/proxy/interceptors.d.ts +0 -69
- package/dist/utils/proxy/interceptors.d.ts.map +0 -1
- package/dist/utils/proxy/interceptors.js +0 -308
- 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;
|
|
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"}
|