oh-my-claude-sisyphus 3.4.1 → 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.
- package/commands/cancel-ultraqa.md +1 -1
- package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
- package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
- package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
- package/dist/__tests__/analytics/backfill-dedup.test.d.ts +2 -0
- package/dist/__tests__/analytics/backfill-dedup.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/backfill-dedup.test.js +179 -0
- package/dist/__tests__/analytics/backfill-dedup.test.js.map +1 -0
- package/dist/__tests__/analytics/backfill-engine.test.d.ts +2 -0
- package/dist/__tests__/analytics/backfill-engine.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/backfill-engine.test.js +362 -0
- package/dist/__tests__/analytics/backfill-engine.test.js.map +1 -0
- package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
- package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
- package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
- package/dist/__tests__/analytics/output-estimator.test.d.ts +2 -0
- package/dist/__tests__/analytics/output-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/output-estimator.test.js +106 -0
- package/dist/__tests__/analytics/output-estimator.test.js.map +1 -0
- package/dist/__tests__/analytics/token-extractor.test.d.ts +2 -0
- package/dist/__tests__/analytics/token-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/token-extractor.test.js +121 -0
- package/dist/__tests__/analytics/token-extractor.test.js.map +1 -0
- package/dist/__tests__/analytics/transcript-parser.test.d.ts +2 -0
- package/dist/__tests__/analytics/transcript-parser.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/transcript-parser.test.js +285 -0
- package/dist/__tests__/analytics/transcript-parser.test.js.map +1 -0
- package/dist/__tests__/analytics/transcript-scanner.test.d.ts +2 -0
- package/dist/__tests__/analytics/transcript-scanner.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/transcript-scanner.test.js +401 -0
- package/dist/__tests__/analytics/transcript-scanner.test.js.map +1 -0
- package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts +2 -0
- package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/transcript-token-extractor.test.js +175 -0
- package/dist/__tests__/analytics/transcript-token-extractor.test.js.map +1 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
- package/dist/analytics/analytics-summary.d.ts +47 -0
- package/dist/analytics/analytics-summary.d.ts.map +1 -0
- package/dist/analytics/analytics-summary.js +170 -0
- package/dist/analytics/analytics-summary.js.map +1 -0
- package/dist/analytics/backfill-dedup.d.ts +49 -0
- package/dist/analytics/backfill-dedup.d.ts.map +1 -0
- package/dist/analytics/backfill-dedup.js +118 -0
- package/dist/analytics/backfill-dedup.js.map +1 -0
- package/dist/analytics/backfill-engine.d.ts +59 -0
- package/dist/analytics/backfill-engine.d.ts.map +1 -0
- package/dist/analytics/backfill-engine.js +163 -0
- package/dist/analytics/backfill-engine.js.map +1 -0
- package/dist/analytics/index.d.ts +8 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +10 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/output-estimator.d.ts +26 -0
- package/dist/analytics/output-estimator.d.ts.map +1 -0
- package/dist/analytics/output-estimator.js +61 -0
- package/dist/analytics/output-estimator.js.map +1 -0
- package/dist/analytics/token-extractor.d.ts +31 -0
- package/dist/analytics/token-extractor.d.ts.map +1 -0
- package/dist/analytics/token-extractor.js +57 -0
- package/dist/analytics/token-extractor.js.map +1 -0
- package/dist/analytics/token-tracker.d.ts +7 -1
- package/dist/analytics/token-tracker.d.ts.map +1 -1
- package/dist/analytics/token-tracker.js +81 -0
- package/dist/analytics/token-tracker.js.map +1 -1
- package/dist/analytics/transcript-parser.d.ts +42 -0
- package/dist/analytics/transcript-parser.d.ts.map +1 -0
- package/dist/analytics/transcript-parser.js +90 -0
- package/dist/analytics/transcript-parser.js.map +1 -0
- package/dist/analytics/transcript-scanner.d.ts +50 -0
- package/dist/analytics/transcript-scanner.d.ts.map +1 -0
- package/dist/analytics/transcript-scanner.js +149 -0
- package/dist/analytics/transcript-scanner.js.map +1 -0
- package/dist/analytics/transcript-token-extractor.d.ts +19 -0
- package/dist/analytics/transcript-token-extractor.d.ts.map +1 -0
- package/dist/analytics/transcript-token-extractor.js +89 -0
- package/dist/analytics/transcript-token-extractor.js.map +1 -0
- package/dist/analytics/types.d.ts +52 -0
- package/dist/analytics/types.d.ts.map +1 -1
- package/dist/analytics/types.js.map +1 -1
- package/dist/cli/analytics.js +26 -1
- package/dist/cli/analytics.js.map +1 -1
- package/dist/cli/commands/backfill.d.ts +15 -0
- package/dist/cli/commands/backfill.d.ts.map +1 -0
- package/dist/cli/commands/backfill.js +146 -0
- package/dist/cli/commands/backfill.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +67 -31
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/components/CostDashboard.d.ts +15 -0
- package/dist/cli/components/CostDashboard.d.ts.map +1 -0
- package/dist/cli/components/CostDashboard.js +15 -0
- package/dist/cli/components/CostDashboard.js.map +1 -0
- package/dist/cli/components/LiveStats.d.ts +16 -0
- package/dist/cli/components/LiveStats.d.ts.map +1 -0
- package/dist/cli/components/LiveStats.js +16 -0
- package/dist/cli/components/LiveStats.js.map +1 -0
- package/dist/cli/components/SessionBrowser.d.ts +14 -0
- package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
- package/dist/cli/components/SessionBrowser.js +14 -0
- package/dist/cli/components/SessionBrowser.js.map +1 -0
- package/dist/cli/index.js +159 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tui.d.ts +21 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +21 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/hud/analytics-display.d.ts +16 -0
- package/dist/hud/analytics-display.d.ts.map +1 -1
- package/dist/hud/analytics-display.js +42 -0
- package/dist/hud/analytics-display.js.map +1 -1
- package/dist/hud/index.js +90 -3
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +27 -1
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/types.d.ts +2 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js.map +1 -1
- package/docs/ANALYTICS-SYSTEM.md +150 -0
- package/docs/FULL-README.md +2 -2
- package/hooks/keyword-detector.sh +1 -1
- package/package.json +1 -1
- package/scripts/keyword-detector.mjs +1 -1
- package/scripts/persistent-mode.mjs +1 -1
- package/scripts/test-mutual-exclusion.ts +4 -4
- package/scripts/test-remember-tags.ts +6 -6
- package/scripts/test-session-injection.ts +4 -4
- package/skills/cancel-ultraqa/SKILL.md +1 -1
- package/skills/omc-setup/SKILL.md +30 -5
package/dist/analytics/index.js
CHANGED
|
@@ -11,4 +11,14 @@ export * from './session-types.js';
|
|
|
11
11
|
export * from './metrics-collector.js';
|
|
12
12
|
export * from './query-engine.js';
|
|
13
13
|
export * from './export.js';
|
|
14
|
+
// Phase 2 modules (auto-tracking)
|
|
15
|
+
export * from './token-extractor.js';
|
|
16
|
+
export * from './output-estimator.js';
|
|
17
|
+
export * from './analytics-summary.js';
|
|
18
|
+
// Offline transcript analysis modules
|
|
19
|
+
export * from './transcript-scanner.js';
|
|
20
|
+
export * from './transcript-parser.js';
|
|
21
|
+
export * from './transcript-token-extractor.js';
|
|
22
|
+
export * from './backfill-dedup.js';
|
|
23
|
+
export * from './backfill-engine.js';
|
|
14
24
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAE5B,kCAAkC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,sCAAsC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-specific output token estimation based on input tokens.
|
|
3
|
+
*
|
|
4
|
+
* Ratios based on empirical observation:
|
|
5
|
+
* - Haiku: 30% (concise responses)
|
|
6
|
+
* - Sonnet: 40% (balanced responses)
|
|
7
|
+
* - Opus: 50% (detailed reasoning)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Estimate output tokens from input tokens using model-specific ratios.
|
|
11
|
+
*
|
|
12
|
+
* @param inputTokens - Number of input tokens consumed
|
|
13
|
+
* @param modelName - Model name (e.g., "claude-sonnet-4.5")
|
|
14
|
+
* @returns Estimated output tokens (rounded to nearest integer)
|
|
15
|
+
*/
|
|
16
|
+
export declare function estimateOutputTokens(inputTokens: number, modelName: string): number;
|
|
17
|
+
/**
|
|
18
|
+
* Extract session ID from transcript path.
|
|
19
|
+
*
|
|
20
|
+
* Pattern: /path/to/.claude/projects/{sessionId}/transcript.jsonl
|
|
21
|
+
*
|
|
22
|
+
* @param transcriptPath - Full path to transcript file
|
|
23
|
+
* @returns Session ID (extracted or hashed)
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractSessionId(transcriptPath: string): string;
|
|
26
|
+
//# sourceMappingURL=output-estimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-estimator.d.ts","sourceRoot":"","sources":["../../src/analytics/output-estimator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKnF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAc/D"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-specific output token estimation based on input tokens.
|
|
3
|
+
*
|
|
4
|
+
* Ratios based on empirical observation:
|
|
5
|
+
* - Haiku: 30% (concise responses)
|
|
6
|
+
* - Sonnet: 40% (balanced responses)
|
|
7
|
+
* - Opus: 50% (detailed reasoning)
|
|
8
|
+
*/
|
|
9
|
+
const MODEL_OUTPUT_RATIOS = {
|
|
10
|
+
'haiku': 0.30,
|
|
11
|
+
'sonnet': 0.40,
|
|
12
|
+
'opus': 0.50
|
|
13
|
+
};
|
|
14
|
+
const DEFAULT_RATIO = 0.40; // Sonnet baseline
|
|
15
|
+
/**
|
|
16
|
+
* Estimate output tokens from input tokens using model-specific ratios.
|
|
17
|
+
*
|
|
18
|
+
* @param inputTokens - Number of input tokens consumed
|
|
19
|
+
* @param modelName - Model name (e.g., "claude-sonnet-4.5")
|
|
20
|
+
* @returns Estimated output tokens (rounded to nearest integer)
|
|
21
|
+
*/
|
|
22
|
+
export function estimateOutputTokens(inputTokens, modelName) {
|
|
23
|
+
if (inputTokens === 0)
|
|
24
|
+
return 0;
|
|
25
|
+
const ratio = detectModelRatio(modelName);
|
|
26
|
+
return Math.round(inputTokens * ratio);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Extract session ID from transcript path.
|
|
30
|
+
*
|
|
31
|
+
* Pattern: /path/to/.claude/projects/{sessionId}/transcript.jsonl
|
|
32
|
+
*
|
|
33
|
+
* @param transcriptPath - Full path to transcript file
|
|
34
|
+
* @returns Session ID (extracted or hashed)
|
|
35
|
+
*/
|
|
36
|
+
export function extractSessionId(transcriptPath) {
|
|
37
|
+
// Try to extract from path pattern
|
|
38
|
+
const match = transcriptPath.match(/projects\/([a-f0-9]{8,})/i);
|
|
39
|
+
if (match) {
|
|
40
|
+
return match[1];
|
|
41
|
+
}
|
|
42
|
+
// Fallback: hash the path
|
|
43
|
+
const crypto = require('crypto');
|
|
44
|
+
return crypto.createHash('md5')
|
|
45
|
+
.update(transcriptPath)
|
|
46
|
+
.digest('hex')
|
|
47
|
+
.slice(0, 16);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Detect model tier and return appropriate output ratio.
|
|
51
|
+
*/
|
|
52
|
+
function detectModelRatio(modelName) {
|
|
53
|
+
const normalized = modelName.toLowerCase();
|
|
54
|
+
for (const [tier, ratio] of Object.entries(MODEL_OUTPUT_RATIOS)) {
|
|
55
|
+
if (normalized.includes(tier)) {
|
|
56
|
+
return ratio;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return DEFAULT_RATIO;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=output-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-estimator.js","sourceRoot":"","sources":["../../src/analytics/output-estimator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,mBAAmB,GAA2B;IAClD,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;CACb,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,kBAAkB;AAE9C;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,SAAiB;IACzE,IAAI,WAAW,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAsB;IACrD,mCAAmC;IACnC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAEhE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;SAC5B,MAAM,CAAC,cAAc,CAAC;SACtB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAChE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { StatuslineStdin } from '../hud/types.js';
|
|
2
|
+
export interface ExtractedTokens {
|
|
3
|
+
inputTokens: number;
|
|
4
|
+
outputTokens: number;
|
|
5
|
+
cacheCreationTokens: number;
|
|
6
|
+
cacheReadTokens: number;
|
|
7
|
+
modelName: string;
|
|
8
|
+
agentName?: string;
|
|
9
|
+
isEstimated: boolean;
|
|
10
|
+
timestamp: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TokenDelta {
|
|
13
|
+
inputDelta: number;
|
|
14
|
+
cacheDelta: number;
|
|
15
|
+
cacheReadDelta: number;
|
|
16
|
+
}
|
|
17
|
+
export interface TokenSnapshot {
|
|
18
|
+
inputTokens: number;
|
|
19
|
+
cacheCreationTokens: number;
|
|
20
|
+
cacheReadTokens: number;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extract token usage from StatuslineStdin and calculate delta from previous snapshot.
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractTokens(stdin: StatuslineStdin, previousSnapshot: TokenSnapshot | null, modelName: string, agentName?: string): ExtractedTokens;
|
|
27
|
+
/**
|
|
28
|
+
* Create current snapshot for next delta calculation.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createSnapshot(stdin: StatuslineStdin): TokenSnapshot;
|
|
31
|
+
//# sourceMappingURL=token-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-extractor.d.ts","sourceRoot":"","sources":["../../src/analytics/token-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,gBAAgB,EAAE,aAAa,GAAG,IAAI,EACtC,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,eAAe,CAiCjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CASpE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { estimateOutputTokens } from './output-estimator.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract token usage from StatuslineStdin and calculate delta from previous snapshot.
|
|
4
|
+
*/
|
|
5
|
+
export function extractTokens(stdin, previousSnapshot, modelName, agentName) {
|
|
6
|
+
const currentUsage = stdin.context_window.current_usage;
|
|
7
|
+
if (!currentUsage) {
|
|
8
|
+
return createEmptyExtraction(modelName, agentName);
|
|
9
|
+
}
|
|
10
|
+
// Calculate deltas
|
|
11
|
+
const inputDelta = previousSnapshot
|
|
12
|
+
? currentUsage.input_tokens - previousSnapshot.inputTokens
|
|
13
|
+
: currentUsage.input_tokens;
|
|
14
|
+
const cacheDelta = previousSnapshot
|
|
15
|
+
? currentUsage.cache_creation_input_tokens - previousSnapshot.cacheCreationTokens
|
|
16
|
+
: currentUsage.cache_creation_input_tokens;
|
|
17
|
+
const cacheReadDelta = previousSnapshot
|
|
18
|
+
? currentUsage.cache_read_input_tokens - previousSnapshot.cacheReadTokens
|
|
19
|
+
: currentUsage.cache_read_input_tokens;
|
|
20
|
+
// Estimate output tokens (from output-estimator.ts)
|
|
21
|
+
const outputTokens = estimateOutputTokens(inputDelta, modelName);
|
|
22
|
+
return {
|
|
23
|
+
inputTokens: Math.max(0, inputDelta),
|
|
24
|
+
outputTokens,
|
|
25
|
+
cacheCreationTokens: Math.max(0, cacheDelta),
|
|
26
|
+
cacheReadTokens: Math.max(0, cacheReadDelta),
|
|
27
|
+
modelName,
|
|
28
|
+
agentName,
|
|
29
|
+
isEstimated: true,
|
|
30
|
+
timestamp: new Date().toISOString()
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create current snapshot for next delta calculation.
|
|
35
|
+
*/
|
|
36
|
+
export function createSnapshot(stdin) {
|
|
37
|
+
const usage = stdin.context_window.current_usage;
|
|
38
|
+
return {
|
|
39
|
+
inputTokens: usage?.input_tokens ?? 0,
|
|
40
|
+
cacheCreationTokens: usage?.cache_creation_input_tokens ?? 0,
|
|
41
|
+
cacheReadTokens: usage?.cache_read_input_tokens ?? 0,
|
|
42
|
+
timestamp: new Date().toISOString()
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function createEmptyExtraction(modelName, agentName) {
|
|
46
|
+
return {
|
|
47
|
+
inputTokens: 0,
|
|
48
|
+
outputTokens: 0,
|
|
49
|
+
cacheCreationTokens: 0,
|
|
50
|
+
cacheReadTokens: 0,
|
|
51
|
+
modelName,
|
|
52
|
+
agentName,
|
|
53
|
+
isEstimated: true,
|
|
54
|
+
timestamp: new Date().toISOString()
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=token-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-extractor.js","sourceRoot":"","sources":["../../src/analytics/token-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AA0B7D;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAsB,EACtB,gBAAsC,EACtC,SAAiB,EACjB,SAAkB;IAElB,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC;IAExD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,gBAAgB;QACjC,CAAC,CAAC,YAAY,CAAC,YAAY,GAAG,gBAAgB,CAAC,WAAW;QAC1D,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC;IAE9B,MAAM,UAAU,GAAG,gBAAgB;QACjC,CAAC,CAAC,YAAY,CAAC,2BAA2B,GAAG,gBAAgB,CAAC,mBAAmB;QACjF,CAAC,CAAC,YAAY,CAAC,2BAA2B,CAAC;IAE7C,MAAM,cAAc,GAAG,gBAAgB;QACrC,CAAC,CAAC,YAAY,CAAC,uBAAuB,GAAG,gBAAgB,CAAC,eAAe;QACzE,CAAC,CAAC,YAAY,CAAC,uBAAuB,CAAC;IAEzC,oDAAoD;IACpD,MAAM,YAAY,GAAG,oBAAoB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAEjE,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;QACpC,YAAY;QACZ,mBAAmB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;QAC5C,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC;QAC5C,SAAS;QACT,SAAS;QACT,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC;IAEjD,OAAO;QACL,WAAW,EAAE,KAAK,EAAE,YAAY,IAAI,CAAC;QACrC,mBAAmB,EAAE,KAAK,EAAE,2BAA2B,IAAI,CAAC;QAC5D,eAAe,EAAE,KAAK,EAAE,uBAAuB,IAAI,CAAC;QACpD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB,EAAE,SAAkB;IAClE,OAAO;QACL,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,mBAAmB,EAAE,CAAC;QACtB,eAAe,EAAE,CAAC;QAClB,SAAS;QACT,SAAS;QACT,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TokenUsage, SessionTokenStats } from './types.js';
|
|
1
|
+
import { TokenUsage, SessionTokenStats, AggregateTokenStats } from './types.js';
|
|
2
2
|
export declare class TokenTracker {
|
|
3
3
|
private currentSessionId;
|
|
4
4
|
private sessionStats;
|
|
@@ -12,6 +12,12 @@ export declare class TokenTracker {
|
|
|
12
12
|
loadSessionStats(sessionId?: string): Promise<SessionTokenStats | null>;
|
|
13
13
|
private rebuildStatsFromLog;
|
|
14
14
|
getSessionStats(): SessionTokenStats;
|
|
15
|
+
getAllStats(): Promise<AggregateTokenStats>;
|
|
16
|
+
getTopAgentsAllSessions(limit?: number): Promise<Array<{
|
|
17
|
+
agent: string;
|
|
18
|
+
tokens: number;
|
|
19
|
+
cost: number;
|
|
20
|
+
}>>;
|
|
15
21
|
getTopAgents(limit?: number): Promise<Array<{
|
|
16
22
|
agent: string;
|
|
17
23
|
tokens: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/analytics/token-tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/analytics/token-tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAOhF,qBAAa,YAAY;IACvB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAoB;gBAE5B,SAAS,CAAC,EAAE,MAAM;IAK9B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,sBAAsB;IAexB,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAiB3E,WAAW;IAQzB,OAAO,CAAC,kBAAkB;YAsBZ,gBAAgB;IAIxB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAe/D,mBAAmB;IAsBjC,eAAe,IAAI,iBAAiB;IAI9B,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAoF3C,uBAAuB,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAY3G,YAAY,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAsBhG,cAAc,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CA4BlE;AAKD,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAKhE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAGlE"}
|
|
@@ -101,6 +101,87 @@ export class TokenTracker {
|
|
|
101
101
|
getSessionStats() {
|
|
102
102
|
return { ...this.sessionStats };
|
|
103
103
|
}
|
|
104
|
+
async getAllStats() {
|
|
105
|
+
const { calculateCost } = await import('./cost-estimator.js');
|
|
106
|
+
const logPath = path.resolve(process.cwd(), TOKEN_LOG_FILE);
|
|
107
|
+
const stats = {
|
|
108
|
+
totalInputTokens: 0,
|
|
109
|
+
totalOutputTokens: 0,
|
|
110
|
+
totalCacheCreation: 0,
|
|
111
|
+
totalCacheRead: 0,
|
|
112
|
+
totalCost: 0,
|
|
113
|
+
byAgent: {},
|
|
114
|
+
byModel: {},
|
|
115
|
+
sessionCount: 0,
|
|
116
|
+
entryCount: 0,
|
|
117
|
+
firstEntry: null,
|
|
118
|
+
lastEntry: null
|
|
119
|
+
};
|
|
120
|
+
try {
|
|
121
|
+
const content = await fs.readFile(logPath, 'utf-8');
|
|
122
|
+
const lines = content.trim().split('\n').filter(line => line.trim());
|
|
123
|
+
if (lines.length === 0) {
|
|
124
|
+
return stats;
|
|
125
|
+
}
|
|
126
|
+
const sessions = new Set();
|
|
127
|
+
for (const line of lines) {
|
|
128
|
+
const record = JSON.parse(line);
|
|
129
|
+
stats.entryCount++;
|
|
130
|
+
// Track unique sessions
|
|
131
|
+
sessions.add(record.sessionId);
|
|
132
|
+
// Track timestamps
|
|
133
|
+
if (!stats.firstEntry || record.timestamp < stats.firstEntry) {
|
|
134
|
+
stats.firstEntry = record.timestamp;
|
|
135
|
+
}
|
|
136
|
+
if (!stats.lastEntry || record.timestamp > stats.lastEntry) {
|
|
137
|
+
stats.lastEntry = record.timestamp;
|
|
138
|
+
}
|
|
139
|
+
// Aggregate totals
|
|
140
|
+
stats.totalInputTokens += record.inputTokens;
|
|
141
|
+
stats.totalOutputTokens += record.outputTokens;
|
|
142
|
+
stats.totalCacheCreation += record.cacheCreationTokens;
|
|
143
|
+
stats.totalCacheRead += record.cacheReadTokens;
|
|
144
|
+
// Calculate cost for this record
|
|
145
|
+
const cost = calculateCost({
|
|
146
|
+
modelName: record.modelName,
|
|
147
|
+
inputTokens: record.inputTokens,
|
|
148
|
+
outputTokens: record.outputTokens,
|
|
149
|
+
cacheCreationTokens: record.cacheCreationTokens,
|
|
150
|
+
cacheReadTokens: record.cacheReadTokens
|
|
151
|
+
});
|
|
152
|
+
stats.totalCost += cost.totalCost;
|
|
153
|
+
// Aggregate by agent
|
|
154
|
+
if (record.agentName) {
|
|
155
|
+
if (!stats.byAgent[record.agentName]) {
|
|
156
|
+
stats.byAgent[record.agentName] = { tokens: 0, cost: 0 };
|
|
157
|
+
}
|
|
158
|
+
stats.byAgent[record.agentName].tokens += record.inputTokens + record.outputTokens;
|
|
159
|
+
stats.byAgent[record.agentName].cost += cost.totalCost;
|
|
160
|
+
}
|
|
161
|
+
// Aggregate by model
|
|
162
|
+
if (!stats.byModel[record.modelName]) {
|
|
163
|
+
stats.byModel[record.modelName] = { tokens: 0, cost: 0 };
|
|
164
|
+
}
|
|
165
|
+
stats.byModel[record.modelName].tokens += record.inputTokens + record.outputTokens;
|
|
166
|
+
stats.byModel[record.modelName].cost += cost.totalCost;
|
|
167
|
+
}
|
|
168
|
+
stats.sessionCount = sessions.size;
|
|
169
|
+
return stats;
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
// If file doesn't exist or is empty, return empty stats
|
|
173
|
+
return stats;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
async getTopAgentsAllSessions(limit = 5) {
|
|
177
|
+
const allStats = await this.getAllStats();
|
|
178
|
+
const agentStats = Object.entries(allStats.byAgent).map(([agent, stats]) => ({
|
|
179
|
+
agent,
|
|
180
|
+
tokens: stats.tokens,
|
|
181
|
+
cost: stats.cost
|
|
182
|
+
}));
|
|
183
|
+
return agentStats.sort((a, b) => b.cost - a.cost).slice(0, limit);
|
|
184
|
+
}
|
|
104
185
|
async getTopAgents(limit = 5) {
|
|
105
186
|
const { calculateCost } = await import('./cost-estimator.js');
|
|
106
187
|
const agentStats = Object.entries(this.sessionStats.byAgent).map(([agent, usages]) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../src/analytics/token-tracker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../src/analytics/token-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { TranscriptEntry } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Options for transcript parsing.
|
|
4
|
+
*/
|
|
5
|
+
export interface ParseTranscriptOptions {
|
|
6
|
+
/**
|
|
7
|
+
* AbortSignal to cancel parsing mid-stream.
|
|
8
|
+
*/
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
/**
|
|
11
|
+
* Callback for parse errors (allows custom logging).
|
|
12
|
+
*/
|
|
13
|
+
onParseError?: (line: string, error: Error) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Streaming JSONL parser for transcript files.
|
|
17
|
+
* Parses line-by-line without loading the entire file into memory.
|
|
18
|
+
*
|
|
19
|
+
* @param filePath - Path to the transcript JSONL file
|
|
20
|
+
* @param options - Parsing options including AbortSignal
|
|
21
|
+
* @yields TranscriptEntry objects
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const controller = new AbortController();
|
|
26
|
+
* for await (const entry of parseTranscript('transcript.jsonl', { signal: controller.signal })) {
|
|
27
|
+
* console.log(entry);
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseTranscript(filePath: string, options?: ParseTranscriptOptions): AsyncGenerator<TranscriptEntry>;
|
|
32
|
+
/**
|
|
33
|
+
* Load all entries from a transcript file into memory.
|
|
34
|
+
* Use this for smaller files or when you need all entries at once.
|
|
35
|
+
* For large files, prefer the streaming `parseTranscript()` generator.
|
|
36
|
+
*
|
|
37
|
+
* @param filePath - Path to the transcript JSONL file
|
|
38
|
+
* @param options - Parsing options
|
|
39
|
+
* @returns Array of all transcript entries
|
|
40
|
+
*/
|
|
41
|
+
export declare function loadTranscript(filePath: string, options?: ParseTranscriptOptions): Promise<TranscriptEntry[]>;
|
|
42
|
+
//# sourceMappingURL=transcript-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-parser.d.ts","sourceRoot":"","sources":["../../src/analytics/transcript-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAuB,eAAe,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,sBAA2B,GACnC,cAAc,CAAC,eAAe,CAAC,CA2DjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,eAAe,EAAE,CAAC,CAQ5B"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as readline from 'readline';
|
|
3
|
+
/**
|
|
4
|
+
* Streaming JSONL parser for transcript files.
|
|
5
|
+
* Parses line-by-line without loading the entire file into memory.
|
|
6
|
+
*
|
|
7
|
+
* @param filePath - Path to the transcript JSONL file
|
|
8
|
+
* @param options - Parsing options including AbortSignal
|
|
9
|
+
* @yields TranscriptEntry objects
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const controller = new AbortController();
|
|
14
|
+
* for await (const entry of parseTranscript('transcript.jsonl', { signal: controller.signal })) {
|
|
15
|
+
* console.log(entry);
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export async function* parseTranscript(filePath, options = {}) {
|
|
20
|
+
const { signal, onParseError } = options;
|
|
21
|
+
// Check if file exists
|
|
22
|
+
if (!fs.existsSync(filePath)) {
|
|
23
|
+
throw new Error(`Transcript file not found: ${filePath}`);
|
|
24
|
+
}
|
|
25
|
+
const fileStream = fs.createReadStream(filePath, { encoding: 'utf8' });
|
|
26
|
+
const rl = readline.createInterface({
|
|
27
|
+
input: fileStream,
|
|
28
|
+
crlfDelay: Infinity // Treat \r\n as single line break
|
|
29
|
+
});
|
|
30
|
+
// Handle abort signal
|
|
31
|
+
const abortHandler = () => {
|
|
32
|
+
rl.close();
|
|
33
|
+
fileStream.destroy();
|
|
34
|
+
};
|
|
35
|
+
if (signal) {
|
|
36
|
+
signal.addEventListener('abort', abortHandler);
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
for await (const line of rl) {
|
|
40
|
+
// Check abort before processing each line
|
|
41
|
+
if (signal?.aborted) {
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
// Skip empty lines
|
|
45
|
+
if (!line.trim()) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const entry = JSON.parse(line);
|
|
50
|
+
yield entry;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// Handle malformed JSON gracefully
|
|
54
|
+
const parseError = error instanceof Error ? error : new Error(String(error));
|
|
55
|
+
if (onParseError) {
|
|
56
|
+
onParseError(line, parseError);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Default: log warning and skip line
|
|
60
|
+
console.warn(`[transcript-parser] Skipping malformed line: ${parseError.message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
// Clean up
|
|
67
|
+
if (signal) {
|
|
68
|
+
signal.removeEventListener('abort', abortHandler);
|
|
69
|
+
}
|
|
70
|
+
rl.close();
|
|
71
|
+
fileStream.destroy();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Load all entries from a transcript file into memory.
|
|
76
|
+
* Use this for smaller files or when you need all entries at once.
|
|
77
|
+
* For large files, prefer the streaming `parseTranscript()` generator.
|
|
78
|
+
*
|
|
79
|
+
* @param filePath - Path to the transcript JSONL file
|
|
80
|
+
* @param options - Parsing options
|
|
81
|
+
* @returns Array of all transcript entries
|
|
82
|
+
*/
|
|
83
|
+
export async function loadTranscript(filePath, options = {}) {
|
|
84
|
+
const entries = [];
|
|
85
|
+
for await (const entry of parseTranscript(filePath, options)) {
|
|
86
|
+
entries.push(entry);
|
|
87
|
+
}
|
|
88
|
+
return entries;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=transcript-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-parser.js","sourceRoot":"","sources":["../../src/analytics/transcript-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAkBrC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,QAAgB,EAChB,UAAkC,EAAE;IAEpC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAEzC,uBAAuB;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,QAAQ,CAAC,kCAAkC;KACvD,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,0CAA0C;YAC1C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM;YACR,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;gBAClD,MAAM,KAAK,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,mCAAmC;gBACnC,MAAM,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAE7E,IAAI,YAAY,EAAE,CAAC;oBACjB,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,qCAAqC;oBACrC,OAAO,CAAC,IAAI,CAAC,gDAAgD,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,WAAW;QACX,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACpD,CAAC;QACD,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,UAAkC,EAAE;IAEpC,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata for a discovered transcript file
|
|
3
|
+
*/
|
|
4
|
+
export interface TranscriptFile {
|
|
5
|
+
projectPath: string;
|
|
6
|
+
projectDir: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
filePath: string;
|
|
9
|
+
fileSize: number;
|
|
10
|
+
modifiedTime: Date;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Result of scanning for transcripts
|
|
14
|
+
*/
|
|
15
|
+
export interface ScanResult {
|
|
16
|
+
transcripts: TranscriptFile[];
|
|
17
|
+
totalSize: number;
|
|
18
|
+
projectCount: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Options for scanning transcripts
|
|
22
|
+
*/
|
|
23
|
+
export interface ScanOptions {
|
|
24
|
+
projectFilter?: string;
|
|
25
|
+
minDate?: Date;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Decode project directory name back to original path.
|
|
29
|
+
*
|
|
30
|
+
* The encoding scheme used by Claude Code is lossy - it converts all path
|
|
31
|
+
* separators (/) to dashes (-), but legitimate dashes in directory names
|
|
32
|
+
* also become dashes, making them indistinguishable.
|
|
33
|
+
*
|
|
34
|
+
* Strategy:
|
|
35
|
+
* 1. Try simple decode (all dashes -> slashes) and check if path exists
|
|
36
|
+
* 2. If not, try to reconstruct by checking filesystem for partial matches
|
|
37
|
+
* 3. Fall back to simple decode if nothing else works
|
|
38
|
+
*
|
|
39
|
+
* Example: "-home-bellman-my-project"
|
|
40
|
+
* - Simple decode: "/home/bellman/my/project" (WRONG if "my-project" is one dir)
|
|
41
|
+
* - Smart decode: "/home/bellman/my-project" (checks filesystem)
|
|
42
|
+
*
|
|
43
|
+
* @internal Exported for testing
|
|
44
|
+
*/
|
|
45
|
+
export declare function decodeProjectPath(dirName: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Scan for all transcript files in ~/.claude/projects/
|
|
48
|
+
*/
|
|
49
|
+
export declare function scanTranscripts(options?: ScanOptions): Promise<ScanResult>;
|
|
50
|
+
//# sourceMappingURL=transcript-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-scanner.d.ts","sourceRoot":"","sources":["../../src/analytics/transcript-scanner.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAOD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+CzD;AAkBD;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CA8EpF"}
|