@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.
Files changed (124) hide show
  1. package/README.md +65 -778
  2. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  3. package/dist/agents/core/BaseAgentAdapter.js +31 -3
  4. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  5. package/dist/agents/core/types.d.ts +18 -0
  6. package/dist/agents/core/types.d.ts.map +1 -1
  7. package/dist/agents/plugins/claude.plugin.d.ts +0 -3
  8. package/dist/agents/plugins/claude.plugin.d.ts.map +1 -1
  9. package/dist/agents/plugins/claude.plugin.js +12 -1
  10. package/dist/agents/plugins/claude.plugin.js.map +1 -1
  11. package/dist/agents/plugins/codex.plugin.d.ts.map +1 -1
  12. package/dist/agents/plugins/codex.plugin.js +40 -4
  13. package/dist/agents/plugins/codex.plugin.js.map +1 -1
  14. package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -1
  15. package/dist/agents/plugins/gemini.plugin.js +50 -5
  16. package/dist/agents/plugins/gemini.plugin.js.map +1 -1
  17. package/dist/agents/registry.d.ts +15 -2
  18. package/dist/agents/registry.d.ts.map +1 -1
  19. package/dist/agents/registry.js +30 -6
  20. package/dist/agents/registry.js.map +1 -1
  21. package/dist/analytics/aggregation/adapters/claude.adapter.d.ts +37 -0
  22. package/dist/analytics/aggregation/adapters/claude.adapter.d.ts.map +1 -0
  23. package/dist/analytics/aggregation/adapters/claude.adapter.js +471 -0
  24. package/dist/analytics/aggregation/adapters/claude.adapter.js.map +1 -0
  25. package/dist/analytics/aggregation/adapters/codex.adapter.d.ts +25 -0
  26. package/dist/analytics/aggregation/adapters/codex.adapter.d.ts.map +1 -0
  27. package/dist/analytics/aggregation/adapters/codex.adapter.js +376 -0
  28. package/dist/analytics/aggregation/adapters/codex.adapter.js.map +1 -0
  29. package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts +28 -0
  30. package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts.map +1 -0
  31. package/dist/analytics/aggregation/adapters/gemini.adapter.js +320 -0
  32. package/dist/analytics/aggregation/adapters/gemini.adapter.js.map +1 -0
  33. package/dist/analytics/aggregation/adapters/index.d.ts +7 -0
  34. package/dist/analytics/aggregation/adapters/index.d.ts.map +1 -0
  35. package/dist/analytics/aggregation/adapters/index.js +7 -0
  36. package/dist/analytics/aggregation/adapters/index.js.map +1 -0
  37. package/dist/analytics/aggregation/aggregator.d.ts +49 -0
  38. package/dist/analytics/aggregation/aggregator.d.ts.map +1 -0
  39. package/dist/analytics/aggregation/aggregator.js +239 -0
  40. package/dist/analytics/aggregation/aggregator.js.map +1 -0
  41. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts +63 -0
  42. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts.map +1 -0
  43. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js +58 -0
  44. package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js.map +1 -0
  45. package/dist/analytics/aggregation/core/adapter.interface.d.ts +65 -0
  46. package/dist/analytics/aggregation/core/adapter.interface.d.ts.map +1 -0
  47. package/dist/analytics/aggregation/core/adapter.interface.js +9 -0
  48. package/dist/analytics/aggregation/core/adapter.interface.js.map +1 -0
  49. package/dist/analytics/aggregation/core/aggregation-utils.d.ts +66 -0
  50. package/dist/analytics/aggregation/core/aggregation-utils.d.ts.map +1 -0
  51. package/dist/analytics/aggregation/core/aggregation-utils.js +83 -0
  52. package/dist/analytics/aggregation/core/aggregation-utils.js.map +1 -0
  53. package/dist/analytics/aggregation/core/discovery.d.ts +40 -0
  54. package/dist/analytics/aggregation/core/discovery.d.ts.map +1 -0
  55. package/dist/analytics/aggregation/core/discovery.js +132 -0
  56. package/dist/analytics/aggregation/core/discovery.js.map +1 -0
  57. package/dist/analytics/aggregation/core/file-utils.d.ts +23 -0
  58. package/dist/analytics/aggregation/core/file-utils.d.ts.map +1 -0
  59. package/dist/analytics/aggregation/core/file-utils.js +208 -0
  60. package/dist/analytics/aggregation/core/file-utils.js.map +1 -0
  61. package/dist/analytics/aggregation/core/index.d.ts +11 -0
  62. package/dist/analytics/aggregation/core/index.d.ts.map +1 -0
  63. package/dist/analytics/aggregation/core/index.js +11 -0
  64. package/dist/analytics/aggregation/core/index.js.map +1 -0
  65. package/dist/analytics/aggregation/core/project-mapping.d.ts +50 -0
  66. package/dist/analytics/aggregation/core/project-mapping.d.ts.map +1 -0
  67. package/dist/analytics/aggregation/core/project-mapping.js +102 -0
  68. package/dist/analytics/aggregation/core/project-mapping.js.map +1 -0
  69. package/dist/analytics/aggregation/core/streaming.d.ts +26 -0
  70. package/dist/analytics/aggregation/core/streaming.d.ts.map +1 -0
  71. package/dist/analytics/aggregation/core/streaming.js +58 -0
  72. package/dist/analytics/aggregation/core/streaming.js.map +1 -0
  73. package/dist/analytics/aggregation/index.d.ts +8 -0
  74. package/dist/analytics/aggregation/index.d.ts.map +1 -0
  75. package/dist/analytics/aggregation/index.js +8 -0
  76. package/dist/analytics/aggregation/index.js.map +1 -0
  77. package/dist/analytics/aggregation/types.d.ts +258 -0
  78. package/dist/analytics/aggregation/types.d.ts.map +1 -0
  79. package/dist/analytics/aggregation/types.js +8 -0
  80. package/dist/analytics/aggregation/types.js.map +1 -0
  81. package/dist/analytics/config.d.ts +1 -0
  82. package/dist/analytics/config.d.ts.map +1 -1
  83. package/dist/analytics/config.js +20 -1
  84. package/dist/analytics/config.js.map +1 -1
  85. package/dist/analytics/index.d.ts +0 -9
  86. package/dist/analytics/index.d.ts.map +1 -1
  87. package/dist/analytics/index.js +14 -48
  88. package/dist/analytics/index.js.map +1 -1
  89. package/dist/analytics/plugins/api-metrics.plugin.d.ts +4 -1
  90. package/dist/analytics/plugins/api-metrics.plugin.d.ts.map +1 -1
  91. package/dist/analytics/plugins/api-metrics.plugin.js +6 -22
  92. package/dist/analytics/plugins/api-metrics.plugin.js.map +1 -1
  93. package/dist/analytics/plugins/model-metrics.plugin.d.ts +4 -1
  94. package/dist/analytics/plugins/model-metrics.plugin.d.ts.map +1 -1
  95. package/dist/analytics/plugins/model-metrics.plugin.js +7 -17
  96. package/dist/analytics/plugins/model-metrics.plugin.js.map +1 -1
  97. package/dist/analytics/plugins/provider-metrics.plugin.d.ts +4 -1
  98. package/dist/analytics/plugins/provider-metrics.plugin.d.ts.map +1 -1
  99. package/dist/analytics/plugins/provider-metrics.plugin.js +7 -22
  100. package/dist/analytics/plugins/provider-metrics.plugin.js.map +1 -1
  101. package/dist/analytics/plugins/types.d.ts +0 -2
  102. package/dist/analytics/plugins/types.d.ts.map +1 -1
  103. package/dist/analytics/plugins/types.js.map +1 -1
  104. package/dist/analytics/session.d.ts +2 -2
  105. package/dist/analytics/session.d.ts.map +1 -1
  106. package/dist/analytics/session.js +3 -3
  107. package/dist/analytics/session.js.map +1 -1
  108. package/dist/analytics/types.d.ts +1 -1
  109. package/dist/analytics/types.d.ts.map +1 -1
  110. package/dist/cli/commands/analytics.d.ts.map +1 -1
  111. package/dist/cli/commands/analytics.js +512 -252
  112. package/dist/cli/commands/analytics.js.map +1 -1
  113. package/dist/cli/commands/setup.js +70 -1
  114. package/dist/cli/commands/setup.js.map +1 -1
  115. package/dist/utils/codemie-proxy.d.ts.map +1 -1
  116. package/dist/utils/codemie-proxy.js +16 -3
  117. package/dist/utils/codemie-proxy.js.map +1 -1
  118. package/dist/utils/proxy/http-client.d.ts.map +1 -1
  119. package/dist/utils/proxy/http-client.js +8 -2
  120. package/dist/utils/proxy/http-client.js.map +1 -1
  121. package/dist/utils/proxy/interceptors.d.ts.map +1 -1
  122. package/dist/utils/proxy/interceptors.js +4 -15
  123. package/dist/utils/proxy/interceptors.js.map +1 -1
  124. 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"}