rafcode 2.3.0 → 2.4.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.
- package/CLAUDE.md +19 -4
- package/RAF/ahvrih-rate-forge/decisions.md +70 -0
- package/RAF/ahvrih-rate-forge/input.md +44 -0
- package/RAF/ahvrih-rate-forge/outcomes/01-remove-claude-command-config.md +58 -0
- package/RAF/ahvrih-rate-forge/outcomes/02-fix-mixed-attempt-cost.md +46 -0
- package/RAF/ahvrih-rate-forge/outcomes/03-rate-limit-estimation.md +82 -0
- package/RAF/ahvrih-rate-forge/outcomes/04-show-version-in-do-logs.md +45 -0
- package/RAF/ahvrih-rate-forge/outcomes/05-sync-main-before-worktree.md +96 -0
- package/RAF/ahvrih-rate-forge/outcomes/06-sync-readme-with-codebase.md +45 -0
- package/RAF/ahvrih-rate-forge/outcomes/07-no-session-persistence.md +26 -0
- package/RAF/ahvrih-rate-forge/outcomes/08-plan-execution-metadata.md +130 -0
- package/RAF/ahvrih-rate-forge/plans/01-remove-claude-command-config.md +36 -0
- package/RAF/ahvrih-rate-forge/plans/02-fix-mixed-attempt-cost.md +33 -0
- package/RAF/ahvrih-rate-forge/plans/03-rate-limit-estimation.md +82 -0
- package/RAF/ahvrih-rate-forge/plans/04-show-version-in-do-logs.md +32 -0
- package/RAF/ahvrih-rate-forge/plans/05-sync-main-before-worktree.md +40 -0
- package/RAF/ahvrih-rate-forge/plans/06-sync-readme-with-codebase.md +61 -0
- package/RAF/ahvrih-rate-forge/plans/07-no-session-persistence.md +28 -0
- package/RAF/ahvrih-rate-forge/plans/08-plan-execution-metadata.md +123 -0
- package/README.md +27 -7
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +1 -6
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/do.d.ts.map +1 -1
- package/dist/commands/do.js +106 -18
- package/dist/commands/do.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +77 -2
- package/dist/commands/plan.js.map +1 -1
- package/dist/core/claude-runner.d.ts +6 -6
- package/dist/core/claude-runner.d.ts.map +1 -1
- package/dist/core/claude-runner.js +9 -10
- package/dist/core/claude-runner.js.map +1 -1
- package/dist/core/failure-analyzer.d.ts.map +1 -1
- package/dist/core/failure-analyzer.js +3 -3
- package/dist/core/failure-analyzer.js.map +1 -1
- package/dist/core/pull-request.js +3 -3
- package/dist/core/pull-request.js.map +1 -1
- package/dist/core/state-derivation.d.ts +5 -0
- package/dist/core/state-derivation.d.ts.map +1 -1
- package/dist/core/state-derivation.js +14 -4
- package/dist/core/state-derivation.js.map +1 -1
- package/dist/core/worktree.d.ts +32 -0
- package/dist/core/worktree.d.ts.map +1 -1
- package/dist/core/worktree.js +215 -0
- package/dist/core/worktree.js.map +1 -1
- package/dist/prompts/amend.d.ts.map +1 -1
- package/dist/prompts/amend.js +26 -11
- package/dist/prompts/amend.js.map +1 -1
- package/dist/prompts/planning.d.ts.map +1 -1
- package/dist/prompts/planning.js +26 -11
- package/dist/prompts/planning.js.map +1 -1
- package/dist/types/config.d.ts +30 -13
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +14 -10
- package/dist/types/config.js.map +1 -1
- package/dist/utils/config.d.ts +47 -4
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +176 -30
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +43 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +85 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/name-generator.d.ts.map +1 -1
- package/dist/utils/name-generator.js +2 -3
- package/dist/utils/name-generator.js.map +1 -1
- package/dist/utils/session-parser.d.ts +44 -0
- package/dist/utils/session-parser.d.ts.map +1 -0
- package/dist/utils/session-parser.js +122 -0
- package/dist/utils/session-parser.js.map +1 -0
- package/dist/utils/terminal-symbols.d.ts +22 -3
- package/dist/utils/terminal-symbols.d.ts.map +1 -1
- package/dist/utils/terminal-symbols.js +52 -18
- package/dist/utils/terminal-symbols.js.map +1 -1
- package/dist/utils/token-tracker.d.ts +20 -0
- package/dist/utils/token-tracker.d.ts.map +1 -1
- package/dist/utils/token-tracker.js +57 -2
- package/dist/utils/token-tracker.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/config.ts +0 -7
- package/src/commands/do.ts +141 -20
- package/src/commands/plan.ts +87 -1
- package/src/core/claude-runner.ts +16 -17
- package/src/core/failure-analyzer.ts +3 -3
- package/src/core/pull-request.ts +3 -3
- package/src/core/state-derivation.ts +20 -4
- package/src/core/worktree.ts +230 -0
- package/src/prompts/amend.ts +26 -11
- package/src/prompts/config-docs.md +91 -29
- package/src/prompts/planning.ts +26 -11
- package/src/types/config.ts +46 -21
- package/src/utils/config.ts +200 -33
- package/src/utils/frontmatter.ts +110 -0
- package/src/utils/name-generator.ts +2 -3
- package/src/utils/session-parser.ts +161 -0
- package/src/utils/terminal-symbols.ts +68 -16
- package/src/utils/token-tracker.ts +65 -2
- package/tests/unit/claude-runner-interactive.test.ts +8 -6
- package/tests/unit/claude-runner.test.ts +5 -66
- package/tests/unit/config-command.test.ts +6 -6
- package/tests/unit/config.test.ts +268 -45
- package/tests/unit/frontmatter.test.ts +182 -0
- package/tests/unit/post-execution-picker.test.ts +5 -0
- package/tests/unit/session-parser.test.ts +301 -0
- package/tests/unit/terminal-symbols.test.ts +142 -0
- package/tests/unit/token-tracker.test.ts +304 -1
- package/tests/unit/validation.test.ts +6 -4
- package/tests/unit/worktree.test.ts +242 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { VALID_TASK_EFFORTS } from '../types/config.js';
|
|
2
|
+
import { isValidModelName } from './config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Parse Obsidian-style frontmatter from plan file content.
|
|
5
|
+
*
|
|
6
|
+
* Format: `key: value` lines at the top of the file, terminated by a `---` line.
|
|
7
|
+
* There is NO opening `---` delimiter — just properties followed by `---`.
|
|
8
|
+
*
|
|
9
|
+
* Example:
|
|
10
|
+
* ```
|
|
11
|
+
* effort: medium
|
|
12
|
+
* model: sonnet
|
|
13
|
+
* ---
|
|
14
|
+
* # Task: ...
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* The parser is lenient:
|
|
18
|
+
* - Ignores unknown keys (with a warning)
|
|
19
|
+
* - Handles missing `---` delimiter gracefully (returns empty frontmatter)
|
|
20
|
+
* - Invalid values produce warnings but don't throw
|
|
21
|
+
* - Case-insensitive value parsing for effort levels
|
|
22
|
+
*/
|
|
23
|
+
export function parsePlanFrontmatter(content) {
|
|
24
|
+
const result = {
|
|
25
|
+
frontmatter: {},
|
|
26
|
+
hasFrontmatter: false,
|
|
27
|
+
warnings: [],
|
|
28
|
+
};
|
|
29
|
+
// Find the closing `---` delimiter
|
|
30
|
+
const delimiterIndex = content.indexOf('---');
|
|
31
|
+
if (delimiterIndex === -1) {
|
|
32
|
+
// No delimiter found - no frontmatter
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
// Extract the frontmatter section (everything before the delimiter)
|
|
36
|
+
const frontmatterSection = content.substring(0, delimiterIndex);
|
|
37
|
+
// Parse key: value lines
|
|
38
|
+
const lines = frontmatterSection.split('\n');
|
|
39
|
+
for (const line of lines) {
|
|
40
|
+
const trimmed = line.trim();
|
|
41
|
+
if (!trimmed)
|
|
42
|
+
continue; // Skip empty lines
|
|
43
|
+
// Check if it looks like a markdown heading (starts with #) - even if it has a colon
|
|
44
|
+
if (trimmed.startsWith('#')) {
|
|
45
|
+
// Markdown content started before `---` - no valid frontmatter
|
|
46
|
+
return {
|
|
47
|
+
frontmatter: {},
|
|
48
|
+
hasFrontmatter: false,
|
|
49
|
+
warnings: ['Frontmatter section contains markdown content before closing delimiter'],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Parse key: value format
|
|
53
|
+
const colonIndex = trimmed.indexOf(':');
|
|
54
|
+
if (colonIndex === -1) {
|
|
55
|
+
continue; // Skip non-property lines
|
|
56
|
+
}
|
|
57
|
+
const key = trimmed.substring(0, colonIndex).trim().toLowerCase();
|
|
58
|
+
const value = trimmed.substring(colonIndex + 1).trim();
|
|
59
|
+
if (key === 'effort') {
|
|
60
|
+
const lowerValue = value.toLowerCase();
|
|
61
|
+
if (VALID_TASK_EFFORTS.includes(lowerValue)) {
|
|
62
|
+
result.frontmatter.effort = lowerValue;
|
|
63
|
+
result.hasFrontmatter = true;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
result.warnings.push(`Invalid effort value: "${value}". Must be one of: ${VALID_TASK_EFFORTS.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (key === 'model') {
|
|
70
|
+
if (isValidModelName(value)) {
|
|
71
|
+
result.frontmatter.model = value;
|
|
72
|
+
result.hasFrontmatter = true;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
result.warnings.push(`Invalid model value: "${value}". Must be a short alias (sonnet, haiku, opus) or a full model ID.`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Unknown key - ignore with warning
|
|
80
|
+
result.warnings.push(`Unknown frontmatter key: "${key}"`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwB/C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,MAAM,GAA2B;QACrC,WAAW,EAAE,EAAE;QACf,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,mCAAmC;IACnC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,sCAAsC;QACtC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oEAAoE;IACpE,MAAM,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAEhE,yBAAyB;IACzB,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS,CAAC,mBAAmB;QAE3C,qFAAqF;QACrF,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,+DAA+D;YAC/D,OAAO;gBACL,WAAW,EAAE,EAAE;gBACf,cAAc,EAAE,KAAK;gBACrB,QAAQ,EAAE,CAAC,wEAAwE,CAAC;aACrF,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,SAAS,CAAC,0BAA0B;QACtC,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEvD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACvC,IAAK,kBAAwC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnE,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,UAA6B,CAAC;gBAC1D,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,0BAA0B,KAAK,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;gBACjC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,KAAK,oEAAoE,CAAC,CAAC;YAC3H,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,GAAG,GAAG,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-generator.d.ts","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"name-generator.d.ts","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"AA4FA;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB9E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAejF;AAwCD;;GAEG;AACH,iBAAS,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyB1D;AAqBD,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { logger } from './logger.js';
|
|
3
3
|
import { sanitizeProjectName } from './validation.js';
|
|
4
|
-
import { getModel
|
|
4
|
+
import { getModel } from './config.js';
|
|
5
5
|
const NAME_GENERATION_PROMPT = `Generate a short, punchy, creative project name (1-3 words, kebab-case).
|
|
6
6
|
|
|
7
7
|
Be creative! Use metaphors, analogies, or evocative words that capture the SPIRIT of the project.
|
|
@@ -42,8 +42,7 @@ Project description:`;
|
|
|
42
42
|
function runClaudePrint(prompt) {
|
|
43
43
|
return new Promise((resolve) => {
|
|
44
44
|
const model = getModel('nameGeneration');
|
|
45
|
-
const
|
|
46
|
-
const proc = spawn(cmd, [
|
|
45
|
+
const proc = spawn('claude', [
|
|
47
46
|
'--model', model,
|
|
48
47
|
'--no-session-persistence',
|
|
49
48
|
'-p',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-generator.js","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"name-generator.js","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for parsing Claude CLI session files to extract token usage data.
|
|
3
|
+
* Claude CLI saves session data to ~/.claude/projects/<escaped-path>/<session-id>.jsonl
|
|
4
|
+
*/
|
|
5
|
+
import type { UsageData } from '../types/config.js';
|
|
6
|
+
/** Result of parsing a session file. */
|
|
7
|
+
export interface SessionParseResult {
|
|
8
|
+
/** Accumulated usage data from all assistant messages. */
|
|
9
|
+
usage: UsageData;
|
|
10
|
+
/** Whether parsing was successful. */
|
|
11
|
+
success: boolean;
|
|
12
|
+
/** Error message if parsing failed. */
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Escape a path for use in Claude's project directory naming scheme.
|
|
17
|
+
* Claude escapes `/` to `-` in project paths.
|
|
18
|
+
*/
|
|
19
|
+
export declare function escapeProjectPath(projectPath: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Compute the expected session file path for a given session ID and working directory.
|
|
22
|
+
*
|
|
23
|
+
* @param sessionId - The UUID session ID passed to --session-id
|
|
24
|
+
* @param cwd - The working directory where Claude was run (project path)
|
|
25
|
+
* @returns The expected path to the session JSONL file
|
|
26
|
+
*/
|
|
27
|
+
export declare function getSessionFilePath(sessionId: string, cwd: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Parse a Claude session JSONL file and extract accumulated token usage data.
|
|
30
|
+
*
|
|
31
|
+
* @param sessionFilePath - Path to the session JSONL file
|
|
32
|
+
* @returns Parsed usage data or error information
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseSessionFile(sessionFilePath: string): SessionParseResult;
|
|
35
|
+
/**
|
|
36
|
+
* Parse a Claude session by session ID and working directory.
|
|
37
|
+
* Convenience wrapper around getSessionFilePath + parseSessionFile.
|
|
38
|
+
*
|
|
39
|
+
* @param sessionId - The UUID session ID passed to --session-id
|
|
40
|
+
* @param cwd - The working directory where Claude was run
|
|
41
|
+
* @returns Parsed usage data or error information
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseSessionById(sessionId: string, cwd: string): SessionParseResult;
|
|
44
|
+
//# sourceMappingURL=session-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-parser.d.ts","sourceRoot":"","sources":["../../src/utils/session-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoBpD,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,KAAK,EAAE,SAAS,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,kBAAkB,CAiF5E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAGnF"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for parsing Claude CLI session files to extract token usage data.
|
|
3
|
+
* Claude CLI saves session data to ~/.claude/projects/<escaped-path>/<session-id>.jsonl
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import * as os from 'node:os';
|
|
8
|
+
/**
|
|
9
|
+
* Escape a path for use in Claude's project directory naming scheme.
|
|
10
|
+
* Claude escapes `/` to `-` in project paths.
|
|
11
|
+
*/
|
|
12
|
+
export function escapeProjectPath(projectPath) {
|
|
13
|
+
// Remove leading slash and replace remaining slashes with dashes
|
|
14
|
+
return projectPath.replace(/^\//, '').replace(/\//g, '-');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compute the expected session file path for a given session ID and working directory.
|
|
18
|
+
*
|
|
19
|
+
* @param sessionId - The UUID session ID passed to --session-id
|
|
20
|
+
* @param cwd - The working directory where Claude was run (project path)
|
|
21
|
+
* @returns The expected path to the session JSONL file
|
|
22
|
+
*/
|
|
23
|
+
export function getSessionFilePath(sessionId, cwd) {
|
|
24
|
+
const claudeDir = path.join(os.homedir(), '.claude', 'projects');
|
|
25
|
+
const escapedPath = escapeProjectPath(cwd);
|
|
26
|
+
return path.join(claudeDir, escapedPath, `${sessionId}.jsonl`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse a Claude session JSONL file and extract accumulated token usage data.
|
|
30
|
+
*
|
|
31
|
+
* @param sessionFilePath - Path to the session JSONL file
|
|
32
|
+
* @returns Parsed usage data or error information
|
|
33
|
+
*/
|
|
34
|
+
export function parseSessionFile(sessionFilePath) {
|
|
35
|
+
const emptyUsage = {
|
|
36
|
+
inputTokens: 0,
|
|
37
|
+
outputTokens: 0,
|
|
38
|
+
cacheReadInputTokens: 0,
|
|
39
|
+
cacheCreationInputTokens: 0,
|
|
40
|
+
modelUsage: {},
|
|
41
|
+
};
|
|
42
|
+
if (!fs.existsSync(sessionFilePath)) {
|
|
43
|
+
return {
|
|
44
|
+
usage: emptyUsage,
|
|
45
|
+
success: false,
|
|
46
|
+
error: `Session file not found: ${sessionFilePath}`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const content = fs.readFileSync(sessionFilePath, 'utf-8');
|
|
51
|
+
const lines = content.trim().split('\n').filter(line => line.trim());
|
|
52
|
+
const accumulated = { ...emptyUsage, modelUsage: {} };
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
try {
|
|
55
|
+
const entry = JSON.parse(line);
|
|
56
|
+
// Only process assistant message entries
|
|
57
|
+
if (entry.type !== 'assistant')
|
|
58
|
+
continue;
|
|
59
|
+
const assistantEntry = entry;
|
|
60
|
+
const usage = assistantEntry.message?.usage;
|
|
61
|
+
const model = assistantEntry.message?.model;
|
|
62
|
+
if (!usage)
|
|
63
|
+
continue;
|
|
64
|
+
const inputTokens = usage.input_tokens ?? 0;
|
|
65
|
+
const outputTokens = usage.output_tokens ?? 0;
|
|
66
|
+
const cacheReadTokens = usage.cache_read_input_tokens ?? 0;
|
|
67
|
+
const cacheCreateTokens = usage.cache_creation_input_tokens ?? 0;
|
|
68
|
+
// Accumulate aggregate totals
|
|
69
|
+
accumulated.inputTokens += inputTokens;
|
|
70
|
+
accumulated.outputTokens += outputTokens;
|
|
71
|
+
accumulated.cacheReadInputTokens += cacheReadTokens;
|
|
72
|
+
accumulated.cacheCreationInputTokens += cacheCreateTokens;
|
|
73
|
+
// Accumulate per-model usage
|
|
74
|
+
if (model) {
|
|
75
|
+
const existing = accumulated.modelUsage[model];
|
|
76
|
+
if (existing) {
|
|
77
|
+
existing.inputTokens += inputTokens;
|
|
78
|
+
existing.outputTokens += outputTokens;
|
|
79
|
+
existing.cacheReadInputTokens += cacheReadTokens;
|
|
80
|
+
existing.cacheCreationInputTokens += cacheCreateTokens;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
accumulated.modelUsage[model] = {
|
|
84
|
+
inputTokens,
|
|
85
|
+
outputTokens,
|
|
86
|
+
cacheReadInputTokens: cacheReadTokens,
|
|
87
|
+
cacheCreationInputTokens: cacheCreateTokens,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Skip malformed lines
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
usage: accumulated,
|
|
99
|
+
success: true,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
return {
|
|
104
|
+
usage: emptyUsage,
|
|
105
|
+
success: false,
|
|
106
|
+
error: `Failed to parse session file: ${error}`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Parse a Claude session by session ID and working directory.
|
|
112
|
+
* Convenience wrapper around getSessionFilePath + parseSessionFile.
|
|
113
|
+
*
|
|
114
|
+
* @param sessionId - The UUID session ID passed to --session-id
|
|
115
|
+
* @param cwd - The working directory where Claude was run
|
|
116
|
+
* @returns Parsed usage data or error information
|
|
117
|
+
*/
|
|
118
|
+
export function parseSessionById(sessionId, cwd) {
|
|
119
|
+
const filePath = getSessionFilePath(sessionId, cwd);
|
|
120
|
+
return parseSessionFile(filePath);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=session-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-parser.js","sourceRoot":"","sources":["../../src/utils/session-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,15 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { UsageData } from '../types/config.js';
|
|
6
6
|
import type { CostBreakdown, TaskUsageEntry } from './token-tracker.js';
|
|
7
|
+
/** Options for token summary formatting. */
|
|
8
|
+
export interface TokenSummaryOptions {
|
|
9
|
+
/** Whether to show cache token counts. Default: true */
|
|
10
|
+
showCacheTokens?: boolean;
|
|
11
|
+
/** Whether to show rate limit percentage. Default: true */
|
|
12
|
+
showRateLimitEstimate?: boolean;
|
|
13
|
+
/** Rate limit percentage to display (requires showRateLimitEstimate: true) */
|
|
14
|
+
rateLimitPercentage?: number;
|
|
15
|
+
}
|
|
7
16
|
/**
|
|
8
17
|
* Visual symbols for terminal output using dots/symbols style.
|
|
9
18
|
*/
|
|
@@ -59,18 +68,28 @@ export declare function formatNumber(n: number): string;
|
|
|
59
68
|
* Uses 2 decimals for values >= $0.01, 4 decimals for smaller values.
|
|
60
69
|
*/
|
|
61
70
|
export declare function formatCost(cost: number): string;
|
|
71
|
+
/**
|
|
72
|
+
* Formats a rate limit percentage for display.
|
|
73
|
+
* Uses tilde (~) prefix to indicate estimate.
|
|
74
|
+
*/
|
|
75
|
+
export declare function formatRateLimitPercentage(percentage: number): string;
|
|
62
76
|
/**
|
|
63
77
|
* Formats a per-task token usage summary.
|
|
64
|
-
* For single-attempt tasks: " Tokens: 5,234 in / 1,023 out | Cache: 18,500 read | Est. cost: $0.42"
|
|
78
|
+
* For single-attempt tasks: " Tokens: 5,234 in / 1,023 out | Cache: 18,500 read | Est. cost: $0.42 | ~2% of 5h window"
|
|
65
79
|
* For multi-attempt tasks: shows per-attempt breakdown plus total.
|
|
66
80
|
*
|
|
67
81
|
* @param entry - The TaskUsageEntry containing accumulated usage, cost, and attempts array
|
|
68
82
|
* @param calculateAttemptCost - Optional function to calculate cost for a single attempt's UsageData
|
|
83
|
+
* @param options - Display options for showing cache tokens and rate limit percentage
|
|
69
84
|
*/
|
|
70
|
-
export declare function formatTaskTokenSummary(entry: TaskUsageEntry, calculateAttemptCost?: (usage: UsageData) => CostBreakdown): string;
|
|
85
|
+
export declare function formatTaskTokenSummary(entry: TaskUsageEntry, calculateAttemptCost?: (usage: UsageData) => CostBreakdown, options?: TokenSummaryOptions): string;
|
|
71
86
|
/**
|
|
72
87
|
* Formats the grand total token usage summary block.
|
|
73
88
|
* Displayed after all tasks complete.
|
|
89
|
+
*
|
|
90
|
+
* @param usage - Total usage data
|
|
91
|
+
* @param cost - Total cost breakdown
|
|
92
|
+
* @param options - Display options for cache tokens and rate limit
|
|
74
93
|
*/
|
|
75
|
-
export declare function formatTokenTotalSummary(usage: UsageData, cost: CostBreakdown): string;
|
|
94
|
+
export declare function formatTokenTotalSummary(usage: UsageData, cost: CostBreakdown, options?: TokenSummaryOptions): string;
|
|
76
95
|
//# sourceMappingURL=terminal-symbols.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-symbols.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAYpF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAYR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAI3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,MAAU,GAClB,MAAM,CAwBR;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAM7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;
|
|
1
|
+
{"version":3,"file":"terminal-symbols.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAExE,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2DAA2D;IAC3D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,8EAA8E;IAC9E,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAYpF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAYR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAI3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,MAAU,GAClB,MAAM,CAwBR;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAM7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAKpE;AAwCD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EACrB,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,aAAa,EAC1D,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAuBR;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAyBR"}
|
|
@@ -113,63 +113,94 @@ export function formatCost(cost) {
|
|
|
113
113
|
return `$${cost.toFixed(4)}`;
|
|
114
114
|
return `$${cost.toFixed(2)}`;
|
|
115
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Formats a rate limit percentage for display.
|
|
118
|
+
* Uses tilde (~) prefix to indicate estimate.
|
|
119
|
+
*/
|
|
120
|
+
export function formatRateLimitPercentage(percentage) {
|
|
121
|
+
if (percentage === 0)
|
|
122
|
+
return '~0% of 5h window';
|
|
123
|
+
if (percentage < 0.1)
|
|
124
|
+
return `~${percentage.toFixed(2)}% of 5h window`;
|
|
125
|
+
if (percentage < 1)
|
|
126
|
+
return `~${percentage.toFixed(1)}% of 5h window`;
|
|
127
|
+
return `~${Math.round(percentage)}% of 5h window`;
|
|
128
|
+
}
|
|
116
129
|
/**
|
|
117
130
|
* Formats a single line of token usage (for a single attempt or total).
|
|
118
131
|
* Used internally by formatTaskTokenSummary.
|
|
119
132
|
*/
|
|
120
|
-
function formatTokenLine(usage, costValue, prefix = '', indent = ' ') {
|
|
133
|
+
function formatTokenLine(usage, costValue, prefix = '', indent = ' ', options = {}) {
|
|
134
|
+
const { showCacheTokens = true, showRateLimitEstimate = false, rateLimitPercentage } = options;
|
|
121
135
|
const parts = [];
|
|
122
136
|
const tokenPart = `${formatNumber(usage.inputTokens)} in / ${formatNumber(usage.outputTokens)} out`;
|
|
123
137
|
parts.push(prefix ? `${prefix}: ${tokenPart}` : `Tokens: ${tokenPart}`);
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
138
|
+
if (showCacheTokens) {
|
|
139
|
+
const cacheTotal = usage.cacheReadInputTokens + usage.cacheCreationInputTokens;
|
|
140
|
+
if (cacheTotal > 0) {
|
|
141
|
+
if (usage.cacheReadInputTokens > 0 && usage.cacheCreationInputTokens > 0) {
|
|
142
|
+
parts.push(`Cache: ${formatNumber(usage.cacheReadInputTokens)} read / ${formatNumber(usage.cacheCreationInputTokens)} created`);
|
|
143
|
+
}
|
|
144
|
+
else if (usage.cacheReadInputTokens > 0) {
|
|
145
|
+
parts.push(`Cache: ${formatNumber(usage.cacheReadInputTokens)} read`);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
parts.push(`Cache: ${formatNumber(usage.cacheCreationInputTokens)} created`);
|
|
149
|
+
}
|
|
134
150
|
}
|
|
135
151
|
}
|
|
136
152
|
parts.push(`Est. cost: ${formatCost(costValue)}`);
|
|
153
|
+
if (showRateLimitEstimate && rateLimitPercentage !== undefined) {
|
|
154
|
+
parts.push(formatRateLimitPercentage(rateLimitPercentage));
|
|
155
|
+
}
|
|
137
156
|
return `${indent}${parts.join(' | ')}`;
|
|
138
157
|
}
|
|
139
158
|
/**
|
|
140
159
|
* Formats a per-task token usage summary.
|
|
141
|
-
* For single-attempt tasks: " Tokens: 5,234 in / 1,023 out | Cache: 18,500 read | Est. cost: $0.42"
|
|
160
|
+
* For single-attempt tasks: " Tokens: 5,234 in / 1,023 out | Cache: 18,500 read | Est. cost: $0.42 | ~2% of 5h window"
|
|
142
161
|
* For multi-attempt tasks: shows per-attempt breakdown plus total.
|
|
143
162
|
*
|
|
144
163
|
* @param entry - The TaskUsageEntry containing accumulated usage, cost, and attempts array
|
|
145
164
|
* @param calculateAttemptCost - Optional function to calculate cost for a single attempt's UsageData
|
|
165
|
+
* @param options - Display options for showing cache tokens and rate limit percentage
|
|
146
166
|
*/
|
|
147
|
-
export function formatTaskTokenSummary(entry, calculateAttemptCost) {
|
|
167
|
+
export function formatTaskTokenSummary(entry, calculateAttemptCost, options = {}) {
|
|
148
168
|
// Single-attempt: render exactly as before (no per-attempt breakdown)
|
|
149
169
|
if (entry.attempts.length <= 1) {
|
|
150
|
-
return formatTokenLine(entry.usage, entry.cost.totalCost);
|
|
170
|
+
return formatTokenLine(entry.usage, entry.cost.totalCost, '', ' ', options);
|
|
151
171
|
}
|
|
152
172
|
// Multi-attempt: show per-attempt lines plus total
|
|
173
|
+
// Per-attempt lines don't show rate limit (only show on total)
|
|
174
|
+
const perAttemptOptions = {
|
|
175
|
+
...options,
|
|
176
|
+
showRateLimitEstimate: false,
|
|
177
|
+
rateLimitPercentage: undefined,
|
|
178
|
+
};
|
|
153
179
|
const lines = [];
|
|
154
180
|
entry.attempts.forEach((attemptUsage, i) => {
|
|
155
181
|
const attemptCost = calculateAttemptCost
|
|
156
182
|
? calculateAttemptCost(attemptUsage).totalCost
|
|
157
183
|
: 0;
|
|
158
|
-
lines.push(formatTokenLine(attemptUsage, attemptCost, `Attempt ${i + 1}`, ' '));
|
|
184
|
+
lines.push(formatTokenLine(attemptUsage, attemptCost, `Attempt ${i + 1}`, ' ', perAttemptOptions));
|
|
159
185
|
});
|
|
160
|
-
lines.push(formatTokenLine(entry.usage, entry.cost.totalCost, 'Total', ' '));
|
|
186
|
+
lines.push(formatTokenLine(entry.usage, entry.cost.totalCost, 'Total', ' ', options));
|
|
161
187
|
return lines.join('\n');
|
|
162
188
|
}
|
|
163
189
|
/**
|
|
164
190
|
* Formats the grand total token usage summary block.
|
|
165
191
|
* Displayed after all tasks complete.
|
|
192
|
+
*
|
|
193
|
+
* @param usage - Total usage data
|
|
194
|
+
* @param cost - Total cost breakdown
|
|
195
|
+
* @param options - Display options for cache tokens and rate limit
|
|
166
196
|
*/
|
|
167
|
-
export function formatTokenTotalSummary(usage, cost) {
|
|
197
|
+
export function formatTokenTotalSummary(usage, cost, options = {}) {
|
|
198
|
+
const { showCacheTokens = true, showRateLimitEstimate = false, rateLimitPercentage } = options;
|
|
168
199
|
const lines = [];
|
|
169
200
|
const divider = '── Token Usage Summary ──────────────────';
|
|
170
201
|
lines.push(divider);
|
|
171
202
|
lines.push(`Total tokens: ${formatNumber(usage.inputTokens)} in / ${formatNumber(usage.outputTokens)} out`);
|
|
172
|
-
if (usage.cacheReadInputTokens > 0 || usage.cacheCreationInputTokens > 0) {
|
|
203
|
+
if (showCacheTokens && (usage.cacheReadInputTokens > 0 || usage.cacheCreationInputTokens > 0)) {
|
|
173
204
|
const cacheParts = [];
|
|
174
205
|
if (usage.cacheReadInputTokens > 0) {
|
|
175
206
|
cacheParts.push(`${formatNumber(usage.cacheReadInputTokens)} read`);
|
|
@@ -180,6 +211,9 @@ export function formatTokenTotalSummary(usage, cost) {
|
|
|
180
211
|
lines.push(`Cache: ${cacheParts.join(' / ')}`);
|
|
181
212
|
}
|
|
182
213
|
lines.push(`Estimated cost: ${formatCost(cost.totalCost)}`);
|
|
214
|
+
if (showRateLimitEstimate && rateLimitPercentage !== undefined) {
|
|
215
|
+
lines.push(formatRateLimitPercentage(rateLimitPercentage));
|
|
216
|
+
}
|
|
183
217
|
lines.push('─────────────────────────────────────────');
|
|
184
218
|
return lines.join('\n');
|
|
185
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-symbols.js","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-symbols.js","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,10 @@ export interface TaskUsageEntry {
|
|
|
17
17
|
/** Raw per-attempt usage data (for display breakdowns). */
|
|
18
18
|
attempts: UsageData[];
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Sum multiple CostBreakdown objects into a single total.
|
|
22
|
+
*/
|
|
23
|
+
export declare function sumCostBreakdowns(costs: CostBreakdown[]): CostBreakdown;
|
|
20
24
|
/**
|
|
21
25
|
* Merge multiple UsageData objects into a single accumulated UsageData.
|
|
22
26
|
* Sums all token fields and merges modelUsage maps.
|
|
@@ -33,6 +37,8 @@ export declare class TokenTracker {
|
|
|
33
37
|
/**
|
|
34
38
|
* Record usage data from a completed task.
|
|
35
39
|
* Accepts an array of UsageData (one per attempt) and accumulates them.
|
|
40
|
+
* Cost is calculated per-attempt to avoid underreporting when some attempts
|
|
41
|
+
* have modelUsage and others only have aggregate fields.
|
|
36
42
|
*/
|
|
37
43
|
addTask(taskId: string, attempts: UsageData[]): TaskUsageEntry;
|
|
38
44
|
/**
|
|
@@ -51,5 +57,19 @@ export declare class TokenTracker {
|
|
|
51
57
|
* Uses per-model breakdown when available, falls back to aggregate with sonnet pricing.
|
|
52
58
|
*/
|
|
53
59
|
calculateCost(usage: UsageData): CostBreakdown;
|
|
60
|
+
/**
|
|
61
|
+
* Calculate the 5h rate limit window percentage for a given cost.
|
|
62
|
+
* Converts cost to Sonnet-equivalent tokens using the configured Sonnet pricing,
|
|
63
|
+
* then divides by the configured cap.
|
|
64
|
+
*
|
|
65
|
+
* @param totalCost - The total cost in dollars
|
|
66
|
+
* @param sonnetTokenCap - Optional override for the Sonnet-equivalent token cap (defaults to config value)
|
|
67
|
+
* @returns The percentage of the 5h window consumed (0-100+)
|
|
68
|
+
*/
|
|
69
|
+
calculateRateLimitPercentage(totalCost: number, sonnetTokenCap?: number): number;
|
|
70
|
+
/**
|
|
71
|
+
* Get the cumulative 5h window percentage across all recorded tasks.
|
|
72
|
+
*/
|
|
73
|
+
getCumulativeRateLimitPercentage(sonnetTokenCap?: number): number;
|
|
54
74
|
}
|
|
55
75
|
//# sourceMappingURL=token-tracker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/token-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG9D,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,EAAE,SAAS,CAAC;IACjB,4CAA4C;IAC5C,IAAI,EAAE,aAAa,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,CA8BhE;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,CAAC,EAAE,aAAa;IAIzC
|
|
1
|
+
{"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/token-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG9D,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,KAAK,EAAE,SAAS,CAAC;IACjB,4CAA4C;IAC5C,IAAI,EAAE,aAAa,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,EAAE,SAAS,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,aAAa,CAkBvE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,CA8BhE;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,CAAC,EAAE,aAAa;IAIzC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,cAAc;IAW9D;;OAEG;IACH,UAAU,IAAI,SAAS,cAAc,EAAE;IAIvC;;OAEG;IACH,SAAS,IAAI;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,aAAa,CAAA;KAAE;IA6CtD;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa;IAmC9C;;;;;;;;OAQG;IACH,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM;IAkBhF;;OAEG;IACH,gCAAgC,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM;CAIlE"}
|