@codemieai/code 0.0.12 → 0.0.14
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 +65 -778
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +31 -3
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/core/types.d.ts +18 -0
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude.plugin.d.ts +0 -3
- package/dist/agents/plugins/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude.plugin.js +12 -1
- package/dist/agents/plugins/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/codex.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codex.plugin.js +40 -4
- package/dist/agents/plugins/codex.plugin.js.map +1 -1
- package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/gemini.plugin.js +50 -5
- package/dist/agents/plugins/gemini.plugin.js.map +1 -1
- package/dist/agents/registry.d.ts +15 -2
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +30 -6
- package/dist/agents/registry.js.map +1 -1
- package/dist/analytics/aggregation/adapters/claude.adapter.d.ts +37 -0
- package/dist/analytics/aggregation/adapters/claude.adapter.d.ts.map +1 -0
- package/dist/analytics/aggregation/adapters/claude.adapter.js +471 -0
- package/dist/analytics/aggregation/adapters/claude.adapter.js.map +1 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.d.ts +25 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.d.ts.map +1 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.js +376 -0
- package/dist/analytics/aggregation/adapters/codex.adapter.js.map +1 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts +28 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts.map +1 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.js +320 -0
- package/dist/analytics/aggregation/adapters/gemini.adapter.js.map +1 -0
- package/dist/analytics/aggregation/adapters/index.d.ts +7 -0
- package/dist/analytics/aggregation/adapters/index.d.ts.map +1 -0
- package/dist/analytics/aggregation/adapters/index.js +7 -0
- package/dist/analytics/aggregation/adapters/index.js.map +1 -0
- package/dist/analytics/aggregation/aggregator.d.ts +49 -0
- package/dist/analytics/aggregation/aggregator.d.ts.map +1 -0
- package/dist/analytics/aggregation/aggregator.js +239 -0
- package/dist/analytics/aggregation/aggregator.js.map +1 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts +63 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js +58 -0
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js.map +1 -0
- package/dist/analytics/aggregation/core/adapter.interface.d.ts +65 -0
- package/dist/analytics/aggregation/core/adapter.interface.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/adapter.interface.js +9 -0
- package/dist/analytics/aggregation/core/adapter.interface.js.map +1 -0
- package/dist/analytics/aggregation/core/aggregation-utils.d.ts +66 -0
- package/dist/analytics/aggregation/core/aggregation-utils.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/aggregation-utils.js +83 -0
- package/dist/analytics/aggregation/core/aggregation-utils.js.map +1 -0
- package/dist/analytics/aggregation/core/discovery.d.ts +40 -0
- package/dist/analytics/aggregation/core/discovery.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/discovery.js +132 -0
- package/dist/analytics/aggregation/core/discovery.js.map +1 -0
- package/dist/analytics/aggregation/core/file-utils.d.ts +23 -0
- package/dist/analytics/aggregation/core/file-utils.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/file-utils.js +208 -0
- package/dist/analytics/aggregation/core/file-utils.js.map +1 -0
- package/dist/analytics/aggregation/core/index.d.ts +11 -0
- package/dist/analytics/aggregation/core/index.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/index.js +11 -0
- package/dist/analytics/aggregation/core/index.js.map +1 -0
- package/dist/analytics/aggregation/core/project-mapping.d.ts +50 -0
- package/dist/analytics/aggregation/core/project-mapping.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/project-mapping.js +102 -0
- package/dist/analytics/aggregation/core/project-mapping.js.map +1 -0
- package/dist/analytics/aggregation/core/streaming.d.ts +26 -0
- package/dist/analytics/aggregation/core/streaming.d.ts.map +1 -0
- package/dist/analytics/aggregation/core/streaming.js +58 -0
- package/dist/analytics/aggregation/core/streaming.js.map +1 -0
- package/dist/analytics/aggregation/index.d.ts +8 -0
- package/dist/analytics/aggregation/index.d.ts.map +1 -0
- package/dist/analytics/aggregation/index.js +8 -0
- package/dist/analytics/aggregation/index.js.map +1 -0
- package/dist/analytics/aggregation/types.d.ts +258 -0
- package/dist/analytics/aggregation/types.d.ts.map +1 -0
- package/dist/analytics/aggregation/types.js +8 -0
- package/dist/analytics/aggregation/types.js.map +1 -0
- package/dist/analytics/config.d.ts +1 -0
- package/dist/analytics/config.d.ts.map +1 -1
- package/dist/analytics/config.js +20 -1
- package/dist/analytics/config.js.map +1 -1
- package/dist/analytics/index.d.ts +0 -9
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +14 -48
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/plugins/api-metrics.plugin.d.ts +4 -1
- package/dist/analytics/plugins/api-metrics.plugin.d.ts.map +1 -1
- package/dist/analytics/plugins/api-metrics.plugin.js +6 -22
- package/dist/analytics/plugins/api-metrics.plugin.js.map +1 -1
- package/dist/analytics/plugins/model-metrics.plugin.d.ts +4 -1
- package/dist/analytics/plugins/model-metrics.plugin.d.ts.map +1 -1
- package/dist/analytics/plugins/model-metrics.plugin.js +7 -17
- package/dist/analytics/plugins/model-metrics.plugin.js.map +1 -1
- package/dist/analytics/plugins/provider-metrics.plugin.d.ts +4 -1
- package/dist/analytics/plugins/provider-metrics.plugin.d.ts.map +1 -1
- package/dist/analytics/plugins/provider-metrics.plugin.js +7 -22
- package/dist/analytics/plugins/provider-metrics.plugin.js.map +1 -1
- package/dist/analytics/plugins/types.d.ts +0 -2
- package/dist/analytics/plugins/types.d.ts.map +1 -1
- package/dist/analytics/plugins/types.js.map +1 -1
- package/dist/analytics/session.d.ts +2 -2
- package/dist/analytics/session.d.ts.map +1 -1
- package/dist/analytics/session.js +3 -3
- package/dist/analytics/session.js.map +1 -1
- package/dist/analytics/types.d.ts +1 -1
- package/dist/analytics/types.d.ts.map +1 -1
- package/dist/cli/commands/analytics.d.ts.map +1 -1
- package/dist/cli/commands/analytics.js +512 -252
- package/dist/cli/commands/analytics.js.map +1 -1
- package/dist/cli/commands/setup.js +70 -1
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/utils/codemie-proxy.d.ts.map +1 -1
- package/dist/utils/codemie-proxy.js +16 -3
- package/dist/utils/codemie-proxy.js.map +1 -1
- package/dist/utils/proxy/http-client.d.ts.map +1 -1
- package/dist/utils/proxy/http-client.js +8 -2
- package/dist/utils/proxy/http-client.js.map +1 -1
- package/dist/utils/proxy/interceptors.d.ts.map +1 -1
- package/dist/utils/proxy/interceptors.js +4 -15
- package/dist/utils/proxy/interceptors.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code Analytics Adapter
|
|
3
|
+
*
|
|
4
|
+
* Extracts analytics data from Claude Code session files stored in:
|
|
5
|
+
* ~/.claude/projects/{projectPath}/{sessionId}.jsonl
|
|
6
|
+
*
|
|
7
|
+
* JSONL Format: One JSON event per line
|
|
8
|
+
* - type: "user" | "assistant" | "file-history-snapshot"
|
|
9
|
+
* - Linked via parentUuid chain
|
|
10
|
+
* - Tool calls embedded in message.content array
|
|
11
|
+
*/
|
|
12
|
+
import { join, extname, basename } from 'node:path';
|
|
13
|
+
import { existsSync } from 'node:fs';
|
|
14
|
+
import { BaseAnalyticsAdapter, resolvePath, findFiles, filterFilesByDate, readJSONL, detectLanguage, detectFormat, countLines, calculateByteSize, calculateFileStats } from '../core/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Claude Code analytics adapter
|
|
17
|
+
*/
|
|
18
|
+
export class ClaudeAnalyticsAdapter extends BaseAnalyticsAdapter {
|
|
19
|
+
constructor(metadata) {
|
|
20
|
+
super(metadata);
|
|
21
|
+
}
|
|
22
|
+
async findSessions(options) {
|
|
23
|
+
const baseDir = resolvePath(this.homePath);
|
|
24
|
+
const projectsDir = join(baseDir, 'projects');
|
|
25
|
+
if (!existsSync(projectsDir)) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
const descriptors = [];
|
|
29
|
+
const sessionMap = new Map();
|
|
30
|
+
// Scan all project directories
|
|
31
|
+
const { readdir } = await import('node:fs/promises');
|
|
32
|
+
try {
|
|
33
|
+
const projectDirs = await readdir(projectsDir, { withFileTypes: true });
|
|
34
|
+
for (const projectDir of projectDirs) {
|
|
35
|
+
if (!projectDir.isDirectory())
|
|
36
|
+
continue;
|
|
37
|
+
const projectPath = join(projectsDir, projectDir.name);
|
|
38
|
+
// Find all JSONL files (main sessions and agent sessions)
|
|
39
|
+
const jsonlFiles = await findFiles(projectPath, /\.jsonl$/);
|
|
40
|
+
// Filter by date if specified
|
|
41
|
+
let filteredFiles = jsonlFiles;
|
|
42
|
+
if (options?.dateFrom || options?.dateTo) {
|
|
43
|
+
filteredFiles = await filterFilesByDate(jsonlFiles, options.dateFrom, options.dateTo);
|
|
44
|
+
}
|
|
45
|
+
// Group files by sessionId
|
|
46
|
+
for (const filePath of filteredFiles) {
|
|
47
|
+
try {
|
|
48
|
+
// Read first few lines to find sessionId (first line might be snapshot without sessionId)
|
|
49
|
+
const events = await readJSONL(filePath, 10);
|
|
50
|
+
if (events.length === 0)
|
|
51
|
+
continue;
|
|
52
|
+
// Find first event with sessionId (has cwd and other metadata)
|
|
53
|
+
const eventWithSession = events.find((e) => e.sessionId);
|
|
54
|
+
if (!eventWithSession)
|
|
55
|
+
continue;
|
|
56
|
+
const sessionId = eventWithSession.sessionId;
|
|
57
|
+
// Check if this is the main session file (named with sessionId)
|
|
58
|
+
const fileName = basename(filePath, '.jsonl');
|
|
59
|
+
const isMainFile = fileName === sessionId;
|
|
60
|
+
// Add to session map (use eventWithSession for metadata, not firstEvent!)
|
|
61
|
+
if (!sessionMap.has(sessionId)) {
|
|
62
|
+
sessionMap.set(sessionId, {
|
|
63
|
+
files: [],
|
|
64
|
+
metadata: {
|
|
65
|
+
cwd: eventWithSession.cwd,
|
|
66
|
+
gitBranch: eventWithSession.gitBranch,
|
|
67
|
+
version: eventWithSession.version,
|
|
68
|
+
timestamp: eventWithSession.timestamp
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Add main file first, agent files after
|
|
73
|
+
if (isMainFile) {
|
|
74
|
+
sessionMap.get(sessionId).files.unshift(filePath);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
sessionMap.get(sessionId).files.push(filePath);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error(`Failed to read session file ${filePath}: ${error}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error(`Error scanning Claude sessions: ${error}`);
|
|
88
|
+
}
|
|
89
|
+
// Convert map to descriptors
|
|
90
|
+
for (const [sessionId, data] of sessionMap.entries()) {
|
|
91
|
+
// Resolve project path from cwd or use encoded directory name
|
|
92
|
+
const projectPath = data.metadata.cwd || '';
|
|
93
|
+
descriptors.push({
|
|
94
|
+
sessionId,
|
|
95
|
+
agent: this.agentName,
|
|
96
|
+
filePaths: data.files,
|
|
97
|
+
metadata: {
|
|
98
|
+
...data.metadata,
|
|
99
|
+
projectPath
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Apply pagination using inherited method
|
|
104
|
+
return this.applyPagination(descriptors, options);
|
|
105
|
+
}
|
|
106
|
+
async extractSession(descriptor) {
|
|
107
|
+
// Read all JSONL files for this session
|
|
108
|
+
const allEvents = [];
|
|
109
|
+
for (const filePath of descriptor.filePaths) {
|
|
110
|
+
const events = await readJSONL(filePath);
|
|
111
|
+
allEvents.push(...events);
|
|
112
|
+
}
|
|
113
|
+
// Extract session metadata from first event
|
|
114
|
+
const firstEvent = allEvents.find(e => e.type === 'user' || e.type === 'assistant') || allEvents[0];
|
|
115
|
+
const lastEvent = allEvents[allEvents.length - 1];
|
|
116
|
+
const startTime = new Date(firstEvent?.timestamp || Date.now());
|
|
117
|
+
const endTime = new Date(lastEvent?.timestamp || Date.now());
|
|
118
|
+
const durationMs = endTime.getTime() - startTime.getTime();
|
|
119
|
+
// Count messages by type
|
|
120
|
+
const userMessages = allEvents.filter(e => e.type === 'user');
|
|
121
|
+
const assistantMessages = allEvents.filter(e => e.type === 'assistant');
|
|
122
|
+
// Extract tool calls and their statuses
|
|
123
|
+
const toolCalls = await this.extractToolCallsFromEvents(allEvents, descriptor.sessionId);
|
|
124
|
+
const successfulToolCalls = toolCalls.filter(tc => tc.status === 'success').length;
|
|
125
|
+
const failedToolCalls = toolCalls.filter(tc => tc.status === 'failure').length;
|
|
126
|
+
// Track tool usage and status
|
|
127
|
+
const toolUsage = {};
|
|
128
|
+
const toolStatus = {};
|
|
129
|
+
for (const tc of toolCalls) {
|
|
130
|
+
toolUsage[tc.toolName] = (toolUsage[tc.toolName] || 0) + 1;
|
|
131
|
+
if (!toolStatus[tc.toolName]) {
|
|
132
|
+
toolStatus[tc.toolName] = { success: 0, failure: 0 };
|
|
133
|
+
}
|
|
134
|
+
if (tc.status === 'success') {
|
|
135
|
+
toolStatus[tc.toolName].success++;
|
|
136
|
+
}
|
|
137
|
+
else if (tc.status === 'failure') {
|
|
138
|
+
toolStatus[tc.toolName].failure++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Track model usage (count messages per model)
|
|
142
|
+
const modelUsage = {};
|
|
143
|
+
for (const event of assistantMessages) {
|
|
144
|
+
if (event.message?.model) {
|
|
145
|
+
modelUsage[event.message.model] = (modelUsage[event.message.model] || 0) + 1;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Extract file modifications
|
|
149
|
+
const fileModifications = await this.extractFileModifications(descriptor);
|
|
150
|
+
// Sum tokens with detailed breakdown
|
|
151
|
+
let totalInputTokens = 0;
|
|
152
|
+
let totalOutputTokens = 0;
|
|
153
|
+
let totalCacheReadTokens = 0;
|
|
154
|
+
let totalCacheCreationTokens = 0;
|
|
155
|
+
let totalTokens = 0;
|
|
156
|
+
for (const event of assistantMessages) {
|
|
157
|
+
if (event.message?.usage) {
|
|
158
|
+
const usage = event.message.usage;
|
|
159
|
+
totalInputTokens += usage.input_tokens || 0;
|
|
160
|
+
totalOutputTokens += usage.output_tokens || 0;
|
|
161
|
+
totalCacheReadTokens += usage.cache_read_input_tokens || 0;
|
|
162
|
+
totalCacheCreationTokens += usage.cache_creation_input_tokens || 0;
|
|
163
|
+
// Total includes all token types
|
|
164
|
+
totalTokens += (usage.input_tokens || 0) +
|
|
165
|
+
(usage.output_tokens || 0) +
|
|
166
|
+
(usage.cache_read_input_tokens || 0) +
|
|
167
|
+
(usage.cache_creation_input_tokens || 0);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Check for errors
|
|
171
|
+
const hadErrors = failedToolCalls > 0;
|
|
172
|
+
// Extract model (from first assistant message)
|
|
173
|
+
const model = assistantMessages.find(m => m.message?.model)?.message?.model || 'claude-sonnet-4-5-20250929';
|
|
174
|
+
// Calculate file statistics using shared utility
|
|
175
|
+
const fileStats = calculateFileStats(fileModifications);
|
|
176
|
+
// Get project path from descriptor metadata or cwd
|
|
177
|
+
const projectPath = descriptor.metadata.projectPath ||
|
|
178
|
+
descriptor.metadata.cwd || '';
|
|
179
|
+
return {
|
|
180
|
+
sessionId: descriptor.sessionId,
|
|
181
|
+
agent: 'claude',
|
|
182
|
+
agentVersion: descriptor.metadata.version || '2.0.0',
|
|
183
|
+
startTime,
|
|
184
|
+
endTime,
|
|
185
|
+
durationMs,
|
|
186
|
+
projectPath,
|
|
187
|
+
gitBranch: descriptor.metadata.gitBranch,
|
|
188
|
+
model,
|
|
189
|
+
provider: 'anthropic',
|
|
190
|
+
userMessageCount: userMessages.length,
|
|
191
|
+
assistantMessageCount: assistantMessages.length,
|
|
192
|
+
toolCallCount: toolCalls.length,
|
|
193
|
+
successfulToolCalls,
|
|
194
|
+
failedToolCalls,
|
|
195
|
+
fileModifications: fileModifications.length,
|
|
196
|
+
toolUsage,
|
|
197
|
+
toolStatus,
|
|
198
|
+
modelUsage,
|
|
199
|
+
tokens: {
|
|
200
|
+
input: totalInputTokens,
|
|
201
|
+
output: totalOutputTokens,
|
|
202
|
+
cacheRead: totalCacheReadTokens,
|
|
203
|
+
cacheCreation: totalCacheCreationTokens,
|
|
204
|
+
total: totalTokens
|
|
205
|
+
},
|
|
206
|
+
hadErrors,
|
|
207
|
+
fileStats
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async extractMessages(descriptor) {
|
|
211
|
+
const allEvents = [];
|
|
212
|
+
for (const filePath of descriptor.filePaths) {
|
|
213
|
+
const events = await readJSONL(filePath);
|
|
214
|
+
allEvents.push(...events);
|
|
215
|
+
}
|
|
216
|
+
const messages = [];
|
|
217
|
+
for (const event of allEvents) {
|
|
218
|
+
if (event.type === 'user' || event.type === 'assistant') {
|
|
219
|
+
// Extract content text
|
|
220
|
+
let content = '';
|
|
221
|
+
if (event.message?.content) {
|
|
222
|
+
if (typeof event.message.content === 'string') {
|
|
223
|
+
content = event.message.content;
|
|
224
|
+
}
|
|
225
|
+
else if (Array.isArray(event.message.content)) {
|
|
226
|
+
// Join text blocks
|
|
227
|
+
content = event.message.content
|
|
228
|
+
.filter((c) => c.type === 'text')
|
|
229
|
+
.map(c => c.text)
|
|
230
|
+
.join('\n');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Extract tool calls from content array
|
|
234
|
+
const toolCalls = [];
|
|
235
|
+
if (Array.isArray(event.message?.content)) {
|
|
236
|
+
const toolUseBlocks = event.message.content.filter((c) => c.type === 'tool_use');
|
|
237
|
+
for (const toolUse of toolUseBlocks) {
|
|
238
|
+
// Find corresponding tool result
|
|
239
|
+
const toolResult = allEvents.find(e => Array.isArray(e.message?.content) &&
|
|
240
|
+
e.message.content.some((c) => c.type === 'tool_result' && c.tool_use_id === toolUse.id));
|
|
241
|
+
const resultBlock = (Array.isArray(toolResult?.message?.content) ?
|
|
242
|
+
toolResult.message.content.find((c) => c.type === 'tool_result' && c.tool_use_id === toolUse.id) : undefined);
|
|
243
|
+
// Detect file modifications
|
|
244
|
+
const modifiedFiles = [];
|
|
245
|
+
if (['Write', 'Edit', 'Create'].some(op => toolUse.name.includes(op))) {
|
|
246
|
+
const filePath = toolUse.input.file_path || toolUse.input.path;
|
|
247
|
+
if (filePath && typeof filePath === 'string') {
|
|
248
|
+
modifiedFiles.push(filePath);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
toolCalls.push({
|
|
252
|
+
toolCallId: toolUse.id,
|
|
253
|
+
messageId: event.uuid,
|
|
254
|
+
sessionId: descriptor.sessionId,
|
|
255
|
+
timestamp: new Date(event.timestamp),
|
|
256
|
+
toolName: toolUse.name,
|
|
257
|
+
toolArgs: toolUse.input,
|
|
258
|
+
status: resultBlock?.is_error ? 'failure' : 'success',
|
|
259
|
+
result: resultBlock?.content,
|
|
260
|
+
modifiedFiles: modifiedFiles.length > 0 ? modifiedFiles : undefined
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
messages.push({
|
|
265
|
+
messageId: event.uuid,
|
|
266
|
+
sessionId: descriptor.sessionId,
|
|
267
|
+
timestamp: new Date(event.timestamp),
|
|
268
|
+
role: event.message?.role || 'user',
|
|
269
|
+
content,
|
|
270
|
+
tokens: event.message?.usage ? {
|
|
271
|
+
input: event.message.usage.input_tokens,
|
|
272
|
+
output: event.message.usage.output_tokens,
|
|
273
|
+
cacheRead: event.message.usage.cache_read_input_tokens,
|
|
274
|
+
cacheCreation: event.message.usage.cache_creation_input_tokens,
|
|
275
|
+
total: (event.message.usage.input_tokens || 0) +
|
|
276
|
+
(event.message.usage.output_tokens || 0) +
|
|
277
|
+
(event.message.usage.cache_read_input_tokens || 0) +
|
|
278
|
+
(event.message.usage.cache_creation_input_tokens || 0)
|
|
279
|
+
} : undefined,
|
|
280
|
+
model: event.message?.model,
|
|
281
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : undefined
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return messages;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Extract tool calls from events (internal helper)
|
|
289
|
+
*/
|
|
290
|
+
async extractToolCallsFromEvents(events, sessionId) {
|
|
291
|
+
const toolCalls = [];
|
|
292
|
+
for (const event of events) {
|
|
293
|
+
if (Array.isArray(event.message?.content)) {
|
|
294
|
+
const toolUseBlocks = event.message.content.filter((c) => c.type === 'tool_use');
|
|
295
|
+
for (const toolUse of toolUseBlocks) {
|
|
296
|
+
// Find corresponding tool result
|
|
297
|
+
const toolResult = events.find(e => Array.isArray(e.message?.content) &&
|
|
298
|
+
e.message.content.some((c) => c.type === 'tool_result' && c.tool_use_id === toolUse.id));
|
|
299
|
+
const resultBlock = (Array.isArray(toolResult?.message?.content) ?
|
|
300
|
+
toolResult.message.content.find((c) => c.type === 'tool_result' && c.tool_use_id === toolUse.id) : undefined);
|
|
301
|
+
// Detect file modifications
|
|
302
|
+
const modifiedFiles = [];
|
|
303
|
+
if (['Write', 'Edit', 'Create'].some(op => toolUse.name.includes(op))) {
|
|
304
|
+
const filePath = toolUse.input.file_path || toolUse.input.path;
|
|
305
|
+
if (filePath && typeof filePath === 'string') {
|
|
306
|
+
modifiedFiles.push(filePath);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
toolCalls.push({
|
|
310
|
+
toolCallId: toolUse.id,
|
|
311
|
+
messageId: event.uuid,
|
|
312
|
+
sessionId,
|
|
313
|
+
timestamp: new Date(event.timestamp),
|
|
314
|
+
toolName: toolUse.name,
|
|
315
|
+
toolArgs: toolUse.input,
|
|
316
|
+
status: resultBlock?.is_error ? 'failure' : 'success',
|
|
317
|
+
result: resultBlock?.content,
|
|
318
|
+
modifiedFiles: modifiedFiles.length > 0 ? modifiedFiles : undefined
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return toolCalls;
|
|
324
|
+
}
|
|
325
|
+
async extractToolCalls(descriptor) {
|
|
326
|
+
const allEvents = [];
|
|
327
|
+
for (const filePath of descriptor.filePaths) {
|
|
328
|
+
const events = await readJSONL(filePath);
|
|
329
|
+
allEvents.push(...events);
|
|
330
|
+
}
|
|
331
|
+
return this.extractToolCallsFromEvents(allEvents, descriptor.sessionId);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Calculate metrics for Write operations
|
|
335
|
+
*/
|
|
336
|
+
calculateWriteMetrics(toolUse, result) {
|
|
337
|
+
const content = toolUse.input.content || '';
|
|
338
|
+
const lines = countLines(content);
|
|
339
|
+
const bytes = calculateByteSize(content);
|
|
340
|
+
// Check if file was newly created (from result message)
|
|
341
|
+
let wasNewFile = false;
|
|
342
|
+
if (result && typeof result.content === 'string') {
|
|
343
|
+
wasNewFile = result.content.toLowerCase().includes('created') ||
|
|
344
|
+
result.content.toLowerCase().includes('new file');
|
|
345
|
+
}
|
|
346
|
+
return {
|
|
347
|
+
linesAdded: lines,
|
|
348
|
+
linesRemoved: wasNewFile ? 0 : 0, // Can't determine removed lines without file system access
|
|
349
|
+
linesModified: 0,
|
|
350
|
+
sizeBytes: bytes,
|
|
351
|
+
wasNewFile
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Calculate metrics for Edit operations
|
|
356
|
+
*/
|
|
357
|
+
calculateEditMetrics(toolUse) {
|
|
358
|
+
const oldString = toolUse.input.old_string || '';
|
|
359
|
+
const newString = toolUse.input.new_string || '';
|
|
360
|
+
const oldLines = countLines(oldString);
|
|
361
|
+
const newLines = countLines(newString);
|
|
362
|
+
return {
|
|
363
|
+
linesAdded: Math.max(0, newLines - oldLines),
|
|
364
|
+
linesRemoved: Math.max(0, oldLines - newLines),
|
|
365
|
+
linesModified: Math.min(oldLines, newLines),
|
|
366
|
+
wasNewFile: false // edit only works on existing files
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
async extractFileModifications(descriptor) {
|
|
370
|
+
const allEvents = [];
|
|
371
|
+
for (const filePath of descriptor.filePaths) {
|
|
372
|
+
const events = await readJSONL(filePath);
|
|
373
|
+
allEvents.push(...events);
|
|
374
|
+
}
|
|
375
|
+
const modifications = [];
|
|
376
|
+
// Extract from tool calls
|
|
377
|
+
for (const event of allEvents) {
|
|
378
|
+
if (Array.isArray(event.message?.content)) {
|
|
379
|
+
const toolUseBlocks = event.message.content.filter((c) => c.type === 'tool_use');
|
|
380
|
+
for (const toolUse of toolUseBlocks) {
|
|
381
|
+
// Check if this is a file modification tool
|
|
382
|
+
if (['Write', 'Edit', 'Create', 'NotebookEdit'].some(op => toolUse.name.includes(op))) {
|
|
383
|
+
const targetFilePath = toolUse.input.file_path ||
|
|
384
|
+
toolUse.input.path ||
|
|
385
|
+
toolUse.input.notebook_path;
|
|
386
|
+
if (!targetFilePath)
|
|
387
|
+
continue;
|
|
388
|
+
// Find corresponding result
|
|
389
|
+
const toolResult = allEvents.find(e => Array.isArray(e.message?.content) &&
|
|
390
|
+
e.message.content.some((c) => c.type === 'tool_result' && c.tool_use_id === toolUse.id));
|
|
391
|
+
const resultBlock = (Array.isArray(toolResult?.message?.content) ?
|
|
392
|
+
toolResult.message.content.find((c) => c.type === 'tool_result' && c.tool_use_id === toolUse.id) : undefined);
|
|
393
|
+
// Calculate metrics based on tool type
|
|
394
|
+
let metrics;
|
|
395
|
+
if (toolUse.name.includes('Write') || toolUse.name.includes('Create')) {
|
|
396
|
+
metrics = this.calculateWriteMetrics(toolUse, resultBlock);
|
|
397
|
+
}
|
|
398
|
+
else if (toolUse.name.includes('Edit')) {
|
|
399
|
+
metrics = {
|
|
400
|
+
...this.calculateEditMetrics(toolUse),
|
|
401
|
+
sizeBytes: toolUse.input.new_string ?
|
|
402
|
+
calculateByteSize(toolUse.input.new_string) :
|
|
403
|
+
undefined
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
continue; // Skip unknown tools
|
|
408
|
+
}
|
|
409
|
+
// Determine operation type
|
|
410
|
+
let operation = 'update';
|
|
411
|
+
if (metrics.wasNewFile || toolUse.name.includes('Create')) {
|
|
412
|
+
operation = 'create';
|
|
413
|
+
}
|
|
414
|
+
else if (toolUse.name.includes('Delete')) {
|
|
415
|
+
operation = 'delete';
|
|
416
|
+
}
|
|
417
|
+
// Detect language and format
|
|
418
|
+
const fileExtension = extname(targetFilePath);
|
|
419
|
+
const language = detectLanguage(targetFilePath);
|
|
420
|
+
const format = detectFormat(targetFilePath);
|
|
421
|
+
modifications.push({
|
|
422
|
+
sessionId: descriptor.sessionId,
|
|
423
|
+
toolCallId: toolUse.id,
|
|
424
|
+
timestamp: new Date(event.timestamp),
|
|
425
|
+
filePath: targetFilePath,
|
|
426
|
+
operation,
|
|
427
|
+
linesAdded: metrics.linesAdded,
|
|
428
|
+
linesRemoved: metrics.linesRemoved,
|
|
429
|
+
linesModified: metrics.linesModified,
|
|
430
|
+
sizeBytes: metrics.sizeBytes,
|
|
431
|
+
toolName: toolUse.name,
|
|
432
|
+
wasNewFile: metrics.wasNewFile,
|
|
433
|
+
fileExtension,
|
|
434
|
+
language,
|
|
435
|
+
format
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// Also extract from file-history-snapshot events (alternative source)
|
|
442
|
+
const snapshotEvents = allEvents.filter(e => e.type === 'file-history-snapshot');
|
|
443
|
+
for (const event of snapshotEvents) {
|
|
444
|
+
if (event.snapshot?.trackedFileBackups) {
|
|
445
|
+
// Each backup represents a modification
|
|
446
|
+
for (const [filePath] of Object.entries(event.snapshot.trackedFileBackups)) {
|
|
447
|
+
const fileExtension = extname(filePath);
|
|
448
|
+
const language = detectLanguage(filePath);
|
|
449
|
+
const format = detectFormat(filePath);
|
|
450
|
+
modifications.push({
|
|
451
|
+
sessionId: descriptor.sessionId,
|
|
452
|
+
toolCallId: event.uuid,
|
|
453
|
+
timestamp: new Date(event.snapshot.timestamp),
|
|
454
|
+
filePath,
|
|
455
|
+
operation: 'update',
|
|
456
|
+
linesAdded: 0, // Can't determine from snapshot
|
|
457
|
+
linesRemoved: 0,
|
|
458
|
+
linesModified: 0,
|
|
459
|
+
toolName: 'file-history-snapshot',
|
|
460
|
+
wasNewFile: false,
|
|
461
|
+
fileExtension,
|
|
462
|
+
language,
|
|
463
|
+
format
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return modifications;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
//# sourceMappingURL=claude.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.adapter.js","sourceRoot":"","sources":["../../../../src/analytics/aggregation/adapters/claude.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Analytics Adapter
|
|
3
|
+
*
|
|
4
|
+
* Extracts analytics data from Codex session files stored in:
|
|
5
|
+
* ~/.codex/sessions/YYYY/MM/DD/rollout-{timestamp}-{sessionId}.jsonl
|
|
6
|
+
*
|
|
7
|
+
* JSONL Format: One JSON event per line
|
|
8
|
+
* - Event types: session_meta, response_item, event_msg, turn_context, ghost_snapshot
|
|
9
|
+
* - Token usage: NOT directly tracked (need to infer or integrate with API)
|
|
10
|
+
* - File modifications: tracked via ghost_snapshot events
|
|
11
|
+
*/
|
|
12
|
+
import { BaseAnalyticsAdapter, AdapterMetadata } from '../core/index.js';
|
|
13
|
+
import { SessionQueryOptions, SessionDescriptor, CodemieSession, CodemieMessage, CodemieToolCall, CodemieFileModification } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Codex analytics adapter
|
|
16
|
+
*/
|
|
17
|
+
export declare class CodexAnalyticsAdapter extends BaseAnalyticsAdapter {
|
|
18
|
+
constructor(metadata: AdapterMetadata);
|
|
19
|
+
findSessions(options?: SessionQueryOptions): Promise<SessionDescriptor[]>;
|
|
20
|
+
extractSession(descriptor: SessionDescriptor): Promise<CodemieSession>;
|
|
21
|
+
extractMessages(descriptor: SessionDescriptor): Promise<CodemieMessage[]>;
|
|
22
|
+
extractToolCalls(descriptor: SessionDescriptor): Promise<CodemieToolCall[]>;
|
|
23
|
+
extractFileModifications(descriptor: SessionDescriptor): Promise<CodemieFileModification[]>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=codex.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.adapter.d.ts","sourceRoot":"","sources":["../../../../src/analytics/aggregation/adapters/codex.adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EACL,oBAAoB,EACpB,eAAe,EAQhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,eAAe,EACf,uBAAuB,EACxB,MAAM,aAAa,CAAC;AA+DrB;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,oBAAoB;gBACjD,QAAQ,EAAE,eAAe;IAI/B,YAAY,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAmFzE,cAAc,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAgJtE,eAAe,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAkCzE,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAwD3E,wBAAwB,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAqGlG"}
|