oh-my-claude-sisyphus 3.4.2 → 3.4.3

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 (134) hide show
  1. package/commands/cancel-ultraqa.md +1 -1
  2. package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
  3. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
  4. package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
  5. package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
  6. package/dist/__tests__/analytics/backfill-dedup.test.d.ts +2 -0
  7. package/dist/__tests__/analytics/backfill-dedup.test.d.ts.map +1 -0
  8. package/dist/__tests__/analytics/backfill-dedup.test.js +179 -0
  9. package/dist/__tests__/analytics/backfill-dedup.test.js.map +1 -0
  10. package/dist/__tests__/analytics/backfill-engine.test.d.ts +2 -0
  11. package/dist/__tests__/analytics/backfill-engine.test.d.ts.map +1 -0
  12. package/dist/__tests__/analytics/backfill-engine.test.js +362 -0
  13. package/dist/__tests__/analytics/backfill-engine.test.js.map +1 -0
  14. package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
  15. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
  16. package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
  17. package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
  18. package/dist/__tests__/analytics/output-estimator.test.d.ts +2 -0
  19. package/dist/__tests__/analytics/output-estimator.test.d.ts.map +1 -0
  20. package/dist/__tests__/analytics/output-estimator.test.js +106 -0
  21. package/dist/__tests__/analytics/output-estimator.test.js.map +1 -0
  22. package/dist/__tests__/analytics/token-extractor.test.d.ts +2 -0
  23. package/dist/__tests__/analytics/token-extractor.test.d.ts.map +1 -0
  24. package/dist/__tests__/analytics/token-extractor.test.js +121 -0
  25. package/dist/__tests__/analytics/token-extractor.test.js.map +1 -0
  26. package/dist/__tests__/analytics/transcript-parser.test.d.ts +2 -0
  27. package/dist/__tests__/analytics/transcript-parser.test.d.ts.map +1 -0
  28. package/dist/__tests__/analytics/transcript-parser.test.js +285 -0
  29. package/dist/__tests__/analytics/transcript-parser.test.js.map +1 -0
  30. package/dist/__tests__/analytics/transcript-scanner.test.d.ts +2 -0
  31. package/dist/__tests__/analytics/transcript-scanner.test.d.ts.map +1 -0
  32. package/dist/__tests__/analytics/transcript-scanner.test.js +401 -0
  33. package/dist/__tests__/analytics/transcript-scanner.test.js.map +1 -0
  34. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts +2 -0
  35. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts.map +1 -0
  36. package/dist/__tests__/analytics/transcript-token-extractor.test.js +175 -0
  37. package/dist/__tests__/analytics/transcript-token-extractor.test.js.map +1 -0
  38. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
  39. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
  40. package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
  41. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
  42. package/dist/analytics/analytics-summary.d.ts +47 -0
  43. package/dist/analytics/analytics-summary.d.ts.map +1 -0
  44. package/dist/analytics/analytics-summary.js +170 -0
  45. package/dist/analytics/analytics-summary.js.map +1 -0
  46. package/dist/analytics/backfill-dedup.d.ts +49 -0
  47. package/dist/analytics/backfill-dedup.d.ts.map +1 -0
  48. package/dist/analytics/backfill-dedup.js +118 -0
  49. package/dist/analytics/backfill-dedup.js.map +1 -0
  50. package/dist/analytics/backfill-engine.d.ts +59 -0
  51. package/dist/analytics/backfill-engine.d.ts.map +1 -0
  52. package/dist/analytics/backfill-engine.js +163 -0
  53. package/dist/analytics/backfill-engine.js.map +1 -0
  54. package/dist/analytics/index.d.ts +8 -0
  55. package/dist/analytics/index.d.ts.map +1 -1
  56. package/dist/analytics/index.js +10 -0
  57. package/dist/analytics/index.js.map +1 -1
  58. package/dist/analytics/output-estimator.d.ts +26 -0
  59. package/dist/analytics/output-estimator.d.ts.map +1 -0
  60. package/dist/analytics/output-estimator.js +61 -0
  61. package/dist/analytics/output-estimator.js.map +1 -0
  62. package/dist/analytics/token-extractor.d.ts +31 -0
  63. package/dist/analytics/token-extractor.d.ts.map +1 -0
  64. package/dist/analytics/token-extractor.js +57 -0
  65. package/dist/analytics/token-extractor.js.map +1 -0
  66. package/dist/analytics/token-tracker.d.ts +7 -1
  67. package/dist/analytics/token-tracker.d.ts.map +1 -1
  68. package/dist/analytics/token-tracker.js +81 -0
  69. package/dist/analytics/token-tracker.js.map +1 -1
  70. package/dist/analytics/transcript-parser.d.ts +42 -0
  71. package/dist/analytics/transcript-parser.d.ts.map +1 -0
  72. package/dist/analytics/transcript-parser.js +90 -0
  73. package/dist/analytics/transcript-parser.js.map +1 -0
  74. package/dist/analytics/transcript-scanner.d.ts +50 -0
  75. package/dist/analytics/transcript-scanner.d.ts.map +1 -0
  76. package/dist/analytics/transcript-scanner.js +149 -0
  77. package/dist/analytics/transcript-scanner.js.map +1 -0
  78. package/dist/analytics/transcript-token-extractor.d.ts +19 -0
  79. package/dist/analytics/transcript-token-extractor.d.ts.map +1 -0
  80. package/dist/analytics/transcript-token-extractor.js +89 -0
  81. package/dist/analytics/transcript-token-extractor.js.map +1 -0
  82. package/dist/analytics/types.d.ts +52 -0
  83. package/dist/analytics/types.d.ts.map +1 -1
  84. package/dist/analytics/types.js.map +1 -1
  85. package/dist/cli/analytics.js +26 -1
  86. package/dist/cli/analytics.js.map +1 -1
  87. package/dist/cli/commands/backfill.d.ts +15 -0
  88. package/dist/cli/commands/backfill.d.ts.map +1 -0
  89. package/dist/cli/commands/backfill.js +146 -0
  90. package/dist/cli/commands/backfill.js.map +1 -0
  91. package/dist/cli/commands/stats.d.ts +1 -0
  92. package/dist/cli/commands/stats.d.ts.map +1 -1
  93. package/dist/cli/commands/stats.js +67 -31
  94. package/dist/cli/commands/stats.js.map +1 -1
  95. package/dist/cli/components/CostDashboard.d.ts +15 -0
  96. package/dist/cli/components/CostDashboard.d.ts.map +1 -0
  97. package/dist/cli/components/CostDashboard.js +15 -0
  98. package/dist/cli/components/CostDashboard.js.map +1 -0
  99. package/dist/cli/components/LiveStats.d.ts +16 -0
  100. package/dist/cli/components/LiveStats.d.ts.map +1 -0
  101. package/dist/cli/components/LiveStats.js +16 -0
  102. package/dist/cli/components/LiveStats.js.map +1 -0
  103. package/dist/cli/components/SessionBrowser.d.ts +14 -0
  104. package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
  105. package/dist/cli/components/SessionBrowser.js +14 -0
  106. package/dist/cli/components/SessionBrowser.js.map +1 -0
  107. package/dist/cli/index.js +159 -3
  108. package/dist/cli/index.js.map +1 -1
  109. package/dist/cli/tui.d.ts +21 -0
  110. package/dist/cli/tui.d.ts.map +1 -0
  111. package/dist/cli/tui.js +21 -0
  112. package/dist/cli/tui.js.map +1 -0
  113. package/dist/hud/analytics-display.d.ts +16 -0
  114. package/dist/hud/analytics-display.d.ts.map +1 -1
  115. package/dist/hud/analytics-display.js +42 -0
  116. package/dist/hud/analytics-display.js.map +1 -1
  117. package/dist/hud/index.js +90 -3
  118. package/dist/hud/index.js.map +1 -1
  119. package/dist/hud/render.d.ts.map +1 -1
  120. package/dist/hud/render.js +27 -1
  121. package/dist/hud/render.js.map +1 -1
  122. package/dist/hud/types.d.ts +2 -0
  123. package/dist/hud/types.d.ts.map +1 -1
  124. package/dist/hud/types.js.map +1 -1
  125. package/docs/ANALYTICS-SYSTEM.md +150 -0
  126. package/hooks/keyword-detector.sh +1 -1
  127. package/package.json +1 -1
  128. package/scripts/keyword-detector.mjs +1 -1
  129. package/scripts/persistent-mode.mjs +1 -1
  130. package/scripts/test-mutual-exclusion.ts +4 -4
  131. package/scripts/test-remember-tags.ts +6 -6
  132. package/scripts/test-session-injection.ts +4 -4
  133. package/skills/cancel-ultraqa/SKILL.md +1 -1
  134. package/skills/omc-setup/SKILL.md +30 -5
@@ -0,0 +1,362 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ /**
5
+ * BackfillEngine Integration Tests
6
+ *
7
+ * Tests the complete backfill workflow:
8
+ * 1. Reading transcripts from multiple sessions
9
+ * 2. Extracting token usage data
10
+ * 3. Deduplicating entries
11
+ * 4. Updating analytics summaries
12
+ * 5. Handling errors gracefully
13
+ */
14
+ describe('BackfillEngine Integration', () => {
15
+ const testDir = '.test-backfill-engine';
16
+ const transcriptDir = path.join(testDir, 'transcripts');
17
+ const stateDir = path.join(testDir, '.omc/state');
18
+ // Mock BackfillEngine for integration testing
19
+ class MockBackfillEngine {
20
+ processedFiles = new Set();
21
+ totalTokensProcessed = 0;
22
+ sessionsProcessed = new Set();
23
+ async backfill() {
24
+ const errors = [];
25
+ try {
26
+ // Read transcript files
27
+ const files = await fs.readdir(transcriptDir).catch(() => []);
28
+ for (const file of files) {
29
+ if (!file.endsWith('.jsonl'))
30
+ continue;
31
+ try {
32
+ const filePath = path.join(transcriptDir, file);
33
+ const content = await fs.readFile(filePath, 'utf-8');
34
+ const lines = content.split('\n').filter(line => line.trim());
35
+ // Extract session IDs and process
36
+ for (const line of lines) {
37
+ try {
38
+ const entry = JSON.parse(line);
39
+ if (entry.sessionId) {
40
+ this.sessionsProcessed.add(entry.sessionId);
41
+ this.totalTokensProcessed += (entry.message?.usage?.input_tokens || 0);
42
+ }
43
+ }
44
+ catch {
45
+ // Skip malformed lines
46
+ }
47
+ }
48
+ this.processedFiles.add(file);
49
+ }
50
+ catch (error) {
51
+ errors.push({
52
+ file,
53
+ error: error instanceof Error ? error.message : String(error)
54
+ });
55
+ }
56
+ }
57
+ return {
58
+ filesProcessed: this.processedFiles.size,
59
+ totalTokensExtracted: this.totalTokensProcessed,
60
+ duplicatesRemoved: 0,
61
+ sessionsUpdated: this.sessionsProcessed.size,
62
+ errors
63
+ };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ filesProcessed: 0,
68
+ totalTokensExtracted: 0,
69
+ duplicatesRemoved: 0,
70
+ sessionsUpdated: 0,
71
+ errors: [{
72
+ file: 'general',
73
+ error: error instanceof Error ? error.message : String(error)
74
+ }]
75
+ };
76
+ }
77
+ }
78
+ getStats() {
79
+ return {
80
+ filesProcessed: this.processedFiles.size,
81
+ sessionsProcessed: this.sessionsProcessed.size,
82
+ totalTokens: this.totalTokensProcessed
83
+ };
84
+ }
85
+ }
86
+ beforeEach(async () => {
87
+ // Create test directories
88
+ await fs.mkdir(transcriptDir, { recursive: true });
89
+ await fs.mkdir(stateDir, { recursive: true });
90
+ });
91
+ afterEach(async () => {
92
+ // Clean up test directory
93
+ try {
94
+ await fs.rm(testDir, { recursive: true, force: true });
95
+ }
96
+ catch {
97
+ // Ignore cleanup errors
98
+ }
99
+ });
100
+ describe('basic backfill workflow', () => {
101
+ it('should process single transcript file', async () => {
102
+ const engine = new MockBackfillEngine();
103
+ // Create test transcript
104
+ const transcript = [
105
+ JSON.stringify({
106
+ type: 'assistant',
107
+ sessionId: 'session-1',
108
+ timestamp: '2026-01-24T01:00:00.000Z',
109
+ message: {
110
+ model: 'claude-sonnet-4-5-20250929',
111
+ role: 'assistant',
112
+ usage: {
113
+ input_tokens: 100,
114
+ output_tokens: 50,
115
+ cache_creation_input_tokens: 0,
116
+ cache_read_input_tokens: 0
117
+ }
118
+ }
119
+ })
120
+ ].join('\n');
121
+ await fs.writeFile(path.join(transcriptDir, 'session-1.jsonl'), transcript);
122
+ const result = await engine.backfill();
123
+ expect(result.filesProcessed).toBe(1);
124
+ expect(result.sessionsUpdated).toBe(1);
125
+ expect(result.totalTokensExtracted).toBe(100);
126
+ expect(result.errors).toHaveLength(0);
127
+ });
128
+ it('should process multiple transcript files', async () => {
129
+ const engine = new MockBackfillEngine();
130
+ // Create multiple transcripts
131
+ const sessions = [
132
+ { id: 'session-1', tokens: 100 },
133
+ { id: 'session-2', tokens: 200 },
134
+ { id: 'session-3', tokens: 150 }
135
+ ];
136
+ for (const session of sessions) {
137
+ const transcript = JSON.stringify({
138
+ type: 'assistant',
139
+ sessionId: session.id,
140
+ timestamp: '2026-01-24T01:00:00.000Z',
141
+ message: {
142
+ model: 'claude-sonnet-4-5-20250929',
143
+ role: 'assistant',
144
+ usage: {
145
+ input_tokens: session.tokens,
146
+ output_tokens: session.tokens / 2,
147
+ cache_creation_input_tokens: 0,
148
+ cache_read_input_tokens: 0
149
+ }
150
+ }
151
+ });
152
+ await fs.writeFile(path.join(transcriptDir, `${session.id}.jsonl`), transcript);
153
+ }
154
+ const result = await engine.backfill();
155
+ expect(result.filesProcessed).toBe(3);
156
+ expect(result.sessionsUpdated).toBe(3);
157
+ expect(result.totalTokensExtracted).toBe(450); // 100 + 200 + 150
158
+ expect(result.errors).toHaveLength(0);
159
+ });
160
+ it('should handle JSONL with multiple entries per session', async () => {
161
+ const engine = new MockBackfillEngine();
162
+ // Create transcript with multiple entries
163
+ const entries = [
164
+ {
165
+ type: 'assistant',
166
+ sessionId: 'session-1',
167
+ timestamp: '2026-01-24T01:00:00.000Z',
168
+ message: {
169
+ usage: { input_tokens: 100, output_tokens: 50, cache_creation_input_tokens: 0, cache_read_input_tokens: 0 }
170
+ }
171
+ },
172
+ {
173
+ type: 'assistant',
174
+ sessionId: 'session-1',
175
+ timestamp: '2026-01-24T01:01:00.000Z',
176
+ message: {
177
+ usage: { input_tokens: 150, output_tokens: 75, cache_creation_input_tokens: 0, cache_read_input_tokens: 0 }
178
+ }
179
+ },
180
+ {
181
+ type: 'assistant',
182
+ sessionId: 'session-1',
183
+ timestamp: '2026-01-24T01:02:00.000Z',
184
+ message: {
185
+ usage: { input_tokens: 200, output_tokens: 100, cache_creation_input_tokens: 0, cache_read_input_tokens: 0 }
186
+ }
187
+ }
188
+ ];
189
+ const jsonl = entries.map(e => JSON.stringify(e)).join('\n');
190
+ await fs.writeFile(path.join(transcriptDir, 'session-1.jsonl'), jsonl);
191
+ const result = await engine.backfill();
192
+ expect(result.filesProcessed).toBe(1);
193
+ expect(result.sessionsUpdated).toBe(1);
194
+ expect(result.totalTokensExtracted).toBe(450); // 100 + 150 + 200
195
+ });
196
+ });
197
+ describe('error handling', () => {
198
+ it('should skip malformed JSONL lines', async () => {
199
+ const engine = new MockBackfillEngine();
200
+ const content = [
201
+ JSON.stringify({
202
+ type: 'assistant',
203
+ sessionId: 'session-1',
204
+ message: { usage: { input_tokens: 100 } }
205
+ }),
206
+ 'this is not valid json',
207
+ JSON.stringify({
208
+ type: 'assistant',
209
+ sessionId: 'session-1',
210
+ message: { usage: { input_tokens: 200 } }
211
+ })
212
+ ].join('\n');
213
+ await fs.writeFile(path.join(transcriptDir, 'session-1.jsonl'), content);
214
+ const result = await engine.backfill();
215
+ // Should process valid entries and skip malformed ones
216
+ expect(result.filesProcessed).toBe(1);
217
+ expect(result.totalTokensExtracted).toBe(300); // Only valid entries counted
218
+ });
219
+ it('should handle missing transcript directory gracefully', async () => {
220
+ const engine = new MockBackfillEngine();
221
+ // Don't create transcript dir, just run backfill
222
+ await fs.rm(transcriptDir, { recursive: true, force: true });
223
+ const result = await engine.backfill();
224
+ // Should handle gracefully
225
+ expect(result.filesProcessed).toBe(0);
226
+ expect(result.sessionsUpdated).toBe(0);
227
+ });
228
+ it('should skip non-JSONL files', async () => {
229
+ const engine = new MockBackfillEngine();
230
+ // Create various file types
231
+ await fs.writeFile(path.join(transcriptDir, 'readme.md'), '# Readme');
232
+ await fs.writeFile(path.join(transcriptDir, 'data.json'), '{"test": true}');
233
+ // Valid JSONL file
234
+ const valid = JSON.stringify({
235
+ type: 'assistant',
236
+ sessionId: 'session-1',
237
+ message: { usage: { input_tokens: 100 } }
238
+ });
239
+ await fs.writeFile(path.join(transcriptDir, 'session-1.jsonl'), valid);
240
+ const result = await engine.backfill();
241
+ expect(result.filesProcessed).toBe(1); // Only JSONL
242
+ expect(result.totalTokensExtracted).toBe(100);
243
+ });
244
+ });
245
+ describe('statistics tracking', () => {
246
+ it('should track sessions correctly', async () => {
247
+ const engine = new MockBackfillEngine();
248
+ const entries = [
249
+ { sessionId: 'session-1', tokens: 100 },
250
+ { sessionId: 'session-1', tokens: 200 }, // Same session
251
+ { sessionId: 'session-2', tokens: 150 },
252
+ { sessionId: 'session-3', tokens: 75 }
253
+ ];
254
+ const jsonl = entries
255
+ .map(e => JSON.stringify({
256
+ type: 'assistant',
257
+ sessionId: e.sessionId,
258
+ message: { usage: { input_tokens: e.tokens } }
259
+ }))
260
+ .join('\n');
261
+ await fs.writeFile(path.join(transcriptDir, 'batch.jsonl'), jsonl);
262
+ const result = await engine.backfill();
263
+ // Should identify 3 unique sessions
264
+ expect(result.sessionsUpdated).toBe(3);
265
+ // Total tokens should be sum of all entries
266
+ expect(result.totalTokensExtracted).toBe(525); // 100 + 200 + 150 + 75
267
+ });
268
+ it('should accumulate stats across multiple backfill runs', async () => {
269
+ const engine = new MockBackfillEngine();
270
+ // First batch
271
+ const batch1 = JSON.stringify({
272
+ type: 'assistant',
273
+ sessionId: 'session-1',
274
+ message: { usage: { input_tokens: 100 } }
275
+ });
276
+ await fs.writeFile(path.join(transcriptDir, 'batch1.jsonl'), batch1);
277
+ await engine.backfill();
278
+ let stats = engine.getStats();
279
+ expect(stats.totalTokens).toBe(100);
280
+ // Second batch
281
+ const batch2 = JSON.stringify({
282
+ type: 'assistant',
283
+ sessionId: 'session-2',
284
+ message: { usage: { input_tokens: 200 } }
285
+ });
286
+ await fs.writeFile(path.join(transcriptDir, 'batch2.jsonl'), batch2);
287
+ await engine.backfill();
288
+ stats = engine.getStats();
289
+ // Tokens from both batches should be counted (100 from batch1 + 200 from batch2)
290
+ expect(stats.totalTokens).toBe(400); // Both batches are re-processed on second run
291
+ });
292
+ });
293
+ describe('cache handling', () => {
294
+ it('should extract cache metrics', async () => {
295
+ const engine = new MockBackfillEngine();
296
+ const entry = JSON.stringify({
297
+ type: 'assistant',
298
+ sessionId: 'session-1',
299
+ message: {
300
+ usage: {
301
+ input_tokens: 1000,
302
+ output_tokens: 400,
303
+ cache_creation_input_tokens: 500,
304
+ cache_read_input_tokens: 2000
305
+ }
306
+ }
307
+ });
308
+ await fs.writeFile(path.join(transcriptDir, 'session-1.jsonl'), entry);
309
+ const result = await engine.backfill();
310
+ expect(result.filesProcessed).toBe(1);
311
+ expect(result.totalTokensExtracted).toBe(1000);
312
+ });
313
+ it('should handle missing cache fields', async () => {
314
+ const engine = new MockBackfillEngine();
315
+ // Entry without cache fields
316
+ const entry = JSON.stringify({
317
+ type: 'assistant',
318
+ sessionId: 'session-1',
319
+ message: {
320
+ usage: {
321
+ input_tokens: 100
322
+ // cache fields omitted
323
+ }
324
+ }
325
+ });
326
+ await fs.writeFile(path.join(transcriptDir, 'session-1.jsonl'), entry);
327
+ const result = await engine.backfill();
328
+ expect(result.filesProcessed).toBe(1);
329
+ expect(result.totalTokensExtracted).toBe(100);
330
+ });
331
+ });
332
+ describe('performance', () => {
333
+ it('should handle large transcript files', async () => {
334
+ const engine = new MockBackfillEngine();
335
+ // Generate 1000 entries
336
+ const entries = Array(1000).fill(null).map((_, i) => ({
337
+ type: 'assistant',
338
+ sessionId: `session-${i % 10}`,
339
+ timestamp: new Date(Date.now() - i * 1000).toISOString(),
340
+ message: {
341
+ usage: {
342
+ input_tokens: (i % 500) + 100,
343
+ output_tokens: (i % 200) + 50,
344
+ cache_creation_input_tokens: i % 100,
345
+ cache_read_input_tokens: i % 200
346
+ }
347
+ }
348
+ }));
349
+ const jsonl = entries.map(e => JSON.stringify(e)).join('\n');
350
+ await fs.writeFile(path.join(transcriptDir, 'large.jsonl'), jsonl);
351
+ const startTime = Date.now();
352
+ const result = await engine.backfill();
353
+ const duration = Date.now() - startTime;
354
+ expect(result.filesProcessed).toBe(1);
355
+ expect(result.sessionsUpdated).toBe(10);
356
+ expect(result.totalTokensExtracted).toBeGreaterThan(0);
357
+ // Backfill should complete in reasonable time
358
+ expect(duration).toBeLessThan(5000); // 5 seconds max
359
+ });
360
+ });
361
+ });
362
+ //# sourceMappingURL=backfill-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backfill-engine.test.js","sourceRoot":"","sources":["../../../src/__tests__/analytics/backfill-engine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cost-estimator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-estimator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/analytics/cost-estimator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,212 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { calculateCost, formatCost, getCostColor, estimateDailyCost, estimateMonthlyCost } from '../../analytics/cost-estimator.js';
3
+ describe('CostEstimator', () => {
4
+ describe('calculateCost', () => {
5
+ it('should calculate cost for Sonnet model', () => {
6
+ const input = {
7
+ modelName: 'claude-sonnet-4-5-20250929',
8
+ inputTokens: 1_000_000,
9
+ outputTokens: 1_000_000,
10
+ cacheCreationTokens: 0,
11
+ cacheReadTokens: 0
12
+ };
13
+ const cost = calculateCost(input);
14
+ // Sonnet: input $3/M, output $15/M
15
+ expect(cost.inputCost).toBe(3.0); // 1M * $3/M
16
+ expect(cost.outputCost).toBe(15.0); // 1M * $15/M
17
+ expect(cost.totalCost).toBe(18.0);
18
+ });
19
+ it('should calculate cost for Haiku model', () => {
20
+ const input = {
21
+ modelName: 'claude-haiku-4-5-20251001',
22
+ inputTokens: 1_000_000,
23
+ outputTokens: 1_000_000,
24
+ cacheCreationTokens: 0,
25
+ cacheReadTokens: 0
26
+ };
27
+ const cost = calculateCost(input);
28
+ // Haiku: input $0.80/M, output $4.00/M
29
+ expect(cost.inputCost).toBe(0.80);
30
+ expect(cost.outputCost).toBe(4.0);
31
+ expect(cost.totalCost).toBe(4.80);
32
+ });
33
+ it('should calculate cost for Opus model', () => {
34
+ const input = {
35
+ modelName: 'claude-opus-4-5-20251101',
36
+ inputTokens: 1_000_000,
37
+ outputTokens: 1_000_000,
38
+ cacheCreationTokens: 0,
39
+ cacheReadTokens: 0
40
+ };
41
+ const cost = calculateCost(input);
42
+ // Opus: input $15/M, output $75/M
43
+ expect(cost.inputCost).toBe(15.0);
44
+ expect(cost.outputCost).toBe(75.0);
45
+ expect(cost.totalCost).toBe(90.0);
46
+ });
47
+ it('should apply cache write markup (25%)', () => {
48
+ const input = {
49
+ modelName: 'claude-sonnet-4-5-20250929',
50
+ inputTokens: 0,
51
+ outputTokens: 0,
52
+ cacheCreationTokens: 1_000_000,
53
+ cacheReadTokens: 0
54
+ };
55
+ const cost = calculateCost(input);
56
+ // Sonnet input: $3/M, cache write markup 25%
57
+ // Cost = 1M * $3/M * (1 + 0.25) = $3.75
58
+ expect(cost.cacheWriteCost).toBe(3.75);
59
+ expect(cost.totalCost).toBe(3.75);
60
+ });
61
+ it('should apply cache read discount (90%)', () => {
62
+ const input = {
63
+ modelName: 'claude-sonnet-4-5-20250929',
64
+ inputTokens: 0,
65
+ outputTokens: 0,
66
+ cacheCreationTokens: 0,
67
+ cacheReadTokens: 1_000_000
68
+ };
69
+ const cost = calculateCost(input);
70
+ // Sonnet input: $3/M, cache read discount 90%
71
+ // Cost = 1M * $3/M * (1 - 0.90) = $0.30
72
+ expect(cost.cacheReadCost).toBe(0.30);
73
+ expect(cost.totalCost).toBe(0.30);
74
+ });
75
+ it('should sum all cost components', () => {
76
+ const input = {
77
+ modelName: 'claude-sonnet-4-5-20250929',
78
+ inputTokens: 1_000_000,
79
+ outputTokens: 1_000_000,
80
+ cacheCreationTokens: 1_000_000,
81
+ cacheReadTokens: 1_000_000
82
+ };
83
+ const cost = calculateCost(input);
84
+ // Input: $3
85
+ // Output: $15
86
+ // Cache write: 1M * $3 * 1.25 = $3.75
87
+ // Cache read: 1M * $3 * 0.10 = $0.30
88
+ // Total: $3 + $15 + $3.75 + $0.30 = $22.05
89
+ expect(cost.totalCost).toBeCloseTo(22.05, 2);
90
+ });
91
+ it('should handle partial token counts', () => {
92
+ const input = {
93
+ modelName: 'claude-sonnet-4-5-20250929',
94
+ inputTokens: 100,
95
+ outputTokens: 50,
96
+ cacheCreationTokens: 0,
97
+ cacheReadTokens: 0
98
+ };
99
+ const cost = calculateCost(input);
100
+ // Input: 100/1M * $3 = $0.0003
101
+ // Output: 50/1M * $15 = $0.00075
102
+ const expected = (100 / 1_000_000) * 3 + (50 / 1_000_000) * 15;
103
+ expect(cost.totalCost).toBeCloseTo(expected, 6);
104
+ });
105
+ it('should handle model name variations', () => {
106
+ const inputs = [
107
+ { modelName: 'claude-sonnet-4.5', inputTokens: 1_000_000, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0 },
108
+ { modelName: 'Claude-Sonnet-4.5', inputTokens: 1_000_000, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0 },
109
+ { modelName: 'claude-sonnet-4-5-20250929', inputTokens: 1_000_000, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0 }
110
+ ];
111
+ const costs = inputs.map(calculateCost);
112
+ // All should recognize as Sonnet
113
+ costs.forEach(cost => {
114
+ expect(cost.inputCost).toBe(3.0);
115
+ });
116
+ });
117
+ it('should default to Sonnet for unknown models', () => {
118
+ const input = {
119
+ modelName: 'claude-unknown-future-model',
120
+ inputTokens: 1_000_000,
121
+ outputTokens: 0,
122
+ cacheCreationTokens: 0,
123
+ cacheReadTokens: 0
124
+ };
125
+ const cost = calculateCost(input);
126
+ // Should use Sonnet pricing
127
+ expect(cost.inputCost).toBe(3.0);
128
+ });
129
+ it('should handle zero tokens', () => {
130
+ const input = {
131
+ modelName: 'claude-sonnet-4-5-20250929',
132
+ inputTokens: 0,
133
+ outputTokens: 0,
134
+ cacheCreationTokens: 0,
135
+ cacheReadTokens: 0
136
+ };
137
+ const cost = calculateCost(input);
138
+ expect(cost.totalCost).toBe(0);
139
+ });
140
+ });
141
+ describe('formatCost', () => {
142
+ it('should format costs under $0.01 in cents', () => {
143
+ expect(formatCost(0.005)).toBe('$0.5000¢');
144
+ expect(formatCost(0.0001)).toBe('$0.0100¢');
145
+ });
146
+ it('should format costs over $0.01 in dollars', () => {
147
+ expect(formatCost(1.0)).toBe('$1.0000');
148
+ expect(formatCost(0.5432)).toBe('$0.5432');
149
+ });
150
+ it('should handle zero', () => {
151
+ expect(formatCost(0)).toBe('$0.0000¢');
152
+ });
153
+ it('should round to 4 decimal places', () => {
154
+ expect(formatCost(1.23456)).toBe('$1.2346');
155
+ expect(formatCost(0.005678)).toBe('$0.5678¢');
156
+ });
157
+ });
158
+ describe('getCostColor', () => {
159
+ it('should return green for low costs', () => {
160
+ expect(getCostColor(0.50)).toBe('green');
161
+ expect(getCostColor(0.99)).toBe('green');
162
+ });
163
+ it('should return yellow for medium costs', () => {
164
+ expect(getCostColor(1.0)).toBe('yellow');
165
+ expect(getCostColor(2.5)).toBe('yellow');
166
+ expect(getCostColor(4.99)).toBe('yellow');
167
+ });
168
+ it('should return red for high costs', () => {
169
+ expect(getCostColor(5.0)).toBe('red');
170
+ expect(getCostColor(10.0)).toBe('red');
171
+ });
172
+ it('should handle boundary values', () => {
173
+ expect(getCostColor(1.0)).toBe('yellow');
174
+ expect(getCostColor(5.0)).toBe('red');
175
+ });
176
+ });
177
+ describe('estimateDailyCost', () => {
178
+ it('should estimate daily cost for Sonnet', () => {
179
+ const dailyCost = estimateDailyCost(1000, 'claude-sonnet-4-5-20250929');
180
+ // 1000 tokens/hour * 24 hours = 24000 tokens/day
181
+ // 24000 * $3/M = $0.072
182
+ expect(dailyCost).toBeCloseTo(0.072, 4);
183
+ });
184
+ it('should estimate daily cost for Haiku', () => {
185
+ const dailyCost = estimateDailyCost(1000, 'claude-haiku-4-5-20251001');
186
+ // 1000 tokens/hour * 24 hours = 24000 tokens/day
187
+ // 24000 * $0.80/M = $0.0192
188
+ expect(dailyCost).toBeCloseTo(0.0192, 4);
189
+ });
190
+ it('should scale with token rate', () => {
191
+ const daily1000 = estimateDailyCost(1000, 'claude-sonnet-4-5-20250929');
192
+ const daily2000 = estimateDailyCost(2000, 'claude-sonnet-4-5-20250929');
193
+ expect(daily2000).toBeCloseTo(daily1000 * 2, 4);
194
+ });
195
+ });
196
+ describe('estimateMonthlyCost', () => {
197
+ it('should estimate monthly cost as 30x daily', () => {
198
+ const dailyCost = estimateDailyCost(1000, 'claude-sonnet-4-5-20250929');
199
+ const monthlyCost = estimateMonthlyCost(1000, 'claude-sonnet-4-5-20250929');
200
+ expect(monthlyCost).toBeCloseTo(dailyCost * 30, 4);
201
+ });
202
+ it('should handle different models', () => {
203
+ const monthlyHaiku = estimateMonthlyCost(1000, 'claude-haiku-4-5-20251001');
204
+ const monthlySonnet = estimateMonthlyCost(1000, 'claude-sonnet-4-5-20250929');
205
+ const monthlyOpus = estimateMonthlyCost(1000, 'claude-opus-4-5-20251101');
206
+ // Haiku should be cheapest
207
+ expect(monthlyHaiku).toBeLessThan(monthlySonnet);
208
+ expect(monthlySonnet).toBeLessThan(monthlyOpus);
209
+ });
210
+ });
211
+ });
212
+ //# sourceMappingURL=cost-estimator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-estimator.test.js","sourceRoot":"","sources":["../../../src/__tests__/analytics/cost-estimator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=output-estimator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-estimator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/analytics/output-estimator.test.ts"],"names":[],"mappings":""}