cawdex 1.35.74 → 1.35.76
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/README.md +5 -5
- package/bin/anycode.js +2 -2
- package/bin/cawdex.js +408 -408
- package/bin/ecc-hooks.cjs +11 -11
- package/dist/agents-md.d.ts +31 -0
- package/dist/agents-md.js +340 -0
- package/dist/agents-md.js.map +1 -0
- package/dist/agents.js +1424 -1424
- package/dist/api.d.ts +1 -0
- package/dist/api.js +19 -14
- package/dist/api.js.map +1 -1
- package/dist/autonomous-loops.js +287 -287
- package/dist/benchmark-repos.d.ts +31 -0
- package/dist/benchmark-repos.js +234 -8
- package/dist/benchmark-repos.js.map +1 -1
- package/dist/command-palette.js +4 -2
- package/dist/command-palette.js.map +1 -1
- package/dist/compaction.js +8 -8
- package/dist/config.js +51 -36
- package/dist/config.js.map +1 -1
- package/dist/content-engine.js +543 -543
- package/dist/context-brief.d.ts +4 -0
- package/dist/context-brief.js +230 -0
- package/dist/context-brief.js.map +1 -0
- package/dist/cost-tracker.d.ts +33 -14
- package/dist/cost-tracker.js +81 -19
- package/dist/cost-tracker.js.map +1 -1
- package/dist/coverage.js +39 -39
- package/dist/docs-sync.js +98 -98
- package/dist/evaluation.js +452 -452
- package/dist/fixed-footer.d.ts +7 -1
- package/dist/fixed-footer.js +92 -18
- package/dist/fixed-footer.js.map +1 -1
- package/dist/git-workflow.js +49 -49
- package/dist/index.d.ts +2 -0
- package/dist/index.js +197 -65
- package/dist/index.js.map +1 -1
- package/dist/instant-artifact.d.ts +6 -0
- package/dist/instant-artifact.js +397 -0
- package/dist/instant-artifact.js.map +1 -0
- package/dist/live-queue.js +1 -1
- package/dist/live-queue.js.map +1 -1
- package/dist/model-aliases.d.ts +37 -0
- package/dist/model-aliases.js +203 -0
- package/dist/model-aliases.js.map +1 -0
- package/dist/orchestration.js +15 -15
- package/dist/permissions.d.ts +6 -0
- package/dist/permissions.js +53 -0
- package/dist/permissions.js.map +1 -1
- package/dist/pm2-manager.js +26 -26
- package/dist/query.d.ts +0 -1
- package/dist/query.js +74 -39
- package/dist/query.js.map +1 -1
- package/dist/refactor.js +87 -87
- package/dist/repo-command.js +7 -1
- package/dist/repo-command.js.map +1 -1
- package/dist/search-first.js +92 -92
- package/dist/skill-create.js +100 -100
- package/dist/stitch.js +1 -1
- package/dist/system-prompt.d.ts +2 -1
- package/dist/system-prompt.js +10 -5
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/github-repo-digest.d.ts +1 -1
- package/dist/tools/github-repo-digest.js +38 -6
- package/dist/tools/github-repo-digest.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.js.map +1 -1
- package/dist/verification.js +55 -55
- package/package.json +1 -1
- package/resources/__init__.py +1 -1
- package/resources/exgentic/cawdex_agent/README.md +114 -114
- package/resources/exgentic/cawdex_agent/__init__.py +5 -5
- package/resources/exgentic/cawdex_agent/agent.py +605 -605
- package/resources/exgentic/cawdex_agent/requirements.txt +2 -2
- package/resources/exgentic/cawdex_agent/setup.sh +21 -21
- package/resources/exgentic/cawdex_agent/utils.py +1061 -1061
- package/resources/hal/cawdex_agent/README.md +24 -24
- package/resources/hal/cawdex_agent/__init__.py +1 -1
- package/resources/hal/cawdex_agent/main.py +550 -550
- package/resources/hal/cawdex_agent/requirements.txt +2 -2
- package/resources/kbench/cawdex_agent/README.md +107 -107
- package/resources/kbench/cawdex_agent/adapter.manifest.json +19 -19
- package/resources/kbench/cawdex_agent/runner.mjs +753 -753
- package/resources/open_agent_leaderboard/cawdex-agent-card.md +119 -119
- package/resources/terminal_bench/__init__.py +1 -1
- package/resources/terminal_bench/cawdex_agent.py +174 -174
- package/resources/terminal_bench/setup.sh +121 -121
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
3
|
+
import { basename, join, relative, resolve } from 'node:path';
|
|
4
|
+
import { globSync } from 'glob';
|
|
5
|
+
const IGNORE_GLOBS = [
|
|
6
|
+
'**/.git/**',
|
|
7
|
+
'**/node_modules/**',
|
|
8
|
+
'**/.venv/**',
|
|
9
|
+
'**/venv/**',
|
|
10
|
+
'**/__pycache__/**',
|
|
11
|
+
'**/.pytest_cache/**',
|
|
12
|
+
'**/dist/**',
|
|
13
|
+
'**/build/**',
|
|
14
|
+
'**/coverage/**',
|
|
15
|
+
'**/target/**',
|
|
16
|
+
'**/.next/**',
|
|
17
|
+
'**/out/**',
|
|
18
|
+
];
|
|
19
|
+
const MANIFEST_NAMES = new Set([
|
|
20
|
+
'package.json',
|
|
21
|
+
'package-lock.json',
|
|
22
|
+
'pnpm-lock.yaml',
|
|
23
|
+
'yarn.lock',
|
|
24
|
+
'bun.lock',
|
|
25
|
+
'bun.lockb',
|
|
26
|
+
'pyproject.toml',
|
|
27
|
+
'uv.lock',
|
|
28
|
+
'requirements.txt',
|
|
29
|
+
'Pipfile',
|
|
30
|
+
'Pipfile.lock',
|
|
31
|
+
'Cargo.toml',
|
|
32
|
+
'Cargo.lock',
|
|
33
|
+
'go.mod',
|
|
34
|
+
'go.sum',
|
|
35
|
+
'Makefile',
|
|
36
|
+
'Dockerfile',
|
|
37
|
+
'docker-compose.yml',
|
|
38
|
+
'docker-compose.yaml',
|
|
39
|
+
'compose.yml',
|
|
40
|
+
'compose.yaml',
|
|
41
|
+
'pom.xml',
|
|
42
|
+
'mvnw',
|
|
43
|
+
'mvnw.cmd',
|
|
44
|
+
'build.gradle',
|
|
45
|
+
'build.gradle.kts',
|
|
46
|
+
'settings.gradle',
|
|
47
|
+
'settings.gradle.kts',
|
|
48
|
+
'gradlew',
|
|
49
|
+
'gradlew.bat',
|
|
50
|
+
'deno.json',
|
|
51
|
+
]);
|
|
52
|
+
export function buildContextBrief(cwd = process.cwd(), options = {}) {
|
|
53
|
+
const root = resolve(cwd);
|
|
54
|
+
if (!existsSync(root))
|
|
55
|
+
return `context brief: path does not exist: ${root}`;
|
|
56
|
+
if (!statSync(root).isDirectory())
|
|
57
|
+
return `context brief: path is not a directory: ${root}`;
|
|
58
|
+
const maxFiles = clamp(options.maxFiles ?? 300, 50, 1000);
|
|
59
|
+
const allFiles = globSync('**/*', {
|
|
60
|
+
cwd: root,
|
|
61
|
+
nodir: true,
|
|
62
|
+
dot: true,
|
|
63
|
+
maxDepth: 4,
|
|
64
|
+
ignore: IGNORE_GLOBS,
|
|
65
|
+
}).map(normalizePath).sort((a, b) => a.localeCompare(b));
|
|
66
|
+
const files = allFiles.slice(0, maxFiles);
|
|
67
|
+
const manifests = files.filter((file) => MANIFEST_NAMES.has(basename(file)));
|
|
68
|
+
const scripts = readPackageScripts(root);
|
|
69
|
+
const verifiers = inferVerifierCommands(manifests, scripts);
|
|
70
|
+
const rootEntries = listRootEntries(root);
|
|
71
|
+
const languages = summarizeExtensions(files);
|
|
72
|
+
return [
|
|
73
|
+
'# Context Brief',
|
|
74
|
+
`Root: ${root}`,
|
|
75
|
+
`Files scanned: ${files.length}${allFiles.length > files.length ? ` of ${allFiles.length}` : ''}`,
|
|
76
|
+
'',
|
|
77
|
+
'## Git',
|
|
78
|
+
gitSummary(root),
|
|
79
|
+
'',
|
|
80
|
+
'## Root Entries',
|
|
81
|
+
formatList(rootEntries, 24),
|
|
82
|
+
'',
|
|
83
|
+
'## Manifests',
|
|
84
|
+
formatList(manifests, 30),
|
|
85
|
+
'',
|
|
86
|
+
'## Language Footprint',
|
|
87
|
+
formatList(languages, 16),
|
|
88
|
+
'',
|
|
89
|
+
'## Package Scripts',
|
|
90
|
+
formatList(scripts.map((script) => `${script.name}: ${script.command}`), 24),
|
|
91
|
+
'',
|
|
92
|
+
'## Likely Verification Commands',
|
|
93
|
+
formatList(verifiers, 12),
|
|
94
|
+
'',
|
|
95
|
+
'## Suggested First Moves',
|
|
96
|
+
'1. Read the relevant manifest and task/instruction file before editing.',
|
|
97
|
+
'2. Run the narrowest likely verifier before a broad test/build command when feasible.',
|
|
98
|
+
'3. Treat dirty git entries as user work unless this task explicitly owns them.',
|
|
99
|
+
].join('\n');
|
|
100
|
+
}
|
|
101
|
+
function listRootEntries(root) {
|
|
102
|
+
try {
|
|
103
|
+
return readdirSync(root, { withFileTypes: true })
|
|
104
|
+
.filter((entry) => !['.git', 'node_modules', 'dist', 'build', 'coverage'].includes(entry.name))
|
|
105
|
+
.sort((a, b) => a.name.localeCompare(b.name))
|
|
106
|
+
.slice(0, 40)
|
|
107
|
+
.map((entry) => entry.isDirectory() ? `${entry.name}/` : entry.name);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function readPackageScripts(root) {
|
|
114
|
+
const path = join(root, 'package.json');
|
|
115
|
+
if (!existsSync(path))
|
|
116
|
+
return [];
|
|
117
|
+
try {
|
|
118
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
119
|
+
return Object.entries(parsed.scripts ?? {})
|
|
120
|
+
.filter((entry) => typeof entry[1] === 'string')
|
|
121
|
+
.map(([name, command]) => ({ name, command }))
|
|
122
|
+
.slice(0, 30);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function inferVerifierCommands(manifests, scripts) {
|
|
129
|
+
const names = new Set(manifests.map((file) => basename(file)));
|
|
130
|
+
const commands = [];
|
|
131
|
+
const add = (command) => {
|
|
132
|
+
if (!commands.includes(command))
|
|
133
|
+
commands.push(command);
|
|
134
|
+
};
|
|
135
|
+
const scriptNames = new Set(scripts.map((script) => script.name));
|
|
136
|
+
const packageManager = detectPackageManager(names);
|
|
137
|
+
if (names.has('package.json')) {
|
|
138
|
+
for (const name of ['test', 'typecheck', 'lint', 'build']) {
|
|
139
|
+
if (scriptNames.has(name))
|
|
140
|
+
add(`${packageManager} run ${name}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (names.has('pyproject.toml') || names.has('pytest.ini') || Array.from(names).some((name) => /^requirements/.test(name))) {
|
|
144
|
+
add(names.has('uv.lock') ? 'uv run pytest' : 'python -m pytest');
|
|
145
|
+
}
|
|
146
|
+
if (names.has('Cargo.toml'))
|
|
147
|
+
add('cargo test');
|
|
148
|
+
if (names.has('go.mod'))
|
|
149
|
+
add('go test ./...');
|
|
150
|
+
if (names.has('pom.xml'))
|
|
151
|
+
add(names.has('mvnw') ? './mvnw test' : 'mvn test');
|
|
152
|
+
if (Array.from(names).some((name) => /^build\.gradle/.test(name))) {
|
|
153
|
+
add(names.has('gradlew') ? './gradlew test' : 'gradle test');
|
|
154
|
+
}
|
|
155
|
+
return commands;
|
|
156
|
+
}
|
|
157
|
+
function detectPackageManager(names) {
|
|
158
|
+
if (names.has('pnpm-lock.yaml'))
|
|
159
|
+
return 'pnpm';
|
|
160
|
+
if (names.has('yarn.lock'))
|
|
161
|
+
return 'yarn';
|
|
162
|
+
if (names.has('bun.lock') || names.has('bun.lockb'))
|
|
163
|
+
return 'bun';
|
|
164
|
+
return 'npm';
|
|
165
|
+
}
|
|
166
|
+
function summarizeExtensions(files) {
|
|
167
|
+
const counts = new Map();
|
|
168
|
+
for (const file of files) {
|
|
169
|
+
const base = basename(file);
|
|
170
|
+
const idx = base.lastIndexOf('.');
|
|
171
|
+
const ext = idx > 0 ? base.slice(idx).toLowerCase() : '(no ext)';
|
|
172
|
+
counts.set(ext, (counts.get(ext) ?? 0) + 1);
|
|
173
|
+
}
|
|
174
|
+
return Array.from(counts.entries())
|
|
175
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
176
|
+
.slice(0, 16)
|
|
177
|
+
.map(([ext, count]) => `${ext}: ${count}`);
|
|
178
|
+
}
|
|
179
|
+
function gitSummary(root) {
|
|
180
|
+
try {
|
|
181
|
+
const inside = execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {
|
|
182
|
+
cwd: root,
|
|
183
|
+
encoding: 'utf-8',
|
|
184
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
185
|
+
timeout: 3000,
|
|
186
|
+
}).trim();
|
|
187
|
+
if (inside !== 'true')
|
|
188
|
+
return 'Not a git worktree.';
|
|
189
|
+
const branch = execFileSync('git', ['branch', '--show-current'], {
|
|
190
|
+
cwd: root,
|
|
191
|
+
encoding: 'utf-8',
|
|
192
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
193
|
+
timeout: 3000,
|
|
194
|
+
}).trim() || '(detached)';
|
|
195
|
+
const top = execFileSync('git', ['rev-parse', '--show-toplevel'], {
|
|
196
|
+
cwd: root,
|
|
197
|
+
encoding: 'utf-8',
|
|
198
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
199
|
+
timeout: 3000,
|
|
200
|
+
}).trim();
|
|
201
|
+
const status = execFileSync('git', ['status', '--short'], {
|
|
202
|
+
cwd: root,
|
|
203
|
+
encoding: 'utf-8',
|
|
204
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
205
|
+
timeout: 3000,
|
|
206
|
+
maxBuffer: 128 * 1024,
|
|
207
|
+
}).trim();
|
|
208
|
+
const count = status ? status.split(/\r?\n/).length : 0;
|
|
209
|
+
const location = relative(root, top) || '.';
|
|
210
|
+
return `branch: ${branch}\nworktree: ${location}\ndirty entries: ${count}`;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return 'Git state unavailable.';
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function formatList(items, limit) {
|
|
217
|
+
if (items.length === 0)
|
|
218
|
+
return '(none found)';
|
|
219
|
+
const shown = items.slice(0, limit).map((item) => `- ${item}`);
|
|
220
|
+
if (items.length > limit)
|
|
221
|
+
shown.push(`- ... ${items.length - limit} more`);
|
|
222
|
+
return shown.join('\n');
|
|
223
|
+
}
|
|
224
|
+
function normalizePath(value) {
|
|
225
|
+
return value.replace(/\\/g, '/');
|
|
226
|
+
}
|
|
227
|
+
function clamp(value, min, max) {
|
|
228
|
+
return Math.max(min, Math.min(max, Math.floor(value)));
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=context-brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-brief.js","sourceRoot":"","sources":["../src/context-brief.ts"],"names":[],"mappings":"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"}
|
package/dist/cost-tracker.d.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
declare function getUsageFile(): string;
|
|
1
2
|
export interface UsageEntry {
|
|
2
3
|
timestamp: string;
|
|
3
4
|
sessionId: string;
|
|
5
|
+
provider?: string;
|
|
4
6
|
model: string;
|
|
5
7
|
promptTokens: number;
|
|
6
8
|
completionTokens: number;
|
|
7
9
|
totalTokens: number;
|
|
8
10
|
estimatedCost: number;
|
|
11
|
+
firstTokenMs?: number;
|
|
12
|
+
durationMs?: number;
|
|
9
13
|
}
|
|
10
14
|
export interface UsageData {
|
|
11
15
|
entries: UsageEntry[];
|
|
@@ -24,26 +28,41 @@ export declare function getModelCost(model: string): {
|
|
|
24
28
|
output: number;
|
|
25
29
|
};
|
|
26
30
|
export declare function estimateCost(model: string, promptTokens: number, completionTokens: number): number;
|
|
27
|
-
export declare function trackUsage(sessionId: string, model: string, promptTokens: number, completionTokens: number
|
|
31
|
+
export declare function trackUsage(sessionId: string, model: string, promptTokens: number, completionTokens: number, metadata?: {
|
|
32
|
+
provider?: string;
|
|
33
|
+
firstTokenMs?: number | null;
|
|
34
|
+
durationMs?: number | null;
|
|
35
|
+
}): {
|
|
28
36
|
cost: number;
|
|
29
37
|
warning?: string;
|
|
38
|
+
entry: UsageEntry;
|
|
30
39
|
};
|
|
31
|
-
export
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
export interface UsagePeriodSummary {
|
|
41
|
+
tokens: number;
|
|
42
|
+
promptTokens: number;
|
|
43
|
+
completionTokens: number;
|
|
44
|
+
cost: number;
|
|
45
|
+
calls: number;
|
|
46
|
+
averageFirstTokenMs: number | null;
|
|
47
|
+
averageDurationMs: number | null;
|
|
48
|
+
}
|
|
49
|
+
export interface UsageSummary {
|
|
50
|
+
today: UsagePeriodSummary;
|
|
51
|
+
month: UsagePeriodSummary;
|
|
42
52
|
allTime: {
|
|
43
53
|
tokens: number;
|
|
44
54
|
cost: number;
|
|
45
55
|
};
|
|
56
|
+
session: UsagePeriodSummary;
|
|
57
|
+
last: UsageEntry | null;
|
|
46
58
|
budget: UsageData['budget'];
|
|
47
|
-
}
|
|
59
|
+
}
|
|
60
|
+
export declare function getUsageSummary(sessionId?: string): UsageSummary;
|
|
48
61
|
export declare function setBudget(daily: number, monthly: number, threshold?: number): void;
|
|
49
|
-
export declare function printUsageSummary(): void;
|
|
62
|
+
export declare function printUsageSummary(sessionId?: string): void;
|
|
63
|
+
declare function summarizeEntries(entries: UsageEntry[]): UsagePeriodSummary;
|
|
64
|
+
export declare const _internal: {
|
|
65
|
+
getUsageFile: typeof getUsageFile;
|
|
66
|
+
summarizeEntries: typeof summarizeEntries;
|
|
67
|
+
};
|
|
68
|
+
export {};
|
package/dist/cost-tracker.js
CHANGED
|
@@ -7,7 +7,9 @@ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import { getConfigDir } from './config.js';
|
|
10
|
-
|
|
10
|
+
function getUsageFile() {
|
|
11
|
+
return join(getConfigDir(), 'usage.json');
|
|
12
|
+
}
|
|
11
13
|
// Cost per 1M tokens (input/output) for common models via OpenRouter
|
|
12
14
|
const MODEL_COSTS = {
|
|
13
15
|
// OpenRouter free tier/router
|
|
@@ -34,7 +36,8 @@ const MODEL_COSTS = {
|
|
|
34
36
|
_default: { input: 1.0, output: 3.0 },
|
|
35
37
|
};
|
|
36
38
|
function loadUsage() {
|
|
37
|
-
|
|
39
|
+
const usageFile = getUsageFile();
|
|
40
|
+
if (!existsSync(usageFile)) {
|
|
38
41
|
return {
|
|
39
42
|
entries: [],
|
|
40
43
|
budget: { dailyLimit: 0, monthlyLimit: 0, alertThreshold: 0.8 },
|
|
@@ -42,7 +45,7 @@ function loadUsage() {
|
|
|
42
45
|
};
|
|
43
46
|
}
|
|
44
47
|
try {
|
|
45
|
-
return JSON.parse(readFileSync(
|
|
48
|
+
return JSON.parse(readFileSync(usageFile, 'utf-8'));
|
|
46
49
|
}
|
|
47
50
|
catch {
|
|
48
51
|
return {
|
|
@@ -54,7 +57,7 @@ function loadUsage() {
|
|
|
54
57
|
}
|
|
55
58
|
function saveUsage(data) {
|
|
56
59
|
mkdirSync(getConfigDir(), { recursive: true });
|
|
57
|
-
writeFileSync(
|
|
60
|
+
writeFileSync(getUsageFile(), JSON.stringify(data, null, 2), 'utf-8');
|
|
58
61
|
}
|
|
59
62
|
export function getModelCost(model) {
|
|
60
63
|
if (model === 'openrouter/free' || model.endsWith(':free'))
|
|
@@ -72,17 +75,20 @@ export function estimateCost(model, promptTokens, completionTokens) {
|
|
|
72
75
|
const costs = getModelCost(model);
|
|
73
76
|
return (promptTokens * costs.input + completionTokens * costs.output) / 1_000_000;
|
|
74
77
|
}
|
|
75
|
-
export function trackUsage(sessionId, model, promptTokens, completionTokens) {
|
|
78
|
+
export function trackUsage(sessionId, model, promptTokens, completionTokens, metadata = {}) {
|
|
76
79
|
const data = loadUsage();
|
|
77
80
|
const cost = estimateCost(model, promptTokens, completionTokens);
|
|
78
81
|
const entry = {
|
|
79
82
|
timestamp: new Date().toISOString(),
|
|
80
83
|
sessionId,
|
|
84
|
+
provider: metadata.provider,
|
|
81
85
|
model,
|
|
82
86
|
promptTokens,
|
|
83
87
|
completionTokens,
|
|
84
88
|
totalTokens: promptTokens + completionTokens,
|
|
85
89
|
estimatedCost: cost,
|
|
90
|
+
firstTokenMs: finiteOptional(metadata.firstTokenMs),
|
|
91
|
+
durationMs: finiteOptional(metadata.durationMs),
|
|
86
92
|
};
|
|
87
93
|
data.entries.push(entry);
|
|
88
94
|
data.totals.allTimeTokens += entry.totalTokens;
|
|
@@ -112,26 +118,24 @@ export function trackUsage(sessionId, model, promptTokens, completionTokens) {
|
|
|
112
118
|
todayCost >= data.budget.dailyLimit * data.budget.alertThreshold) {
|
|
113
119
|
warning = `Approaching daily limit: $${todayCost.toFixed(4)} / $${data.budget.dailyLimit}`;
|
|
114
120
|
}
|
|
115
|
-
return { cost, warning };
|
|
121
|
+
return { cost, warning, entry };
|
|
116
122
|
}
|
|
117
|
-
export function getUsageSummary() {
|
|
123
|
+
export function getUsageSummary(sessionId) {
|
|
118
124
|
const data = loadUsage();
|
|
119
125
|
const today = new Date().toISOString().slice(0, 10);
|
|
120
126
|
const month = new Date().toISOString().slice(0, 7);
|
|
121
127
|
const todayEntries = data.entries.filter((e) => e.timestamp.startsWith(today));
|
|
122
128
|
const monthEntries = data.entries.filter((e) => e.timestamp.startsWith(month));
|
|
129
|
+
const sessionEntries = sessionId
|
|
130
|
+
? data.entries.filter((e) => e.sessionId === sessionId)
|
|
131
|
+
: [];
|
|
132
|
+
const last = sessionEntries.at(-1) ?? data.entries.at(-1) ?? null;
|
|
123
133
|
return {
|
|
124
|
-
today:
|
|
125
|
-
|
|
126
|
-
cost: todayEntries.reduce((s, e) => s + e.estimatedCost, 0),
|
|
127
|
-
calls: todayEntries.length,
|
|
128
|
-
},
|
|
129
|
-
month: {
|
|
130
|
-
tokens: monthEntries.reduce((s, e) => s + e.totalTokens, 0),
|
|
131
|
-
cost: monthEntries.reduce((s, e) => s + e.estimatedCost, 0),
|
|
132
|
-
calls: monthEntries.length,
|
|
133
|
-
},
|
|
134
|
+
today: summarizeEntries(todayEntries),
|
|
135
|
+
month: summarizeEntries(monthEntries),
|
|
134
136
|
allTime: { tokens: data.totals.allTimeTokens, cost: data.totals.allTimeCost },
|
|
137
|
+
session: summarizeEntries(sessionEntries),
|
|
138
|
+
last,
|
|
135
139
|
budget: data.budget,
|
|
136
140
|
};
|
|
137
141
|
}
|
|
@@ -140,15 +144,73 @@ export function setBudget(daily, monthly, threshold = 0.8) {
|
|
|
140
144
|
data.budget = { dailyLimit: daily, monthlyLimit: monthly, alertThreshold: threshold };
|
|
141
145
|
saveUsage(data);
|
|
142
146
|
}
|
|
143
|
-
export function printUsageSummary() {
|
|
144
|
-
const s = getUsageSummary();
|
|
147
|
+
export function printUsageSummary(sessionId) {
|
|
148
|
+
const s = getUsageSummary(sessionId);
|
|
145
149
|
console.log(chalk.cyan('\n Usage Summary'));
|
|
150
|
+
if (sessionId) {
|
|
151
|
+
console.log(chalk.dim(` Session: ${s.session.tokens.toLocaleString()} tokens | $${s.session.cost.toFixed(4)} | ${s.session.calls} calls${formatLatencySummary(s.session)}`));
|
|
152
|
+
}
|
|
146
153
|
console.log(chalk.dim(` Today: ${s.today.tokens.toLocaleString()} tokens | $${s.today.cost.toFixed(4)} | ${s.today.calls} calls`));
|
|
147
154
|
console.log(chalk.dim(` Month: ${s.month.tokens.toLocaleString()} tokens | $${s.month.cost.toFixed(4)} | ${s.month.calls} calls`));
|
|
148
155
|
console.log(chalk.dim(` All-time: ${s.allTime.tokens.toLocaleString()} tokens | $${s.allTime.cost.toFixed(4)}`));
|
|
156
|
+
if (s.last) {
|
|
157
|
+
const provider = s.last.provider ? `${s.last.provider} | ` : '';
|
|
158
|
+
console.log(chalk.dim(` Last: ${provider}${s.last.model} | ${s.last.totalTokens.toLocaleString()} tokens | $${s.last.estimatedCost.toFixed(4)}` +
|
|
159
|
+
`${formatLastLatency(s.last)}`));
|
|
160
|
+
}
|
|
149
161
|
if (s.budget.dailyLimit > 0) {
|
|
150
162
|
console.log(chalk.dim(` Budget: $${s.budget.dailyLimit}/day, $${s.budget.monthlyLimit}/month`));
|
|
151
163
|
}
|
|
152
164
|
console.log();
|
|
153
165
|
}
|
|
166
|
+
function summarizeEntries(entries) {
|
|
167
|
+
const firstTokenValues = entries
|
|
168
|
+
.map((e) => e.firstTokenMs)
|
|
169
|
+
.filter((n) => typeof n === 'number' && Number.isFinite(n));
|
|
170
|
+
const durationValues = entries
|
|
171
|
+
.map((e) => e.durationMs)
|
|
172
|
+
.filter((n) => typeof n === 'number' && Number.isFinite(n));
|
|
173
|
+
return {
|
|
174
|
+
tokens: entries.reduce((s, e) => s + e.totalTokens, 0),
|
|
175
|
+
promptTokens: entries.reduce((s, e) => s + e.promptTokens, 0),
|
|
176
|
+
completionTokens: entries.reduce((s, e) => s + e.completionTokens, 0),
|
|
177
|
+
cost: entries.reduce((s, e) => s + e.estimatedCost, 0),
|
|
178
|
+
calls: entries.length,
|
|
179
|
+
averageFirstTokenMs: average(firstTokenValues),
|
|
180
|
+
averageDurationMs: average(durationValues),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function average(values) {
|
|
184
|
+
if (values.length === 0)
|
|
185
|
+
return null;
|
|
186
|
+
return values.reduce((sum, value) => sum + value, 0) / values.length;
|
|
187
|
+
}
|
|
188
|
+
function finiteOptional(value) {
|
|
189
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0
|
|
190
|
+
? Math.round(value)
|
|
191
|
+
: undefined;
|
|
192
|
+
}
|
|
193
|
+
function formatLatencySummary(summary) {
|
|
194
|
+
const bits = [];
|
|
195
|
+
if (summary.averageFirstTokenMs !== null)
|
|
196
|
+
bits.push(`avg first ${formatMs(summary.averageFirstTokenMs)}`);
|
|
197
|
+
if (summary.averageDurationMs !== null)
|
|
198
|
+
bits.push(`avg turn ${formatMs(summary.averageDurationMs)}`);
|
|
199
|
+
return bits.length ? ` | ${bits.join(', ')}` : '';
|
|
200
|
+
}
|
|
201
|
+
function formatLastLatency(entry) {
|
|
202
|
+
const bits = [];
|
|
203
|
+
if (typeof entry.firstTokenMs === 'number')
|
|
204
|
+
bits.push(`first ${formatMs(entry.firstTokenMs)}`);
|
|
205
|
+
if (typeof entry.durationMs === 'number')
|
|
206
|
+
bits.push(`turn ${formatMs(entry.durationMs)}`);
|
|
207
|
+
return bits.length ? ` | ${bits.join(', ')}` : '';
|
|
208
|
+
}
|
|
209
|
+
function formatMs(ms) {
|
|
210
|
+
return ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms)}ms`;
|
|
211
|
+
}
|
|
212
|
+
export const _internal = {
|
|
213
|
+
getUsageFile,
|
|
214
|
+
summarizeEntries,
|
|
215
|
+
};
|
|
154
216
|
//# sourceMappingURL=cost-tracker.js.map
|
package/dist/cost-tracker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../src/cost-tracker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cost-tracker.js","sourceRoot":"","sources":["../src/cost-tracker.ts"],"names":[],"mappings":"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"}
|
package/dist/coverage.js
CHANGED
|
@@ -73,45 +73,45 @@ function getCoverageCommand(framework) {
|
|
|
73
73
|
export function buildCoveragePrompt(cwd) {
|
|
74
74
|
const framework = detectTestFramework(cwd);
|
|
75
75
|
const coverageCmd = getCoverageCommand(framework);
|
|
76
|
-
return `Analyze test coverage for this project and suggest improvements.
|
|
77
|
-
|
|
78
|
-
## Current Working Directory
|
|
79
|
-
\`\`\`
|
|
80
|
-
${cwd}
|
|
81
|
-
\`\`\`
|
|
82
|
-
|
|
83
|
-
## Detected Test Framework
|
|
84
|
-
${framework !== 'unknown' ? chalk.green(framework) : chalk.yellow('unknown (manually specify)')}
|
|
85
|
-
|
|
86
|
-
## Instructions
|
|
87
|
-
1. Run the coverage command: \`${coverageCmd}\`
|
|
88
|
-
2. Parse the coverage report and extract:
|
|
89
|
-
- Total lines of code
|
|
90
|
-
- Lines covered
|
|
91
|
-
- Coverage percentage
|
|
92
|
-
- List of uncovered or poorly-covered files
|
|
93
|
-
3. Analyze the results:
|
|
94
|
-
- Identify the top 3-5 uncovered functions or code paths
|
|
95
|
-
- Prioritize by impact (critical paths first)
|
|
96
|
-
4. Suggest specific tests to write:
|
|
97
|
-
- For each uncovered area, describe what test cases would improve coverage
|
|
98
|
-
- Focus on edge cases and error handling
|
|
99
|
-
5. Set a target of 80% coverage minimum
|
|
100
|
-
|
|
101
|
-
## Expected Output Format
|
|
102
|
-
Provide:
|
|
103
|
-
1. Current coverage summary (percentage and line counts)
|
|
104
|
-
2. List of uncovered files
|
|
105
|
-
3. For each top uncovered function:
|
|
106
|
-
- Function name and location
|
|
107
|
-
- What it does
|
|
108
|
-
- Suggested test cases to cover it
|
|
109
|
-
4. Estimated effort to reach 80% coverage
|
|
110
|
-
5. Commands to run the suggested tests
|
|
111
|
-
|
|
112
|
-
## Notes
|
|
113
|
-
- If coverage is already ≥80%, suggest areas for improvement beyond line coverage
|
|
114
|
-
- Consider mutation testing or branch coverage for deeper insights
|
|
76
|
+
return `Analyze test coverage for this project and suggest improvements.
|
|
77
|
+
|
|
78
|
+
## Current Working Directory
|
|
79
|
+
\`\`\`
|
|
80
|
+
${cwd}
|
|
81
|
+
\`\`\`
|
|
82
|
+
|
|
83
|
+
## Detected Test Framework
|
|
84
|
+
${framework !== 'unknown' ? chalk.green(framework) : chalk.yellow('unknown (manually specify)')}
|
|
85
|
+
|
|
86
|
+
## Instructions
|
|
87
|
+
1. Run the coverage command: \`${coverageCmd}\`
|
|
88
|
+
2. Parse the coverage report and extract:
|
|
89
|
+
- Total lines of code
|
|
90
|
+
- Lines covered
|
|
91
|
+
- Coverage percentage
|
|
92
|
+
- List of uncovered or poorly-covered files
|
|
93
|
+
3. Analyze the results:
|
|
94
|
+
- Identify the top 3-5 uncovered functions or code paths
|
|
95
|
+
- Prioritize by impact (critical paths first)
|
|
96
|
+
4. Suggest specific tests to write:
|
|
97
|
+
- For each uncovered area, describe what test cases would improve coverage
|
|
98
|
+
- Focus on edge cases and error handling
|
|
99
|
+
5. Set a target of 80% coverage minimum
|
|
100
|
+
|
|
101
|
+
## Expected Output Format
|
|
102
|
+
Provide:
|
|
103
|
+
1. Current coverage summary (percentage and line counts)
|
|
104
|
+
2. List of uncovered files
|
|
105
|
+
3. For each top uncovered function:
|
|
106
|
+
- Function name and location
|
|
107
|
+
- What it does
|
|
108
|
+
- Suggested test cases to cover it
|
|
109
|
+
4. Estimated effort to reach 80% coverage
|
|
110
|
+
5. Commands to run the suggested tests
|
|
111
|
+
|
|
112
|
+
## Notes
|
|
113
|
+
- If coverage is already ≥80%, suggest areas for improvement beyond line coverage
|
|
114
|
+
- Consider mutation testing or branch coverage for deeper insights
|
|
115
115
|
- Ensure all new tests have clear assertions`;
|
|
116
116
|
}
|
|
117
117
|
/**
|