claudecto 0.1.0

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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +275 -0
  3. package/dist/__tests__/package.test.d.ts +2 -0
  4. package/dist/__tests__/package.test.d.ts.map +1 -0
  5. package/dist/__tests__/package.test.js +53 -0
  6. package/dist/__tests__/package.test.js.map +1 -0
  7. package/dist/cli.d.ts +6 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +200 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/index.d.ts +12 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +12 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/server/index.d.ts +11 -0
  16. package/dist/server/index.d.ts.map +1 -0
  17. package/dist/server/index.js +1207 -0
  18. package/dist/server/index.js.map +1 -0
  19. package/dist/services/advisor.d.ts +117 -0
  20. package/dist/services/advisor.d.ts.map +1 -0
  21. package/dist/services/advisor.js +2636 -0
  22. package/dist/services/advisor.js.map +1 -0
  23. package/dist/services/agent-generator.d.ts +71 -0
  24. package/dist/services/agent-generator.d.ts.map +1 -0
  25. package/dist/services/agent-generator.js +295 -0
  26. package/dist/services/agent-generator.js.map +1 -0
  27. package/dist/services/agents.d.ts +67 -0
  28. package/dist/services/agents.d.ts.map +1 -0
  29. package/dist/services/agents.js +405 -0
  30. package/dist/services/agents.js.map +1 -0
  31. package/dist/services/analytics.d.ts +145 -0
  32. package/dist/services/analytics.d.ts.map +1 -0
  33. package/dist/services/analytics.js +609 -0
  34. package/dist/services/analytics.js.map +1 -0
  35. package/dist/services/blueprints.d.ts +31 -0
  36. package/dist/services/blueprints.d.ts.map +1 -0
  37. package/dist/services/blueprints.js +317 -0
  38. package/dist/services/blueprints.js.map +1 -0
  39. package/dist/services/claude-dir.d.ts +50 -0
  40. package/dist/services/claude-dir.d.ts.map +1 -0
  41. package/dist/services/claude-dir.js +193 -0
  42. package/dist/services/claude-dir.js.map +1 -0
  43. package/dist/services/hooks.d.ts +38 -0
  44. package/dist/services/hooks.d.ts.map +1 -0
  45. package/dist/services/hooks.js +165 -0
  46. package/dist/services/hooks.js.map +1 -0
  47. package/dist/services/insights.d.ts +52 -0
  48. package/dist/services/insights.d.ts.map +1 -0
  49. package/dist/services/insights.js +1035 -0
  50. package/dist/services/insights.js.map +1 -0
  51. package/dist/services/memory.d.ts +14 -0
  52. package/dist/services/memory.d.ts.map +1 -0
  53. package/dist/services/memory.js +25 -0
  54. package/dist/services/memory.js.map +1 -0
  55. package/dist/services/plans.d.ts +20 -0
  56. package/dist/services/plans.d.ts.map +1 -0
  57. package/dist/services/plans.js +149 -0
  58. package/dist/services/plans.js.map +1 -0
  59. package/dist/services/project-intelligence.d.ts +75 -0
  60. package/dist/services/project-intelligence.d.ts.map +1 -0
  61. package/dist/services/project-intelligence.js +731 -0
  62. package/dist/services/project-intelligence.js.map +1 -0
  63. package/dist/services/search.d.ts +32 -0
  64. package/dist/services/search.d.ts.map +1 -0
  65. package/dist/services/search.js +203 -0
  66. package/dist/services/search.js.map +1 -0
  67. package/dist/services/sessions.d.ts +25 -0
  68. package/dist/services/sessions.d.ts.map +1 -0
  69. package/dist/services/sessions.js +248 -0
  70. package/dist/services/sessions.js.map +1 -0
  71. package/dist/services/skills.d.ts +30 -0
  72. package/dist/services/skills.d.ts.map +1 -0
  73. package/dist/services/skills.js +197 -0
  74. package/dist/services/skills.js.map +1 -0
  75. package/dist/services/stats.d.ts +23 -0
  76. package/dist/services/stats.d.ts.map +1 -0
  77. package/dist/services/stats.js +88 -0
  78. package/dist/services/stats.js.map +1 -0
  79. package/dist/services/teams.d.ts +115 -0
  80. package/dist/services/teams.d.ts.map +1 -0
  81. package/dist/services/teams.js +421 -0
  82. package/dist/services/teams.js.map +1 -0
  83. package/dist/services/tech-stack.d.ts +98 -0
  84. package/dist/services/tech-stack.d.ts.map +1 -0
  85. package/dist/services/tech-stack.js +1088 -0
  86. package/dist/services/tech-stack.js.map +1 -0
  87. package/dist/services/terminal.d.ts +75 -0
  88. package/dist/services/terminal.d.ts.map +1 -0
  89. package/dist/services/terminal.js +224 -0
  90. package/dist/services/terminal.js.map +1 -0
  91. package/dist/types.d.ts +1095 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +18 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/ui/assets/index-BiH4Nhdk.css +1 -0
  96. package/dist/ui/assets/index-Brv-K8bd.css +1 -0
  97. package/dist/ui/assets/index-BwMBEdQz.js +3108 -0
  98. package/dist/ui/assets/index-BwMBEdQz.js.map +1 -0
  99. package/dist/ui/assets/index-CEWz7ABD.js +3108 -0
  100. package/dist/ui/assets/index-CEWz7ABD.js.map +1 -0
  101. package/dist/ui/assets/index-CIZ3vvc-.css +1 -0
  102. package/dist/ui/assets/index-CsU3cI0n.js +3108 -0
  103. package/dist/ui/assets/index-CsU3cI0n.js.map +1 -0
  104. package/dist/ui/assets/index-D3AY6iCS.js +3133 -0
  105. package/dist/ui/assets/index-D3AY6iCS.js.map +1 -0
  106. package/dist/ui/assets/index-D8lNZ0Ye.css +1 -0
  107. package/dist/ui/assets/index-DmgeppSA.js +3108 -0
  108. package/dist/ui/assets/index-DmgeppSA.js.map +1 -0
  109. package/dist/ui/favicon.svg +43 -0
  110. package/dist/ui/index.html +23 -0
  111. package/dist/utils/jsonl.d.ts +16 -0
  112. package/dist/utils/jsonl.d.ts.map +1 -0
  113. package/dist/utils/jsonl.js +51 -0
  114. package/dist/utils/jsonl.js.map +1 -0
  115. package/package.json +106 -0
@@ -0,0 +1,609 @@
1
+ /**
2
+ * Analytics service - Real token usage and cost tracking from JSONL session data
3
+ */
4
+ import { parseJSONL } from '../utils/jsonl.js';
5
+ // ============================================================================
6
+ // Pricing (per 1M tokens) - Updated Jan 2025
7
+ // ============================================================================
8
+ export const MODEL_PRICING = {
9
+ // Claude 4.5 family (current models as of Jan 2025)
10
+ 'claude-opus-4-5-20251101': { input: 15, output: 75, cacheWrite: 18.75, cacheRead: 1.50 },
11
+ 'claude-sonnet-4-5-20250929': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.30 },
12
+ 'claude-haiku-4-5-20251001': { input: 1, output: 5, cacheWrite: 1.25, cacheRead: 0.10 },
13
+ // Claude 4 family
14
+ 'claude-sonnet-4-20250514': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.30 },
15
+ 'claude-opus-4-20250514': { input: 15, output: 75, cacheWrite: 18.75, cacheRead: 1.50 },
16
+ // Claude 3.5 family
17
+ 'claude-3-5-sonnet-20241022': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.30 },
18
+ 'claude-3-5-sonnet-20240620': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.30 },
19
+ 'claude-3-5-haiku-20241022': { input: 0.80, output: 4, cacheWrite: 1, cacheRead: 0.08 },
20
+ // Claude 3 family
21
+ 'claude-3-opus-20240229': { input: 15, output: 75, cacheWrite: 18.75, cacheRead: 1.50 },
22
+ 'claude-3-sonnet-20240229': { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.30 },
23
+ 'claude-3-haiku-20240307': { input: 0.25, output: 1.25, cacheWrite: 0.30, cacheRead: 0.03 },
24
+ };
25
+ // Default pricing for unknown models (use Sonnet pricing as baseline)
26
+ const DEFAULT_PRICING = { input: 3, output: 15, cacheWrite: 3.75, cacheRead: 0.30 };
27
+ // ============================================================================
28
+ // Analytics Service
29
+ // ============================================================================
30
+ export class AnalyticsService {
31
+ claudeDir;
32
+ constructor(claudeDir) {
33
+ this.claudeDir = claudeDir;
34
+ }
35
+ // --------------------------------------------------------------------------
36
+ // Cost Calculation
37
+ // --------------------------------------------------------------------------
38
+ getPricing(model) {
39
+ // Try exact match first
40
+ if (MODEL_PRICING[model]) {
41
+ return MODEL_PRICING[model];
42
+ }
43
+ // Try partial match (handle model variants)
44
+ for (const [key, pricing] of Object.entries(MODEL_PRICING)) {
45
+ if (model.includes(key) || key.includes(model)) {
46
+ return pricing;
47
+ }
48
+ }
49
+ // Infer from model name
50
+ if (model.includes('opus')) {
51
+ return MODEL_PRICING['claude-3-opus-20240229'] ?? DEFAULT_PRICING;
52
+ }
53
+ if (model.includes('haiku')) {
54
+ return MODEL_PRICING['claude-3-5-haiku-20241022'] ?? DEFAULT_PRICING;
55
+ }
56
+ return DEFAULT_PRICING;
57
+ }
58
+ calculateCost(tokens, model) {
59
+ const pricing = this.getPricing(model);
60
+ const million = 1_000_000;
61
+ return {
62
+ inputCost: (tokens.inputTokens / million) * pricing.input,
63
+ outputCost: (tokens.outputTokens / million) * pricing.output,
64
+ cacheWriteCost: (tokens.cacheCreationTokens / million) * pricing.cacheWrite,
65
+ cacheReadCost: (tokens.cacheReadTokens / million) * pricing.cacheRead,
66
+ totalCost: (tokens.inputTokens / million) * pricing.input +
67
+ (tokens.outputTokens / million) * pricing.output +
68
+ (tokens.cacheCreationTokens / million) * pricing.cacheWrite +
69
+ (tokens.cacheReadTokens / million) * pricing.cacheRead,
70
+ };
71
+ }
72
+ // --------------------------------------------------------------------------
73
+ // Session Analytics
74
+ // --------------------------------------------------------------------------
75
+ async getSessionAnalytics(filePath, projectDir) {
76
+ const tokens = {
77
+ inputTokens: 0,
78
+ outputTokens: 0,
79
+ cacheCreationTokens: 0,
80
+ cacheReadTokens: 0,
81
+ totalTokens: 0,
82
+ };
83
+ const modelUsageMap = new Map();
84
+ const toolUsageMap = new Map();
85
+ const toolResultMap = new Map(); // tool_use_id -> success
86
+ let sessionId = '';
87
+ let startedAt = '';
88
+ let endedAt = '';
89
+ let messageCount = 0;
90
+ let userMessageCount = 0;
91
+ let assistantMessageCount = 0;
92
+ for await (const msg of parseJSONL(filePath)) {
93
+ if (msg.type === 'file-history-snapshot')
94
+ continue;
95
+ messageCount++;
96
+ if (msg.type === 'user') {
97
+ userMessageCount++;
98
+ if (!sessionId) {
99
+ sessionId = msg.sessionId;
100
+ startedAt = msg.timestamp;
101
+ }
102
+ endedAt = msg.timestamp;
103
+ // Track tool results
104
+ if (Array.isArray(msg.message.content)) {
105
+ for (const content of msg.message.content) {
106
+ if (content.type === 'tool_result') {
107
+ // Check if result indicates failure (error in content)
108
+ const isError = typeof content.content === 'string' &&
109
+ (content.content.includes('Error:') || content.content.includes('error:'));
110
+ toolResultMap.set(content.tool_use_id, !isError);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ else if (msg.type === 'assistant') {
116
+ assistantMessageCount++;
117
+ endedAt = msg.timestamp;
118
+ const assistantMsg = msg;
119
+ const model = assistantMsg.message.model ?? 'unknown';
120
+ const usage = assistantMsg.message.usage;
121
+ if (usage) {
122
+ // Aggregate tokens
123
+ tokens.inputTokens += usage.input_tokens ?? 0;
124
+ tokens.outputTokens += usage.output_tokens ?? 0;
125
+ tokens.cacheCreationTokens += usage.cache_creation_input_tokens ?? 0;
126
+ tokens.cacheReadTokens += usage.cache_read_input_tokens ?? 0;
127
+ // Track per-model usage
128
+ let modelUsage = modelUsageMap.get(model);
129
+ if (!modelUsage) {
130
+ modelUsage = {
131
+ model,
132
+ tokens: { inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, totalTokens: 0 },
133
+ cost: { inputCost: 0, outputCost: 0, cacheWriteCost: 0, cacheReadCost: 0, totalCost: 0 },
134
+ messageCount: 0,
135
+ };
136
+ modelUsageMap.set(model, modelUsage);
137
+ }
138
+ modelUsage.tokens.inputTokens += usage.input_tokens ?? 0;
139
+ modelUsage.tokens.outputTokens += usage.output_tokens ?? 0;
140
+ modelUsage.tokens.cacheCreationTokens += usage.cache_creation_input_tokens ?? 0;
141
+ modelUsage.tokens.cacheReadTokens += usage.cache_read_input_tokens ?? 0;
142
+ modelUsage.messageCount++;
143
+ }
144
+ // Track tool usage
145
+ for (const content of assistantMsg.message.content) {
146
+ if (content.type === 'tool_use' && content.name) {
147
+ let toolUsage = toolUsageMap.get(content.name);
148
+ if (!toolUsage) {
149
+ toolUsage = { toolName: content.name, count: 0, successCount: 0, failureCount: 0 };
150
+ toolUsageMap.set(content.name, toolUsage);
151
+ }
152
+ toolUsage.count++;
153
+ // We'll update success/failure after processing tool results
154
+ if (content.id) {
155
+ // Store for later success/failure tracking
156
+ const key = `${content.name}:${content.id}`;
157
+ toolResultMap.set(key, true); // Default to pending
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ if (!sessionId)
164
+ return null;
165
+ // Calculate totals
166
+ tokens.totalTokens = tokens.inputTokens + tokens.outputTokens +
167
+ tokens.cacheCreationTokens + tokens.cacheReadTokens;
168
+ // Calculate costs for each model
169
+ for (const modelUsage of modelUsageMap.values()) {
170
+ modelUsage.tokens.totalTokens = modelUsage.tokens.inputTokens + modelUsage.tokens.outputTokens +
171
+ modelUsage.tokens.cacheCreationTokens + modelUsage.tokens.cacheReadTokens;
172
+ modelUsage.cost = this.calculateCost(modelUsage.tokens, modelUsage.model);
173
+ }
174
+ // Calculate total cost (weighted by model)
175
+ const totalCost = { inputCost: 0, outputCost: 0, cacheWriteCost: 0, cacheReadCost: 0, totalCost: 0 };
176
+ for (const modelUsage of modelUsageMap.values()) {
177
+ totalCost.inputCost += modelUsage.cost.inputCost;
178
+ totalCost.outputCost += modelUsage.cost.outputCost;
179
+ totalCost.cacheWriteCost += modelUsage.cost.cacheWriteCost;
180
+ totalCost.cacheReadCost += modelUsage.cost.cacheReadCost;
181
+ totalCost.totalCost += modelUsage.cost.totalCost;
182
+ }
183
+ // Calculate duration
184
+ const startTime = new Date(startedAt).getTime();
185
+ const endTime = new Date(endedAt).getTime();
186
+ const durationMinutes = Math.round((endTime - startTime) / 60000);
187
+ return {
188
+ sessionId,
189
+ projectPath: this.claudeDir.projectDirToPath(projectDir),
190
+ projectName: this.claudeDir.projectDirToName(projectDir),
191
+ startedAt,
192
+ endedAt,
193
+ durationMinutes: Math.max(1, durationMinutes),
194
+ tokens,
195
+ cost: totalCost,
196
+ modelUsage: Array.from(modelUsageMap.values()),
197
+ toolUsage: Array.from(toolUsageMap.values()),
198
+ messageCount,
199
+ userMessageCount,
200
+ assistantMessageCount,
201
+ turnCount: userMessageCount,
202
+ };
203
+ }
204
+ // --------------------------------------------------------------------------
205
+ // Project Analytics
206
+ // --------------------------------------------------------------------------
207
+ async getProjectAnalytics(projectDir) {
208
+ const sessionFiles = await this.claudeDir.listSessionFiles(projectDir);
209
+ if (sessionFiles.length === 0)
210
+ return null;
211
+ const totalTokens = {
212
+ inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, totalTokens: 0,
213
+ };
214
+ const totalCost = {
215
+ inputCost: 0, outputCost: 0, cacheWriteCost: 0, cacheReadCost: 0, totalCost: 0,
216
+ };
217
+ const modelUsageMap = new Map();
218
+ const toolUsageMap = new Map();
219
+ let totalDuration = 0;
220
+ let firstSession = '';
221
+ let lastSession = '';
222
+ let sessionCount = 0;
223
+ for (const filePath of sessionFiles) {
224
+ const analytics = await this.getSessionAnalytics(filePath, projectDir);
225
+ if (!analytics)
226
+ continue;
227
+ sessionCount++;
228
+ // Aggregate tokens
229
+ totalTokens.inputTokens += analytics.tokens.inputTokens;
230
+ totalTokens.outputTokens += analytics.tokens.outputTokens;
231
+ totalTokens.cacheCreationTokens += analytics.tokens.cacheCreationTokens;
232
+ totalTokens.cacheReadTokens += analytics.tokens.cacheReadTokens;
233
+ // Aggregate costs
234
+ totalCost.inputCost += analytics.cost.inputCost;
235
+ totalCost.outputCost += analytics.cost.outputCost;
236
+ totalCost.cacheWriteCost += analytics.cost.cacheWriteCost;
237
+ totalCost.cacheReadCost += analytics.cost.cacheReadCost;
238
+ totalCost.totalCost += analytics.cost.totalCost;
239
+ // Aggregate duration
240
+ totalDuration += analytics.durationMinutes;
241
+ // Track first/last session
242
+ if (!firstSession || analytics.startedAt < firstSession) {
243
+ firstSession = analytics.startedAt;
244
+ }
245
+ if (!lastSession || analytics.endedAt > lastSession) {
246
+ lastSession = analytics.endedAt;
247
+ }
248
+ // Merge model usage
249
+ for (const mu of analytics.modelUsage) {
250
+ let existing = modelUsageMap.get(mu.model);
251
+ if (!existing) {
252
+ existing = {
253
+ model: mu.model,
254
+ tokens: { inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, totalTokens: 0 },
255
+ cost: { inputCost: 0, outputCost: 0, cacheWriteCost: 0, cacheReadCost: 0, totalCost: 0 },
256
+ messageCount: 0,
257
+ };
258
+ modelUsageMap.set(mu.model, existing);
259
+ }
260
+ existing.tokens.inputTokens += mu.tokens.inputTokens;
261
+ existing.tokens.outputTokens += mu.tokens.outputTokens;
262
+ existing.tokens.cacheCreationTokens += mu.tokens.cacheCreationTokens;
263
+ existing.tokens.cacheReadTokens += mu.tokens.cacheReadTokens;
264
+ existing.tokens.totalTokens += mu.tokens.totalTokens;
265
+ existing.cost.inputCost += mu.cost.inputCost;
266
+ existing.cost.outputCost += mu.cost.outputCost;
267
+ existing.cost.cacheWriteCost += mu.cost.cacheWriteCost;
268
+ existing.cost.cacheReadCost += mu.cost.cacheReadCost;
269
+ existing.cost.totalCost += mu.cost.totalCost;
270
+ existing.messageCount += mu.messageCount;
271
+ }
272
+ // Merge tool usage
273
+ for (const tu of analytics.toolUsage) {
274
+ let existing = toolUsageMap.get(tu.toolName);
275
+ if (!existing) {
276
+ existing = { toolName: tu.toolName, count: 0, successCount: 0, failureCount: 0 };
277
+ toolUsageMap.set(tu.toolName, existing);
278
+ }
279
+ existing.count += tu.count;
280
+ existing.successCount += tu.successCount;
281
+ existing.failureCount += tu.failureCount;
282
+ }
283
+ }
284
+ totalTokens.totalTokens = totalTokens.inputTokens + totalTokens.outputTokens +
285
+ totalTokens.cacheCreationTokens + totalTokens.cacheReadTokens;
286
+ return {
287
+ projectPath: this.claudeDir.projectDirToPath(projectDir),
288
+ projectName: this.claudeDir.projectDirToName(projectDir),
289
+ sessionCount,
290
+ totalTokens,
291
+ totalCost,
292
+ modelUsage: Array.from(modelUsageMap.values()),
293
+ toolUsage: Array.from(toolUsageMap.values()).sort((a, b) => b.count - a.count),
294
+ avgSessionDuration: sessionCount > 0 ? Math.round(totalDuration / sessionCount) : 0,
295
+ totalDurationMinutes: totalDuration,
296
+ firstSession,
297
+ lastSession,
298
+ };
299
+ }
300
+ // --------------------------------------------------------------------------
301
+ // Global Analytics
302
+ // --------------------------------------------------------------------------
303
+ async getGlobalAnalytics(days) {
304
+ const projectDirs = await this.claudeDir.listProjects();
305
+ // Calculate cutoff date if days is specified
306
+ let cutoffStr = null;
307
+ if (days) {
308
+ const cutoff = new Date();
309
+ cutoff.setDate(cutoff.getDate() - days);
310
+ cutoffStr = cutoff.toISOString().split('T')[0];
311
+ }
312
+ const totalTokens = {
313
+ inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, totalTokens: 0,
314
+ };
315
+ const totalCost = {
316
+ inputCost: 0, outputCost: 0, cacheWriteCost: 0, cacheReadCost: 0, totalCost: 0,
317
+ };
318
+ const modelUsageMap = new Map();
319
+ const toolUsageMap = new Map();
320
+ const dailyCostsMap = new Map();
321
+ let projectCount = 0;
322
+ let sessionCount = 0;
323
+ let totalDuration = 0;
324
+ for (const projectDir of projectDirs) {
325
+ const sessionFiles = await this.claudeDir.listSessionFiles(projectDir);
326
+ if (sessionFiles.length === 0)
327
+ continue;
328
+ let projectHasSessions = false;
329
+ for (const filePath of sessionFiles) {
330
+ const analytics = await this.getSessionAnalytics(filePath, projectDir);
331
+ if (!analytics)
332
+ continue;
333
+ // Filter by date if cutoff is specified
334
+ const sessionDate = analytics.startedAt.split('T')[0];
335
+ if (cutoffStr && sessionDate < cutoffStr)
336
+ continue;
337
+ if (!projectHasSessions) {
338
+ projectHasSessions = true;
339
+ projectCount++;
340
+ }
341
+ sessionCount++;
342
+ // Aggregate tokens
343
+ totalTokens.inputTokens += analytics.tokens.inputTokens;
344
+ totalTokens.outputTokens += analytics.tokens.outputTokens;
345
+ totalTokens.cacheCreationTokens += analytics.tokens.cacheCreationTokens;
346
+ totalTokens.cacheReadTokens += analytics.tokens.cacheReadTokens;
347
+ // Aggregate costs
348
+ totalCost.inputCost += analytics.cost.inputCost;
349
+ totalCost.outputCost += analytics.cost.outputCost;
350
+ totalCost.cacheWriteCost += analytics.cost.cacheWriteCost;
351
+ totalCost.cacheReadCost += analytics.cost.cacheReadCost;
352
+ totalCost.totalCost += analytics.cost.totalCost;
353
+ // Duration
354
+ totalDuration += analytics.durationMinutes;
355
+ // Daily costs
356
+ const date = analytics.startedAt.split('T')[0];
357
+ const existing = dailyCostsMap.get(date) ?? { cost: 0, tokens: 0 };
358
+ existing.cost += analytics.cost.totalCost;
359
+ existing.tokens += analytics.tokens.totalTokens;
360
+ dailyCostsMap.set(date, existing);
361
+ // Merge model usage
362
+ for (const mu of analytics.modelUsage) {
363
+ let existingModel = modelUsageMap.get(mu.model);
364
+ if (!existingModel) {
365
+ existingModel = {
366
+ model: mu.model,
367
+ tokens: { inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, totalTokens: 0 },
368
+ cost: { inputCost: 0, outputCost: 0, cacheWriteCost: 0, cacheReadCost: 0, totalCost: 0 },
369
+ messageCount: 0,
370
+ };
371
+ modelUsageMap.set(mu.model, existingModel);
372
+ }
373
+ existingModel.tokens.inputTokens += mu.tokens.inputTokens;
374
+ existingModel.tokens.outputTokens += mu.tokens.outputTokens;
375
+ existingModel.tokens.cacheCreationTokens += mu.tokens.cacheCreationTokens;
376
+ existingModel.tokens.cacheReadTokens += mu.tokens.cacheReadTokens;
377
+ existingModel.tokens.totalTokens += mu.tokens.totalTokens;
378
+ existingModel.cost.inputCost += mu.cost.inputCost;
379
+ existingModel.cost.outputCost += mu.cost.outputCost;
380
+ existingModel.cost.cacheWriteCost += mu.cost.cacheWriteCost;
381
+ existingModel.cost.cacheReadCost += mu.cost.cacheReadCost;
382
+ existingModel.cost.totalCost += mu.cost.totalCost;
383
+ existingModel.messageCount += mu.messageCount;
384
+ }
385
+ // Merge tool usage
386
+ for (const tu of analytics.toolUsage) {
387
+ let existingTool = toolUsageMap.get(tu.toolName);
388
+ if (!existingTool) {
389
+ existingTool = { toolName: tu.toolName, count: 0, successCount: 0, failureCount: 0 };
390
+ toolUsageMap.set(tu.toolName, existingTool);
391
+ }
392
+ existingTool.count += tu.count;
393
+ existingTool.successCount += tu.successCount;
394
+ existingTool.failureCount += tu.failureCount;
395
+ }
396
+ }
397
+ }
398
+ totalTokens.totalTokens = totalTokens.inputTokens + totalTokens.outputTokens +
399
+ totalTokens.cacheCreationTokens + totalTokens.cacheReadTokens;
400
+ // Sort daily costs by date
401
+ const dailyCosts = Array.from(dailyCostsMap.entries())
402
+ .map(([date, data]) => ({ date, ...data }))
403
+ .sort((a, b) => a.date.localeCompare(b.date));
404
+ const uniqueDays = dailyCosts.length;
405
+ return {
406
+ totalTokens,
407
+ totalCost,
408
+ modelUsage: Array.from(modelUsageMap.values()).sort((a, b) => b.cost.totalCost - a.cost.totalCost),
409
+ toolUsage: Array.from(toolUsageMap.values()).sort((a, b) => b.count - a.count),
410
+ projectCount,
411
+ sessionCount,
412
+ totalDurationMinutes: totalDuration,
413
+ avgCostPerSession: sessionCount > 0 ? totalCost.totalCost / sessionCount : 0,
414
+ avgCostPerDay: uniqueDays > 0 ? totalCost.totalCost / uniqueDays : 0,
415
+ dailyCosts,
416
+ };
417
+ }
418
+ // --------------------------------------------------------------------------
419
+ // Daily Analytics
420
+ // --------------------------------------------------------------------------
421
+ async getDailyAnalytics(days = 30) {
422
+ const cutoff = new Date();
423
+ cutoff.setDate(cutoff.getDate() - days);
424
+ const cutoffStr = cutoff.toISOString().split('T')[0];
425
+ const dailyMap = new Map();
426
+ const projectDirs = await this.claudeDir.listProjects();
427
+ for (const projectDir of projectDirs) {
428
+ const sessionFiles = await this.claudeDir.listSessionFiles(projectDir);
429
+ for (const filePath of sessionFiles) {
430
+ const analytics = await this.getSessionAnalytics(filePath, projectDir);
431
+ if (!analytics)
432
+ continue;
433
+ const date = analytics.startedAt.split('T')[0];
434
+ if (date < cutoffStr)
435
+ continue;
436
+ let daily = dailyMap.get(date);
437
+ if (!daily) {
438
+ daily = {
439
+ date,
440
+ tokens: { inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, totalTokens: 0 },
441
+ cost: { inputCost: 0, outputCost: 0, cacheWriteCost: 0, cacheReadCost: 0, totalCost: 0 },
442
+ sessionCount: 0,
443
+ modelUsage: [],
444
+ toolUsage: [],
445
+ };
446
+ dailyMap.set(date, daily);
447
+ }
448
+ daily.sessionCount++;
449
+ daily.tokens.inputTokens += analytics.tokens.inputTokens;
450
+ daily.tokens.outputTokens += analytics.tokens.outputTokens;
451
+ daily.tokens.cacheCreationTokens += analytics.tokens.cacheCreationTokens;
452
+ daily.tokens.cacheReadTokens += analytics.tokens.cacheReadTokens;
453
+ daily.tokens.totalTokens += analytics.tokens.totalTokens;
454
+ daily.cost.inputCost += analytics.cost.inputCost;
455
+ daily.cost.outputCost += analytics.cost.outputCost;
456
+ daily.cost.cacheWriteCost += analytics.cost.cacheWriteCost;
457
+ daily.cost.cacheReadCost += analytics.cost.cacheReadCost;
458
+ daily.cost.totalCost += analytics.cost.totalCost;
459
+ }
460
+ }
461
+ return Array.from(dailyMap.values()).sort((a, b) => a.date.localeCompare(b.date));
462
+ }
463
+ // --------------------------------------------------------------------------
464
+ // Tool Analytics (Detailed)
465
+ // --------------------------------------------------------------------------
466
+ async getToolAnalytics(days = 30) {
467
+ const cutoff = new Date();
468
+ cutoff.setDate(cutoff.getDate() - days);
469
+ const cutoffStr = cutoff.toISOString().split('T')[0];
470
+ const toolUsageMap = new Map();
471
+ const fileAccessMap = new Map();
472
+ const commandMap = new Map();
473
+ const dailyToolMap = new Map();
474
+ const projectToolMap = new Map();
475
+ const projectDirs = await this.claudeDir.listProjects();
476
+ let totalToolCalls = 0;
477
+ for (const projectDir of projectDirs) {
478
+ const projectName = this.claudeDir.projectDirToName(projectDir);
479
+ const projectPath = this.claudeDir.projectDirToPath(projectDir);
480
+ const sessionFiles = await this.claudeDir.listSessionFiles(projectDir);
481
+ for (const filePath of sessionFiles) {
482
+ let sessionId = '';
483
+ let sessionDate = '';
484
+ for await (const msg of parseJSONL(filePath)) {
485
+ if (msg.type === 'file-history-snapshot')
486
+ continue;
487
+ if (msg.type === 'user' && !sessionId) {
488
+ sessionId = msg.sessionId;
489
+ sessionDate = msg.timestamp.split('T')[0];
490
+ }
491
+ if (sessionDate && sessionDate < cutoffStr)
492
+ continue;
493
+ if (msg.type === 'assistant') {
494
+ const assistantMsg = msg;
495
+ for (const content of assistantMsg.message.content) {
496
+ if (content.type !== 'tool_use' || !content.name)
497
+ continue;
498
+ const toolName = content.name;
499
+ const input = content.input ?? {};
500
+ const timestamp = msg.timestamp;
501
+ totalToolCalls++;
502
+ // Aggregate tool usage
503
+ let toolUsage = toolUsageMap.get(toolName);
504
+ if (!toolUsage) {
505
+ toolUsage = { toolName, count: 0, successCount: 0, failureCount: 0 };
506
+ toolUsageMap.set(toolName, toolUsage);
507
+ }
508
+ toolUsage.count++;
509
+ // Daily tool usage
510
+ const date = timestamp.split('T')[0];
511
+ if (!dailyToolMap.has(date)) {
512
+ dailyToolMap.set(date, {});
513
+ }
514
+ const dailyTools = dailyToolMap.get(date);
515
+ dailyTools[toolName] = (dailyTools[toolName] ?? 0) + 1;
516
+ // Project tool usage
517
+ if (!projectToolMap.has(projectName)) {
518
+ projectToolMap.set(projectName, {});
519
+ }
520
+ const projectTools = projectToolMap.get(projectName);
521
+ projectTools[toolName] = (projectTools[toolName] ?? 0) + 1;
522
+ // Extract file paths for Read/Edit/Write tools
523
+ if (['Read', 'Edit', 'Write'].includes(toolName)) {
524
+ const fp = (input.file_path ?? input.path ?? '');
525
+ if (fp) {
526
+ let fileStats = fileAccessMap.get(fp);
527
+ if (!fileStats) {
528
+ fileStats = {
529
+ filePath: fp,
530
+ readCount: 0,
531
+ editCount: 0,
532
+ writeCount: 0,
533
+ lastAccessed: timestamp,
534
+ sessions: [],
535
+ };
536
+ fileAccessMap.set(fp, fileStats);
537
+ }
538
+ if (toolName === 'Read')
539
+ fileStats.readCount++;
540
+ else if (toolName === 'Edit')
541
+ fileStats.editCount++;
542
+ else if (toolName === 'Write')
543
+ fileStats.writeCount++;
544
+ if (timestamp > fileStats.lastAccessed) {
545
+ fileStats.lastAccessed = timestamp;
546
+ }
547
+ if (!fileStats.sessions.includes(sessionId)) {
548
+ fileStats.sessions.push(sessionId);
549
+ }
550
+ }
551
+ }
552
+ // Extract commands for Bash tool
553
+ if (toolName === 'Bash') {
554
+ const cmd = (input.command ?? '');
555
+ if (cmd) {
556
+ // Extract first word/command for grouping
557
+ const baseCmd = cmd.split(/\s+/)[0] ?? cmd;
558
+ let cmdStats = commandMap.get(baseCmd);
559
+ if (!cmdStats) {
560
+ cmdStats = { command: baseCmd, count: 0, lastUsed: timestamp };
561
+ commandMap.set(baseCmd, cmdStats);
562
+ }
563
+ cmdStats.count++;
564
+ if (timestamp > cmdStats.lastUsed) {
565
+ cmdStats.lastUsed = timestamp;
566
+ }
567
+ }
568
+ }
569
+ }
570
+ }
571
+ }
572
+ }
573
+ }
574
+ // Sort and limit results
575
+ const toolUsage = Array.from(toolUsageMap.values()).sort((a, b) => b.count - a.count);
576
+ const fileAccess = Array.from(fileAccessMap.values()).sort((a, b) => (b.readCount + b.editCount + b.writeCount) - (a.readCount + a.editCount + a.writeCount));
577
+ const commandPatterns = Array.from(commandMap.values()).sort((a, b) => b.count - a.count);
578
+ // Daily tool usage sorted by date
579
+ const toolUsageByDay = Array.from(dailyToolMap.entries())
580
+ .map(([date, tools]) => ({ date, tools }))
581
+ .sort((a, b) => a.date.localeCompare(b.date));
582
+ // Project tool usage sorted by total usage
583
+ const toolUsageByProject = Array.from(projectToolMap.entries())
584
+ .map(([projectName, tools]) => ({
585
+ projectName,
586
+ tools,
587
+ total: Object.values(tools).reduce((sum, n) => sum + n, 0),
588
+ }))
589
+ .sort((a, b) => b.total - a.total)
590
+ .map(({ projectName, tools }) => ({ projectName, tools }));
591
+ // Tool distribution
592
+ const toolDistribution = toolUsage.map(t => ({
593
+ toolName: t.toolName,
594
+ percentage: totalToolCalls > 0 ? Math.round((t.count / totalToolCalls) * 1000) / 10 : 0,
595
+ count: t.count,
596
+ }));
597
+ return {
598
+ toolUsage,
599
+ fileAccess,
600
+ commandPatterns,
601
+ toolUsageByDay,
602
+ toolUsageByProject,
603
+ mostUsedFiles: fileAccess.slice(0, 20),
604
+ mostUsedCommands: commandPatterns.slice(0, 20),
605
+ toolDistribution,
606
+ };
607
+ }
608
+ }
609
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/services/analytics.ts"],"names":[],"mappings":"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"}