@sentropic/agent-stats 0.1.0 → 0.2.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/package.json +2 -2
- package/dist/cli.d.ts +0 -8
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -150
- package/dist/cli.js.map +0 -1
- package/dist/commands/analyze.d.ts +0 -26
- package/dist/commands/analyze.d.ts.map +0 -1
- package/dist/commands/analyze.js +0 -74
- package/dist/commands/analyze.js.map +0 -1
- package/dist/commands/anomalies.d.ts +0 -20
- package/dist/commands/anomalies.d.ts.map +0 -1
- package/dist/commands/anomalies.js +0 -70
- package/dist/commands/anomalies.js.map +0 -1
- package/dist/commands/clean.d.ts +0 -28
- package/dist/commands/clean.d.ts.map +0 -1
- package/dist/commands/clean.js +0 -70
- package/dist/commands/clean.js.map +0 -1
- package/dist/commands/report.d.ts +0 -21
- package/dist/commands/report.d.ts.map +0 -1
- package/dist/commands/report.js +0 -175
- package/dist/commands/report.js.map +0 -1
- package/dist/commands/stats.d.ts +0 -21
- package/dist/commands/stats.d.ts.map +0 -1
- package/dist/commands/stats.js +0 -83
- package/dist/commands/stats.js.map +0 -1
- package/dist/commands/web.d.ts +0 -26
- package/dist/commands/web.d.ts.map +0 -1
- package/dist/commands/web.js +0 -150
- package/dist/commands/web.js.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -13
- package/dist/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentropic/agent-stats",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CLI for agent-stats — analyze Claude Code and Codex CLI sessions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"access": "public"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@sentropic/agent-stats-core": "0.
|
|
27
|
+
"@sentropic/agent-stats-core": "0.2.0",
|
|
28
28
|
"commander": "^14.0.3"
|
|
29
29
|
},
|
|
30
30
|
"repository": {
|
package/dist/cli.d.ts
DELETED
package/dist/cli.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|
package/dist/cli.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* agent-stats CLI entry.
|
|
4
|
-
* Subcommands: stats | report. The rest (anomalies, clean, analyze, web,
|
|
5
|
-
* bench) will follow in WP5-WP8.
|
|
6
|
-
*/
|
|
7
|
-
import { writeFile } from 'node:fs/promises';
|
|
8
|
-
import { Command } from 'commander';
|
|
9
|
-
import { VERSION } from '@sentropic/agent-stats-core';
|
|
10
|
-
import { runStats } from './commands/stats.js';
|
|
11
|
-
import { runReport } from './commands/report.js';
|
|
12
|
-
import { runClean } from './commands/clean.js';
|
|
13
|
-
import { runAnomalies } from './commands/anomalies.js';
|
|
14
|
-
import { runWeb } from './commands/web.js';
|
|
15
|
-
import { runAnalyze } from './commands/analyze.js';
|
|
16
|
-
async function main(argv) {
|
|
17
|
-
const program = new Command();
|
|
18
|
-
program
|
|
19
|
-
.name('agent-stats')
|
|
20
|
-
.description('Analyze Claude Code and Codex CLI sessions.')
|
|
21
|
-
.version(VERSION);
|
|
22
|
-
program
|
|
23
|
-
.command('stats')
|
|
24
|
-
.description('Compute weekly aggregations and output JSON or a compact table.')
|
|
25
|
-
.option('--since <iso>', 'Lower bound (ISO 8601)')
|
|
26
|
-
.option('--until <iso>', 'Upper bound (ISO 8601)')
|
|
27
|
-
.option('--tool <name>', 'Restrict to one tool: claude | codex')
|
|
28
|
-
.option('--project <cwd>', 'Filter by project cwd (exact or prefix with trailing /)')
|
|
29
|
-
.option('--format <fmt>', 'Output format: json | table', 'json')
|
|
30
|
-
.option('--out <file>', 'Write to file instead of stdout')
|
|
31
|
-
.action(async (opts) => {
|
|
32
|
-
const result = await runStats({
|
|
33
|
-
since: opts.since,
|
|
34
|
-
until: opts.until,
|
|
35
|
-
tool: opts.tool,
|
|
36
|
-
project: opts.project,
|
|
37
|
-
format: opts.format,
|
|
38
|
-
});
|
|
39
|
-
if (opts.out)
|
|
40
|
-
await writeFile(opts.out, result.output);
|
|
41
|
-
else
|
|
42
|
-
process.stdout.write(`${result.output}\n`);
|
|
43
|
-
});
|
|
44
|
-
program
|
|
45
|
-
.command('analyze')
|
|
46
|
-
.description('LLM analysis of top sessions via @sentropic/llm-mesh.')
|
|
47
|
-
.option('--since <iso>', 'Lower bound (ISO 8601)')
|
|
48
|
-
.option('--until <iso>', 'Upper bound (ISO 8601)')
|
|
49
|
-
.option('--tool <name>', 'Restrict to one tool: claude | codex')
|
|
50
|
-
.option('--project <cwd>', 'Filter by project cwd')
|
|
51
|
-
.option('--model <id>', 'LLM model (default mistral-small-4)', 'mistral-small-4')
|
|
52
|
-
.option('--limit <n>', 'Number of top sessions to analyze', (v) => parseInt(v, 10), 10)
|
|
53
|
-
.option('--out <file>', 'Write to file instead of stdout')
|
|
54
|
-
.action(async (opts) => {
|
|
55
|
-
const result = await runAnalyze({
|
|
56
|
-
since: opts.since,
|
|
57
|
-
until: opts.until,
|
|
58
|
-
tool: opts.tool,
|
|
59
|
-
project: opts.project,
|
|
60
|
-
model: opts.model,
|
|
61
|
-
limit: opts.limit,
|
|
62
|
-
});
|
|
63
|
-
if (opts.out)
|
|
64
|
-
await writeFile(opts.out, result.output);
|
|
65
|
-
else
|
|
66
|
-
process.stdout.write(`${result.output}\n`);
|
|
67
|
-
});
|
|
68
|
-
program
|
|
69
|
-
.command('web')
|
|
70
|
-
.description('Launch the local SvelteKit dashboard on http://127.0.0.1:<port>.')
|
|
71
|
-
.option('--port <n>', 'Listen port (default 4173)', (v) => parseInt(v, 10), 4173)
|
|
72
|
-
.option('--web-dir <dir>', 'Override the static build directory')
|
|
73
|
-
.action(async (opts) => {
|
|
74
|
-
const server = await runWeb({ port: opts.port, webDir: opts.webDir });
|
|
75
|
-
// Keep the process alive until Ctrl-C.
|
|
76
|
-
process.on('SIGINT', () => {
|
|
77
|
-
void server.close().then(() => process.exit(0));
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
program
|
|
81
|
-
.command('anomalies')
|
|
82
|
-
.description('Heuristic anomaly detection (compactions, loops, error rate, zombie).')
|
|
83
|
-
.option('--since <iso>', 'Lower bound (ISO 8601)')
|
|
84
|
-
.option('--until <iso>', 'Upper bound (ISO 8601)')
|
|
85
|
-
.option('--tool <name>', 'Restrict to one tool: claude | codex')
|
|
86
|
-
.option('--project <cwd>', 'Filter by project cwd (exact or prefix with trailing /)')
|
|
87
|
-
.option('--format <fmt>', 'Output format: json | table', 'json')
|
|
88
|
-
.option('--out <file>', 'Write to file instead of stdout')
|
|
89
|
-
.action(async (opts) => {
|
|
90
|
-
const result = await runAnomalies({
|
|
91
|
-
since: opts.since,
|
|
92
|
-
until: opts.until,
|
|
93
|
-
tool: opts.tool,
|
|
94
|
-
project: opts.project,
|
|
95
|
-
format: opts.format,
|
|
96
|
-
});
|
|
97
|
-
if (opts.out)
|
|
98
|
-
await writeFile(opts.out, result.output);
|
|
99
|
-
else
|
|
100
|
-
process.stdout.write(`${result.output}\n`);
|
|
101
|
-
});
|
|
102
|
-
program
|
|
103
|
-
.command('clean')
|
|
104
|
-
.description('Redact secrets in session jsonl files (via secretlint).')
|
|
105
|
-
.requiredOption('--input <path>', 'File or directory to clean')
|
|
106
|
-
.option('--mode <mode>', 'archive | inplace | llm-input', 'archive')
|
|
107
|
-
.option('--out <dir>', 'Output directory (archive | llm-input)')
|
|
108
|
-
.option('--max-tool-result-bytes <n>', 'Truncate strings larger than N bytes (llm-input mode)', (v) => parseInt(v, 10), 2048)
|
|
109
|
-
.action(async (opts) => {
|
|
110
|
-
const result = await runClean({
|
|
111
|
-
input: opts.input,
|
|
112
|
-
mode: opts.mode,
|
|
113
|
-
out: opts.out,
|
|
114
|
-
maxToolResultBytes: opts.maxToolResultBytes,
|
|
115
|
-
});
|
|
116
|
-
process.stdout.write(`${result.output}\n`);
|
|
117
|
-
});
|
|
118
|
-
program
|
|
119
|
-
.command('report')
|
|
120
|
-
.description('Generate a Markdown weekly report.')
|
|
121
|
-
.option('--since <iso>', 'Lower bound (ISO 8601)')
|
|
122
|
-
.option('--until <iso>', 'Upper bound (ISO 8601)')
|
|
123
|
-
.option('--tool <name>', 'Restrict to one tool: claude | codex')
|
|
124
|
-
.option('--project <cwd>', 'Filter by project cwd (exact or prefix with trailing /)')
|
|
125
|
-
.option('--top <n>', 'Top-N projects / models per week', (v) => parseInt(v, 10), 10)
|
|
126
|
-
.option('--out <file>', 'Write to file instead of stdout')
|
|
127
|
-
.action(async (opts) => {
|
|
128
|
-
const result = await runReport({
|
|
129
|
-
since: opts.since,
|
|
130
|
-
until: opts.until,
|
|
131
|
-
tool: opts.tool,
|
|
132
|
-
project: opts.project,
|
|
133
|
-
top: opts.top,
|
|
134
|
-
});
|
|
135
|
-
if (opts.out)
|
|
136
|
-
await writeFile(opts.out, result.output);
|
|
137
|
-
else
|
|
138
|
-
process.stdout.write(result.output);
|
|
139
|
-
});
|
|
140
|
-
await program.parseAsync(argv);
|
|
141
|
-
return 0;
|
|
142
|
-
}
|
|
143
|
-
main(process.argv)
|
|
144
|
-
.then((code) => process.exit(code))
|
|
145
|
-
.catch((err) => {
|
|
146
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
147
|
-
console.error(`agent-stats: ${msg}`);
|
|
148
|
-
process.exit(1);
|
|
149
|
-
});
|
|
150
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats analyze` — qualitative LLM analysis of session aggregates.
|
|
3
|
-
*
|
|
4
|
-
* Requires a `@sentropic/llm-mesh` factory: the CLI dynamically imports
|
|
5
|
-
* it and bails out with a friendly message if it isn't installed. This
|
|
6
|
-
* keeps the rest of the CLI usable without llm-mesh as a hard dep.
|
|
7
|
-
*/
|
|
8
|
-
import { type AnalysisVerdict, type LlmMeshLike } from '@sentropic/agent-stats-core';
|
|
9
|
-
export interface AnalyzeCommandOptions {
|
|
10
|
-
since?: string;
|
|
11
|
-
until?: string;
|
|
12
|
-
tool?: 'claude' | 'codex';
|
|
13
|
-
project?: string;
|
|
14
|
-
model?: string;
|
|
15
|
-
limit?: number;
|
|
16
|
-
/** Inject a mesh in tests; otherwise loaded dynamically. */
|
|
17
|
-
mesh?: LlmMeshLike;
|
|
18
|
-
claudeProjectsDir?: string;
|
|
19
|
-
codexDbPath?: string;
|
|
20
|
-
}
|
|
21
|
-
export interface AnalyzeResult {
|
|
22
|
-
verdicts: AnalysisVerdict[];
|
|
23
|
-
output: string;
|
|
24
|
-
}
|
|
25
|
-
export declare function runAnalyze(opts?: AnalyzeCommandOptions): Promise<AnalyzeResult>;
|
|
26
|
-
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAIL,KAAK,eAAe,EAEpB,KAAK,WAAW,EACjB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB;AAkCD,wBAAsB,UAAU,CAAC,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BzF"}
|
package/dist/commands/analyze.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats analyze` — qualitative LLM analysis of session aggregates.
|
|
3
|
-
*
|
|
4
|
-
* Requires a `@sentropic/llm-mesh` factory: the CLI dynamically imports
|
|
5
|
-
* it and bails out with a friendly message if it isn't installed. This
|
|
6
|
-
* keeps the rest of the CLI usable without llm-mesh as a hard dep.
|
|
7
|
-
*/
|
|
8
|
-
import { aggregateSessions, analyzeWithLlm, collect, } from '@sentropic/agent-stats-core';
|
|
9
|
-
function parseDate(value, label) {
|
|
10
|
-
if (!value)
|
|
11
|
-
return undefined;
|
|
12
|
-
const d = new Date(value);
|
|
13
|
-
if (Number.isNaN(d.getTime())) {
|
|
14
|
-
throw new Error(`Invalid --${label} value: ${value} (expected ISO 8601)`);
|
|
15
|
-
}
|
|
16
|
-
return d;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Best-effort dynamic loader for `@sentropic/llm-mesh`. Returns undefined
|
|
20
|
-
* if the package isn't installed in the current workspace.
|
|
21
|
-
*/
|
|
22
|
-
async function loadMeshFromEnv() {
|
|
23
|
-
try {
|
|
24
|
-
// Dynamic import via an indirected specifier so TypeScript does not
|
|
25
|
-
// try to resolve `@sentropic/llm-mesh` at type-check time (the dep is
|
|
26
|
-
// optional). Wrappers can always inject their own mesh via `opts.mesh`.
|
|
27
|
-
const meshPkg = '@sentropic/llm-mesh';
|
|
28
|
-
const mod = (await import(/* @vite-ignore */ meshPkg));
|
|
29
|
-
if (typeof mod.createLlmMesh !== 'function')
|
|
30
|
-
return undefined;
|
|
31
|
-
// Default mesh wiring is left to the caller — we have no provider config
|
|
32
|
-
// here. Users with their own llm-mesh config should import the lib in a
|
|
33
|
-
// small wrapper script and pass the resulting mesh via runAnalyze({mesh}).
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export async function runAnalyze(opts = {}) {
|
|
41
|
-
const collectOpts = {};
|
|
42
|
-
const since = parseDate(opts.since, 'since');
|
|
43
|
-
const until = parseDate(opts.until, 'until');
|
|
44
|
-
if (since !== undefined)
|
|
45
|
-
collectOpts.since = since;
|
|
46
|
-
if (until !== undefined)
|
|
47
|
-
collectOpts.until = until;
|
|
48
|
-
if (opts.project !== undefined)
|
|
49
|
-
collectOpts.projectCwd = opts.project;
|
|
50
|
-
if (opts.claudeProjectsDir !== undefined)
|
|
51
|
-
collectOpts.claudeProjectsDir = opts.claudeProjectsDir;
|
|
52
|
-
if (opts.codexDbPath !== undefined)
|
|
53
|
-
collectOpts.codexDbPath = opts.codexDbPath;
|
|
54
|
-
if (opts.tool) {
|
|
55
|
-
collectOpts.sources = { claude: opts.tool === 'claude', codex: opts.tool === 'codex' };
|
|
56
|
-
}
|
|
57
|
-
const mesh = opts.mesh ?? (await loadMeshFromEnv());
|
|
58
|
-
if (!mesh) {
|
|
59
|
-
throw new Error('@sentropic/llm-mesh is not available. Install it as a dependency or wrap the lib programmatically (runAnalyze accepts { mesh }).');
|
|
60
|
-
}
|
|
61
|
-
const model = opts.model ?? 'mistral-small-4';
|
|
62
|
-
const sessions = await aggregateSessions(collect(collectOpts));
|
|
63
|
-
const limit = opts.limit ?? 10;
|
|
64
|
-
const top = [...sessions]
|
|
65
|
-
.sort((a, b) => b.toolCalls + b.compactions * 2 - (a.toolCalls + a.compactions * 2))
|
|
66
|
-
.slice(0, limit);
|
|
67
|
-
const verdicts = [];
|
|
68
|
-
for (const s of top) {
|
|
69
|
-
const v = await analyzeWithLlm(s, { mesh, model });
|
|
70
|
-
verdicts.push(v);
|
|
71
|
-
}
|
|
72
|
-
return { verdicts, output: JSON.stringify(verdicts, null, 2) };
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=analyze.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats anomalies` — run heuristic anomaly detection over a date
|
|
3
|
-
* range. Outputs either JSON (default) or a compact table.
|
|
4
|
-
*/
|
|
5
|
-
import { type Anomaly } from '@sentropic/agent-stats-core';
|
|
6
|
-
export interface AnomaliesCommandOptions {
|
|
7
|
-
since?: string;
|
|
8
|
-
until?: string;
|
|
9
|
-
tool?: 'claude' | 'codex';
|
|
10
|
-
project?: string;
|
|
11
|
-
format?: 'json' | 'table';
|
|
12
|
-
claudeProjectsDir?: string;
|
|
13
|
-
codexDbPath?: string;
|
|
14
|
-
}
|
|
15
|
-
export interface AnomaliesResult {
|
|
16
|
-
output: string;
|
|
17
|
-
anomalies: Anomaly[];
|
|
18
|
-
}
|
|
19
|
-
export declare function runAnomalies(opts?: AnomaliesCommandOptions): Promise<AnomaliesResult>;
|
|
20
|
-
//# sourceMappingURL=anomalies.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anomalies.d.ts","sourceRoot":"","sources":["../../src/commands/anomalies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,KAAK,OAAO,EAGb,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,EAAE,CAAC;CACtB;AAgCD,wBAAsB,YAAY,CAAC,IAAI,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC,CA0B/F"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats anomalies` — run heuristic anomaly detection over a date
|
|
3
|
-
* range. Outputs either JSON (default) or a compact table.
|
|
4
|
-
*/
|
|
5
|
-
import { collect, detectAnomalies, } from '@sentropic/agent-stats-core';
|
|
6
|
-
function parseDate(value, label) {
|
|
7
|
-
if (!value)
|
|
8
|
-
return undefined;
|
|
9
|
-
const d = new Date(value);
|
|
10
|
-
if (Number.isNaN(d.getTime())) {
|
|
11
|
-
throw new Error(`Invalid --${label} value: ${value} (expected ISO 8601)`);
|
|
12
|
-
}
|
|
13
|
-
return d;
|
|
14
|
-
}
|
|
15
|
-
function renderTable(items) {
|
|
16
|
-
if (items.length === 0)
|
|
17
|
-
return '(no anomalies)';
|
|
18
|
-
const headers = ['type', 'sev', 'tool', 'project', 'session', 'evidence'];
|
|
19
|
-
const lines = [headers];
|
|
20
|
-
for (const a of items) {
|
|
21
|
-
lines.push([
|
|
22
|
-
a.type,
|
|
23
|
-
a.severity,
|
|
24
|
-
a.tool,
|
|
25
|
-
a.projectCwd,
|
|
26
|
-
a.sessionId.slice(0, 8),
|
|
27
|
-
JSON.stringify(a.evidence),
|
|
28
|
-
]);
|
|
29
|
-
}
|
|
30
|
-
const widths = headers.map((_, i) => Math.max(...lines.map((l) => (l[i] ?? '').length)));
|
|
31
|
-
const fmt = (l) => l.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' ');
|
|
32
|
-
const out = [fmt(headers), widths.map((w) => '-'.repeat(w)).join(' ')];
|
|
33
|
-
for (let i = 1; i < lines.length; i++)
|
|
34
|
-
out.push(fmt(lines[i] ?? []));
|
|
35
|
-
return out.join('\n');
|
|
36
|
-
}
|
|
37
|
-
export async function runAnomalies(opts = {}) {
|
|
38
|
-
const collectOpts = {};
|
|
39
|
-
const since = parseDate(opts.since, 'since');
|
|
40
|
-
const until = parseDate(opts.until, 'until');
|
|
41
|
-
if (since !== undefined)
|
|
42
|
-
collectOpts.since = since;
|
|
43
|
-
if (until !== undefined)
|
|
44
|
-
collectOpts.until = until;
|
|
45
|
-
if (opts.project !== undefined)
|
|
46
|
-
collectOpts.projectCwd = opts.project;
|
|
47
|
-
if (opts.claudeProjectsDir !== undefined)
|
|
48
|
-
collectOpts.claudeProjectsDir = opts.claudeProjectsDir;
|
|
49
|
-
if (opts.codexDbPath !== undefined)
|
|
50
|
-
collectOpts.codexDbPath = opts.codexDbPath;
|
|
51
|
-
if (opts.tool) {
|
|
52
|
-
collectOpts.sources = {
|
|
53
|
-
claude: opts.tool === 'claude',
|
|
54
|
-
codex: opts.tool === 'codex',
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
const anomalies = await detectAnomalies(collect(collectOpts));
|
|
58
|
-
// Sort: severity (high → low), then type, then session id
|
|
59
|
-
const sevRank = { high: 3, medium: 2, low: 1 };
|
|
60
|
-
anomalies.sort((a, b) => {
|
|
61
|
-
const sv = sevRank[b.severity] - sevRank[a.severity];
|
|
62
|
-
if (sv !== 0)
|
|
63
|
-
return sv;
|
|
64
|
-
return a.type.localeCompare(b.type) || a.sessionId.localeCompare(b.sessionId);
|
|
65
|
-
});
|
|
66
|
-
const format = opts.format ?? 'json';
|
|
67
|
-
const output = format === 'table' ? renderTable(anomalies) : JSON.stringify(anomalies, null, 2);
|
|
68
|
-
return { output, anomalies };
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=anomalies.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anomalies.js","sourceRoot":"","sources":["../../src/commands/anomalies.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/clean.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats clean` — redact secrets in session jsonl files.
|
|
3
|
-
*
|
|
4
|
-
* Operates on a single file (`--input` is a file) or recursively on a
|
|
5
|
-
* directory (`--input` is a dir). Mirrors the directory structure under
|
|
6
|
-
* `--out` in `archive` and `llm-input` modes; rewrites in place (with a
|
|
7
|
-
* `.bak`) in `inplace` mode.
|
|
8
|
-
*/
|
|
9
|
-
import { type CleanMode, type CleanStats } from '@sentropic/agent-stats-core';
|
|
10
|
-
export interface CleanCommandOptions {
|
|
11
|
-
input: string;
|
|
12
|
-
mode?: CleanMode;
|
|
13
|
-
out?: string;
|
|
14
|
-
maxToolResultBytes?: number;
|
|
15
|
-
}
|
|
16
|
-
export interface CleanCommandResult {
|
|
17
|
-
output: string;
|
|
18
|
-
totals: {
|
|
19
|
-
files: number;
|
|
20
|
-
secretsFound: number;
|
|
21
|
-
truncations: number;
|
|
22
|
-
bytesIn: number;
|
|
23
|
-
bytesOut: number;
|
|
24
|
-
};
|
|
25
|
-
perFile: CleanStats[];
|
|
26
|
-
}
|
|
27
|
-
export declare function runClean(opts: CleanCommandOptions): Promise<CleanCommandResult>;
|
|
28
|
-
//# sourceMappingURL=clean.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAkBD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2CrF"}
|
package/dist/commands/clean.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats clean` — redact secrets in session jsonl files.
|
|
3
|
-
*
|
|
4
|
-
* Operates on a single file (`--input` is a file) or recursively on a
|
|
5
|
-
* directory (`--input` is a dir). Mirrors the directory structure under
|
|
6
|
-
* `--out` in `archive` and `llm-input` modes; rewrites in place (with a
|
|
7
|
-
* `.bak`) in `inplace` mode.
|
|
8
|
-
*/
|
|
9
|
-
import { readdir, stat } from 'node:fs/promises';
|
|
10
|
-
import path from 'node:path';
|
|
11
|
-
import { cleanFile } from '@sentropic/agent-stats-core';
|
|
12
|
-
async function listJsonlFiles(input) {
|
|
13
|
-
const s = await stat(input);
|
|
14
|
-
if (s.isFile())
|
|
15
|
-
return [input];
|
|
16
|
-
const out = [];
|
|
17
|
-
const walk = async (dir) => {
|
|
18
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
19
|
-
for (const e of entries) {
|
|
20
|
-
const p = path.join(dir, e.name);
|
|
21
|
-
if (e.isDirectory())
|
|
22
|
-
await walk(p);
|
|
23
|
-
else if (e.isFile() && e.name.endsWith('.jsonl'))
|
|
24
|
-
out.push(p);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
await walk(input);
|
|
28
|
-
return out;
|
|
29
|
-
}
|
|
30
|
-
export async function runClean(opts) {
|
|
31
|
-
const mode = opts.mode ?? 'archive';
|
|
32
|
-
if ((mode === 'archive' || mode === 'llm-input') && !opts.out) {
|
|
33
|
-
throw new Error(`--out is required for --mode ${mode}`);
|
|
34
|
-
}
|
|
35
|
-
const files = await listJsonlFiles(opts.input);
|
|
36
|
-
const inputStat = await stat(opts.input);
|
|
37
|
-
const baseDir = inputStat.isDirectory() ? opts.input : path.dirname(opts.input);
|
|
38
|
-
const perFile = [];
|
|
39
|
-
const totals = { files: 0, secretsFound: 0, truncations: 0, bytesIn: 0, bytesOut: 0 };
|
|
40
|
-
for (const file of files) {
|
|
41
|
-
let outputPath;
|
|
42
|
-
if (mode !== 'inplace') {
|
|
43
|
-
const rel = path.relative(baseDir, file);
|
|
44
|
-
outputPath = path.join(opts.out, rel);
|
|
45
|
-
}
|
|
46
|
-
const r = await cleanFile({
|
|
47
|
-
filePath: file,
|
|
48
|
-
mode,
|
|
49
|
-
...(outputPath ? { outputPath } : {}),
|
|
50
|
-
...(opts.maxToolResultBytes !== undefined
|
|
51
|
-
? { maxToolResultBytes: opts.maxToolResultBytes }
|
|
52
|
-
: {}),
|
|
53
|
-
});
|
|
54
|
-
perFile.push(r);
|
|
55
|
-
totals.files += 1;
|
|
56
|
-
totals.secretsFound += r.secretsFound;
|
|
57
|
-
totals.truncations += r.truncations;
|
|
58
|
-
totals.bytesIn += r.bytesIn;
|
|
59
|
-
totals.bytesOut += r.bytesOut;
|
|
60
|
-
}
|
|
61
|
-
const output = [
|
|
62
|
-
`agent-stats clean — mode=${mode}`,
|
|
63
|
-
`Files processed: ${totals.files}`,
|
|
64
|
-
`Secrets found: ${totals.secretsFound}`,
|
|
65
|
-
`Truncations: ${totals.truncations}`,
|
|
66
|
-
`Bytes in → out: ${totals.bytesIn.toLocaleString()} → ${totals.bytesOut.toLocaleString()}`,
|
|
67
|
-
].join('\n');
|
|
68
|
-
return { output, totals, perFile };
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=clean.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats report` — render a Markdown weekly report from the
|
|
3
|
-
* aggregations. Highlights top projects, top models, cache efficiency,
|
|
4
|
-
* and (when present) rate-limit pressure.
|
|
5
|
-
*/
|
|
6
|
-
import { type WeeklyAggregation } from '@sentropic/agent-stats-core';
|
|
7
|
-
export interface ReportCommandOptions {
|
|
8
|
-
since?: string;
|
|
9
|
-
until?: string;
|
|
10
|
-
tool?: 'claude' | 'codex';
|
|
11
|
-
project?: string;
|
|
12
|
-
top?: number;
|
|
13
|
-
claudeProjectsDir?: string;
|
|
14
|
-
codexDbPath?: string;
|
|
15
|
-
}
|
|
16
|
-
export interface ReportResult {
|
|
17
|
-
output: string;
|
|
18
|
-
rows: WeeklyAggregation[];
|
|
19
|
-
}
|
|
20
|
-
export declare function runReport(opts?: ReportCommandOptions): Promise<ReportResult>;
|
|
21
|
-
//# sourceMappingURL=report.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,iBAAiB,EAAE,CAAC;CAC3B;AAwJD,wBAAsB,SAAS,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkCtF"}
|
package/dist/commands/report.js
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats report` — render a Markdown weekly report from the
|
|
3
|
-
* aggregations. Highlights top projects, top models, cache efficiency,
|
|
4
|
-
* and (when present) rate-limit pressure.
|
|
5
|
-
*/
|
|
6
|
-
import { aggregateWeekly, cacheEfficiency, collect, totalInputTokens, } from '@sentropic/agent-stats-core';
|
|
7
|
-
function parseDate(value, label) {
|
|
8
|
-
if (!value)
|
|
9
|
-
return undefined;
|
|
10
|
-
const d = new Date(value);
|
|
11
|
-
if (Number.isNaN(d.getTime())) {
|
|
12
|
-
throw new Error(`Invalid --${label} value: ${value} (expected ISO 8601)`);
|
|
13
|
-
}
|
|
14
|
-
return d;
|
|
15
|
-
}
|
|
16
|
-
function fmt(n) {
|
|
17
|
-
if (n >= 1e9)
|
|
18
|
-
return `${(n / 1e9).toFixed(2)}G`;
|
|
19
|
-
if (n >= 1e6)
|
|
20
|
-
return `${(n / 1e6).toFixed(2)}M`;
|
|
21
|
-
if (n >= 1e3)
|
|
22
|
-
return `${(n / 1e3).toFixed(1)}k`;
|
|
23
|
-
return n.toString();
|
|
24
|
-
}
|
|
25
|
-
function groupBy(items, key) {
|
|
26
|
-
const m = new Map();
|
|
27
|
-
for (const x of items) {
|
|
28
|
-
const k = key(x);
|
|
29
|
-
let arr = m.get(k);
|
|
30
|
-
if (!arr) {
|
|
31
|
-
arr = [];
|
|
32
|
-
m.set(k, arr);
|
|
33
|
-
}
|
|
34
|
-
arr.push(x);
|
|
35
|
-
}
|
|
36
|
-
return m;
|
|
37
|
-
}
|
|
38
|
-
function renderWeek(weekStart, rows, top) {
|
|
39
|
-
// Aggregate across the week
|
|
40
|
-
const totals = rows.reduce((acc, r) => {
|
|
41
|
-
acc.sessions += r.sessions;
|
|
42
|
-
acc.turns += r.turns;
|
|
43
|
-
acc.compactions += r.compactions;
|
|
44
|
-
acc.toolCalls += r.toolCalls;
|
|
45
|
-
acc.totalUsage.newInputTokens += r.totalUsage.newInputTokens;
|
|
46
|
-
acc.totalUsage.cachedInputTokens += r.totalUsage.cachedInputTokens;
|
|
47
|
-
acc.totalUsage.cacheWriteTokens += r.totalUsage.cacheWriteTokens;
|
|
48
|
-
acc.totalUsage.outputTokens += r.totalUsage.outputTokens;
|
|
49
|
-
acc.totalUsage.reasoningTokens += r.totalUsage.reasoningTokens;
|
|
50
|
-
acc.codexCredits += r.estimatedCost.codexCredits;
|
|
51
|
-
acc.claudeUsdCents += r.estimatedCost.claudeUsdCents;
|
|
52
|
-
return acc;
|
|
53
|
-
}, {
|
|
54
|
-
sessions: 0,
|
|
55
|
-
turns: 0,
|
|
56
|
-
compactions: 0,
|
|
57
|
-
toolCalls: 0,
|
|
58
|
-
totalUsage: {
|
|
59
|
-
newInputTokens: 0,
|
|
60
|
-
cachedInputTokens: 0,
|
|
61
|
-
cacheWriteTokens: 0,
|
|
62
|
-
outputTokens: 0,
|
|
63
|
-
reasoningTokens: 0,
|
|
64
|
-
},
|
|
65
|
-
codexCredits: 0,
|
|
66
|
-
claudeUsdCents: 0,
|
|
67
|
-
});
|
|
68
|
-
const cacheRatio = cacheEfficiency(totals.totalUsage);
|
|
69
|
-
const totalIn = totalInputTokens(totals.totalUsage);
|
|
70
|
-
const lines = [];
|
|
71
|
-
lines.push(`## Week ${weekStart}`, '');
|
|
72
|
-
lines.push('### Totals');
|
|
73
|
-
lines.push('');
|
|
74
|
-
lines.push(`- Sessions: ${totals.sessions}`);
|
|
75
|
-
lines.push(`- Turns: ${totals.turns}`);
|
|
76
|
-
lines.push(`- Tool calls: ${totals.toolCalls}`);
|
|
77
|
-
lines.push(`- Compactions: ${totals.compactions}`);
|
|
78
|
-
lines.push(`- Input tokens (total): ${fmt(totalIn)} (cache hit ${(cacheRatio * 100).toFixed(1)}%)`);
|
|
79
|
-
lines.push(`- Output tokens: ${fmt(totals.totalUsage.outputTokens)} (reasoning ${fmt(totals.totalUsage.reasoningTokens)})`);
|
|
80
|
-
const costParts = [];
|
|
81
|
-
if (totals.codexCredits > 0)
|
|
82
|
-
costParts.push(`${totals.codexCredits.toFixed(0)} Codex credits`);
|
|
83
|
-
if (totals.claudeUsdCents > 0)
|
|
84
|
-
costParts.push(`$${(totals.claudeUsdCents / 100).toFixed(2)} Claude USD`);
|
|
85
|
-
lines.push(`- Estimated cost: ${costParts.length ? costParts.join(' + ') : '-'}`);
|
|
86
|
-
lines.push('');
|
|
87
|
-
// Top projects
|
|
88
|
-
const byProject = groupBy(rows, (r) => r.projectCwd);
|
|
89
|
-
const projectAgg = [...byProject.entries()]
|
|
90
|
-
.map(([cwd, list]) => ({
|
|
91
|
-
cwd,
|
|
92
|
-
tokens: list.reduce((s, r) => s + totalInputTokens(r.totalUsage) + r.totalUsage.outputTokens, 0),
|
|
93
|
-
sessions: list.reduce((s, r) => s + r.sessions, 0),
|
|
94
|
-
turns: list.reduce((s, r) => s + r.turns, 0),
|
|
95
|
-
}))
|
|
96
|
-
.sort((a, b) => b.tokens - a.tokens)
|
|
97
|
-
.slice(0, top);
|
|
98
|
-
lines.push('### Top projects');
|
|
99
|
-
lines.push('');
|
|
100
|
-
lines.push('| project | sessions | turns | tokens |');
|
|
101
|
-
lines.push('|---|---:|---:|---:|');
|
|
102
|
-
for (const p of projectAgg) {
|
|
103
|
-
lines.push(`| \`${p.cwd}\` | ${p.sessions} | ${p.turns} | ${fmt(p.tokens)} |`);
|
|
104
|
-
}
|
|
105
|
-
lines.push('');
|
|
106
|
-
// Top models
|
|
107
|
-
const byModel = groupBy(rows, (r) => `${r.tool}/${r.model}`);
|
|
108
|
-
const modelAgg = [...byModel.entries()]
|
|
109
|
-
.map(([key, list]) => ({
|
|
110
|
-
key,
|
|
111
|
-
tool: list[0]?.tool ?? 'codex',
|
|
112
|
-
model: list[0]?.model ?? 'unknown',
|
|
113
|
-
sessions: list.reduce((s, r) => s + r.sessions, 0),
|
|
114
|
-
turns: list.reduce((s, r) => s + r.turns, 0),
|
|
115
|
-
tokens: list.reduce((s, r) => s + totalInputTokens(r.totalUsage) + r.totalUsage.outputTokens, 0),
|
|
116
|
-
codex: list.reduce((s, r) => s + r.estimatedCost.codexCredits, 0),
|
|
117
|
-
claudeUsdCents: list.reduce((s, r) => s + r.estimatedCost.claudeUsdCents, 0),
|
|
118
|
-
}))
|
|
119
|
-
.sort((a, b) => b.tokens - a.tokens)
|
|
120
|
-
.slice(0, top);
|
|
121
|
-
lines.push('### Top models');
|
|
122
|
-
lines.push('');
|
|
123
|
-
lines.push('| tool | model | sessions | turns | tokens | cost |');
|
|
124
|
-
lines.push('|---|---|---:|---:|---:|---:|');
|
|
125
|
-
for (const m of modelAgg) {
|
|
126
|
-
const cost = m.codex > 0
|
|
127
|
-
? `${m.codex.toFixed(0)} cr`
|
|
128
|
-
: m.claudeUsdCents > 0
|
|
129
|
-
? `$${(m.claudeUsdCents / 100).toFixed(2)}`
|
|
130
|
-
: '-';
|
|
131
|
-
lines.push(`| ${m.tool} | ${m.model} | ${m.sessions} | ${m.turns} | ${fmt(m.tokens)} | ${cost} |`);
|
|
132
|
-
}
|
|
133
|
-
lines.push('');
|
|
134
|
-
return lines.join('\n');
|
|
135
|
-
}
|
|
136
|
-
export async function runReport(opts = {}) {
|
|
137
|
-
const collectOpts = {};
|
|
138
|
-
const since = parseDate(opts.since, 'since');
|
|
139
|
-
const until = parseDate(opts.until, 'until');
|
|
140
|
-
if (since !== undefined)
|
|
141
|
-
collectOpts.since = since;
|
|
142
|
-
if (until !== undefined)
|
|
143
|
-
collectOpts.until = until;
|
|
144
|
-
if (opts.project !== undefined)
|
|
145
|
-
collectOpts.projectCwd = opts.project;
|
|
146
|
-
if (opts.claudeProjectsDir !== undefined)
|
|
147
|
-
collectOpts.claudeProjectsDir = opts.claudeProjectsDir;
|
|
148
|
-
if (opts.codexDbPath !== undefined)
|
|
149
|
-
collectOpts.codexDbPath = opts.codexDbPath;
|
|
150
|
-
if (opts.tool) {
|
|
151
|
-
collectOpts.sources = {
|
|
152
|
-
claude: opts.tool === 'claude',
|
|
153
|
-
codex: opts.tool === 'codex',
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
const top = opts.top ?? 10;
|
|
157
|
-
const rows = await aggregateWeekly(collect(collectOpts));
|
|
158
|
-
const byWeek = groupBy(rows, (r) => r.weekStart);
|
|
159
|
-
const weeks = [...byWeek.keys()].sort();
|
|
160
|
-
const periodLine = weeks.length
|
|
161
|
-
? `Period: ${weeks[0]} → ${weeks[weeks.length - 1]} (${weeks.length} week${weeks.length === 1 ? '' : 's'})`
|
|
162
|
-
: 'Period: no data';
|
|
163
|
-
const head = ['# agent-stats — weekly report', '', periodLine];
|
|
164
|
-
const body = weeks.map((w) => renderWeek(w, byWeek.get(w) ?? [], top));
|
|
165
|
-
return {
|
|
166
|
-
output: [...head, '', ...body]
|
|
167
|
-
.filter((s) => s !== undefined)
|
|
168
|
-
.join('\n')
|
|
169
|
-
.trimEnd() + '\n',
|
|
170
|
-
rows,
|
|
171
|
-
};
|
|
172
|
-
// Note: costString is currently referenced only for future use in renderWeek;
|
|
173
|
-
// exposed indirectly to avoid dead-code elimination in some bundlers.
|
|
174
|
-
}
|
|
175
|
-
//# sourceMappingURL=report.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/stats.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats stats` — emit weekly aggregations as JSON or as a compact
|
|
3
|
-
* ASCII table.
|
|
4
|
-
*/
|
|
5
|
-
import { type WeeklyAggregation } from '@sentropic/agent-stats-core';
|
|
6
|
-
export interface StatsCommandOptions {
|
|
7
|
-
since?: string;
|
|
8
|
-
until?: string;
|
|
9
|
-
tool?: 'claude' | 'codex';
|
|
10
|
-
project?: string;
|
|
11
|
-
format?: 'json' | 'table';
|
|
12
|
-
/** Override default scan dirs (used by tests). */
|
|
13
|
-
claudeProjectsDir?: string;
|
|
14
|
-
codexDbPath?: string;
|
|
15
|
-
}
|
|
16
|
-
export interface StatsResult {
|
|
17
|
-
output: string;
|
|
18
|
-
rows: WeeklyAggregation[];
|
|
19
|
-
}
|
|
20
|
-
export declare function runStats(opts?: StatsCommandOptions): Promise<StatsResult>;
|
|
21
|
-
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,iBAAiB,EAAE,CAAC;CAC3B;AAuDD,wBAAsB,QAAQ,CAAC,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,CAmBnF"}
|
package/dist/commands/stats.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats stats` — emit weekly aggregations as JSON or as a compact
|
|
3
|
-
* ASCII table.
|
|
4
|
-
*/
|
|
5
|
-
import { aggregateWeekly, collect, } from '@sentropic/agent-stats-core';
|
|
6
|
-
function parseDate(value, label) {
|
|
7
|
-
if (!value)
|
|
8
|
-
return undefined;
|
|
9
|
-
const d = new Date(value);
|
|
10
|
-
if (Number.isNaN(d.getTime())) {
|
|
11
|
-
throw new Error(`Invalid --${label} value: ${value} (expected ISO 8601)`);
|
|
12
|
-
}
|
|
13
|
-
return d;
|
|
14
|
-
}
|
|
15
|
-
function renderTable(rows) {
|
|
16
|
-
if (rows.length === 0)
|
|
17
|
-
return '(no data)';
|
|
18
|
-
const headers = [
|
|
19
|
-
'week',
|
|
20
|
-
'tool',
|
|
21
|
-
'project',
|
|
22
|
-
'model',
|
|
23
|
-
'sess',
|
|
24
|
-
'turns',
|
|
25
|
-
'in',
|
|
26
|
-
'cached',
|
|
27
|
-
'out',
|
|
28
|
-
'cost',
|
|
29
|
-
];
|
|
30
|
-
const lines = [headers];
|
|
31
|
-
for (const r of rows) {
|
|
32
|
-
const cost = r.estimatedCost.codexCredits > 0
|
|
33
|
-
? `${r.estimatedCost.codexCredits.toFixed(1)} cr`
|
|
34
|
-
: r.estimatedCost.claudeUsdCents > 0
|
|
35
|
-
? `$${(r.estimatedCost.claudeUsdCents / 100).toFixed(2)}`
|
|
36
|
-
: '-';
|
|
37
|
-
lines.push([
|
|
38
|
-
r.weekStart,
|
|
39
|
-
r.tool,
|
|
40
|
-
r.projectCwd,
|
|
41
|
-
r.model,
|
|
42
|
-
String(r.sessions),
|
|
43
|
-
String(r.turns),
|
|
44
|
-
String(r.totalUsage.newInputTokens),
|
|
45
|
-
String(r.totalUsage.cachedInputTokens),
|
|
46
|
-
String(r.totalUsage.outputTokens),
|
|
47
|
-
cost,
|
|
48
|
-
]);
|
|
49
|
-
}
|
|
50
|
-
// compute column widths
|
|
51
|
-
const widths = headers.map((_, i) => Math.max(...lines.map((l) => (l[i] ?? '').length)));
|
|
52
|
-
const fmt = (l) => l.map((c, i) => (i === 2 ? c.padEnd(widths[i] ?? 0) : c.padStart(widths[i] ?? 0))).join(' ');
|
|
53
|
-
const out = [fmt(lines[0] ?? []), widths.map((w) => '-'.repeat(w)).join(' ')];
|
|
54
|
-
for (let i = 1; i < lines.length; i++)
|
|
55
|
-
out.push(fmt(lines[i] ?? []));
|
|
56
|
-
return out.join('\n');
|
|
57
|
-
}
|
|
58
|
-
export async function runStats(opts = {}) {
|
|
59
|
-
const collectOpts = {};
|
|
60
|
-
const since = parseDate(opts.since, 'since');
|
|
61
|
-
const until = parseDate(opts.until, 'until');
|
|
62
|
-
if (since !== undefined)
|
|
63
|
-
collectOpts.since = since;
|
|
64
|
-
if (until !== undefined)
|
|
65
|
-
collectOpts.until = until;
|
|
66
|
-
if (opts.project !== undefined)
|
|
67
|
-
collectOpts.projectCwd = opts.project;
|
|
68
|
-
if (opts.claudeProjectsDir !== undefined)
|
|
69
|
-
collectOpts.claudeProjectsDir = opts.claudeProjectsDir;
|
|
70
|
-
if (opts.codexDbPath !== undefined)
|
|
71
|
-
collectOpts.codexDbPath = opts.codexDbPath;
|
|
72
|
-
if (opts.tool) {
|
|
73
|
-
collectOpts.sources = {
|
|
74
|
-
claude: opts.tool === 'claude',
|
|
75
|
-
codex: opts.tool === 'codex',
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
const rows = await aggregateWeekly(collect(collectOpts));
|
|
79
|
-
const format = opts.format ?? 'json';
|
|
80
|
-
const output = format === 'table' ? renderTable(rows) : JSON.stringify(rows, null, 2);
|
|
81
|
-
return { output, rows };
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=stats.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/web.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats web` — start a tiny local HTTP server that serves the
|
|
3
|
-
* static SvelteKit build (from `@sentropic/agent-stats-web`) and exposes
|
|
4
|
-
* `/api/stats` + `/api/anomalies` JSON endpoints backed by `runStats` /
|
|
5
|
-
* `runAnomalies`.
|
|
6
|
-
*
|
|
7
|
-
* Only depends on `node:http`, `node:fs/promises` and `node:path` — no
|
|
8
|
-
* extra HTTP framework.
|
|
9
|
-
*/
|
|
10
|
-
export interface WebCommandOptions {
|
|
11
|
-
port?: number;
|
|
12
|
-
/** Override the static build dir; defaults to ../web/build relative to the CLI dist. */
|
|
13
|
-
webDir?: string;
|
|
14
|
-
/** Override the Claude projects dir (for tests and isolated runs). */
|
|
15
|
-
claudeProjectsDir?: string;
|
|
16
|
-
/** Override the Codex sqlite index path. */
|
|
17
|
-
codexDbPath?: string;
|
|
18
|
-
}
|
|
19
|
-
export interface StartedWebServer {
|
|
20
|
-
port: number;
|
|
21
|
-
url: string;
|
|
22
|
-
close(): Promise<void>;
|
|
23
|
-
}
|
|
24
|
-
export declare function startWebServer(opts?: WebCommandOptions): Promise<StartedWebServer>;
|
|
25
|
-
export declare function runWeb(opts?: WebCommandOptions): Promise<StartedWebServer>;
|
|
26
|
-
//# sourceMappingURL=web.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA6GD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,cAAc,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8B5F;AAED,wBAAsB,MAAM,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAIpF"}
|
package/dist/commands/web.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `agent-stats web` — start a tiny local HTTP server that serves the
|
|
3
|
-
* static SvelteKit build (from `@sentropic/agent-stats-web`) and exposes
|
|
4
|
-
* `/api/stats` + `/api/anomalies` JSON endpoints backed by `runStats` /
|
|
5
|
-
* `runAnomalies`.
|
|
6
|
-
*
|
|
7
|
-
* Only depends on `node:http`, `node:fs/promises` and `node:path` — no
|
|
8
|
-
* extra HTTP framework.
|
|
9
|
-
*/
|
|
10
|
-
import { createServer } from 'node:http';
|
|
11
|
-
import { readFile, stat } from 'node:fs/promises';
|
|
12
|
-
import path from 'node:path';
|
|
13
|
-
import { fileURLToPath } from 'node:url';
|
|
14
|
-
import { runStats } from './stats.js';
|
|
15
|
-
import { runAnomalies } from './anomalies.js';
|
|
16
|
-
const MIME_TYPES = {
|
|
17
|
-
'.html': 'text/html; charset=utf-8',
|
|
18
|
-
'.js': 'application/javascript; charset=utf-8',
|
|
19
|
-
'.mjs': 'application/javascript; charset=utf-8',
|
|
20
|
-
'.css': 'text/css; charset=utf-8',
|
|
21
|
-
'.json': 'application/json; charset=utf-8',
|
|
22
|
-
'.svg': 'image/svg+xml',
|
|
23
|
-
'.png': 'image/png',
|
|
24
|
-
'.jpg': 'image/jpeg',
|
|
25
|
-
'.ico': 'image/x-icon',
|
|
26
|
-
'.woff2': 'font/woff2',
|
|
27
|
-
'.txt': 'text/plain; charset=utf-8',
|
|
28
|
-
};
|
|
29
|
-
function resolveDefaultWebDir() {
|
|
30
|
-
// packages/cli/dist/commands/web.js → packages/web/build
|
|
31
|
-
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
32
|
-
return path.resolve(here, '..', '..', '..', 'web', 'build');
|
|
33
|
-
}
|
|
34
|
-
function sendJson(res, status, body) {
|
|
35
|
-
res.statusCode = status;
|
|
36
|
-
res.setHeader('content-type', 'application/json; charset=utf-8');
|
|
37
|
-
res.setHeader('cache-control', 'no-store');
|
|
38
|
-
res.end(JSON.stringify(body));
|
|
39
|
-
}
|
|
40
|
-
function sendText(res, status, body) {
|
|
41
|
-
res.statusCode = status;
|
|
42
|
-
res.setHeader('content-type', 'text/plain; charset=utf-8');
|
|
43
|
-
res.end(body);
|
|
44
|
-
}
|
|
45
|
-
async function serveStaticFile(res, webDir, urlPath) {
|
|
46
|
-
// Strip query string and normalize.
|
|
47
|
-
let p = urlPath.split('?', 1)[0] ?? '/';
|
|
48
|
-
if (p === '/')
|
|
49
|
-
p = '/index.html';
|
|
50
|
-
// Prevent path traversal.
|
|
51
|
-
const resolved = path.normalize(path.join(webDir, p));
|
|
52
|
-
if (!resolved.startsWith(webDir)) {
|
|
53
|
-
sendText(res, 403, 'Forbidden');
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
try {
|
|
57
|
-
const s = await stat(resolved);
|
|
58
|
-
if (s.isDirectory()) {
|
|
59
|
-
return serveStaticFile(res, webDir, `${urlPath.replace(/\/$/, '')}/index.html`);
|
|
60
|
-
}
|
|
61
|
-
const content = await readFile(resolved);
|
|
62
|
-
const ext = path.extname(resolved).toLowerCase();
|
|
63
|
-
res.statusCode = 200;
|
|
64
|
-
res.setHeader('content-type', MIME_TYPES[ext] ?? 'application/octet-stream');
|
|
65
|
-
res.end(content);
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
// Fallback to SPA index.html for client-side routes.
|
|
69
|
-
try {
|
|
70
|
-
const fallback = path.join(webDir, 'index.html');
|
|
71
|
-
const content = await readFile(fallback);
|
|
72
|
-
res.statusCode = 200;
|
|
73
|
-
res.setHeader('content-type', MIME_TYPES['.html']);
|
|
74
|
-
res.end(content);
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
sendText(res, 404, 'Not Found');
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function makeHandleApi(defaults) {
|
|
82
|
-
return async (req, res) => {
|
|
83
|
-
const url = new URL(req.url ?? '/', 'http://localhost');
|
|
84
|
-
const since = url.searchParams.get('since') ?? undefined;
|
|
85
|
-
const until = url.searchParams.get('until') ?? undefined;
|
|
86
|
-
const tool = (url.searchParams.get('tool') ?? undefined);
|
|
87
|
-
const project = url.searchParams.get('project') ?? undefined;
|
|
88
|
-
const common = {
|
|
89
|
-
...(since ? { since } : {}),
|
|
90
|
-
...(until ? { until } : {}),
|
|
91
|
-
...(tool ? { tool } : {}),
|
|
92
|
-
...(project ? { project } : {}),
|
|
93
|
-
...(defaults.claudeProjectsDir ? { claudeProjectsDir: defaults.claudeProjectsDir } : {}),
|
|
94
|
-
...(defaults.codexDbPath ? { codexDbPath: defaults.codexDbPath } : {}),
|
|
95
|
-
};
|
|
96
|
-
try {
|
|
97
|
-
if (url.pathname === '/api/stats') {
|
|
98
|
-
const r = await runStats(common);
|
|
99
|
-
sendJson(res, 200, r.rows);
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
if (url.pathname === '/api/anomalies') {
|
|
103
|
-
const r = await runAnomalies(common);
|
|
104
|
-
sendJson(res, 200, r.anomalies);
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
sendJson(res, 404, { error: 'unknown api route' });
|
|
108
|
-
}
|
|
109
|
-
catch (e) {
|
|
110
|
-
sendJson(res, 500, { error: e instanceof Error ? e.message : String(e) });
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
export async function startWebServer(opts = {}) {
|
|
115
|
-
const port = opts.port ?? 4173;
|
|
116
|
-
const webDir = opts.webDir ?? resolveDefaultWebDir();
|
|
117
|
-
const handleApi = makeHandleApi({
|
|
118
|
-
...(opts.claudeProjectsDir ? { claudeProjectsDir: opts.claudeProjectsDir } : {}),
|
|
119
|
-
...(opts.codexDbPath ? { codexDbPath: opts.codexDbPath } : {}),
|
|
120
|
-
});
|
|
121
|
-
const server = createServer((req, res) => {
|
|
122
|
-
const url = req.url ?? '/';
|
|
123
|
-
if (url.startsWith('/api/')) {
|
|
124
|
-
void handleApi(req, res);
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
void serveStaticFile(res, webDir, url);
|
|
128
|
-
});
|
|
129
|
-
await new Promise((resolve, reject) => {
|
|
130
|
-
const onError = (err) => reject(err);
|
|
131
|
-
server.once('error', onError);
|
|
132
|
-
server.listen(port, '127.0.0.1', () => {
|
|
133
|
-
server.off('error', onError);
|
|
134
|
-
resolve();
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
const addr = server.address();
|
|
138
|
-
const actualPort = typeof addr === 'object' && addr !== null ? addr.port : port;
|
|
139
|
-
return {
|
|
140
|
-
port: actualPort,
|
|
141
|
-
url: `http://127.0.0.1:${actualPort}/`,
|
|
142
|
-
close: () => new Promise((r) => server.close(() => r())),
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
export async function runWeb(opts = {}) {
|
|
146
|
-
const s = await startWebServer(opts);
|
|
147
|
-
process.stdout.write(`agent-stats web running at ${s.url}\nPress Ctrl-C to stop.\n`);
|
|
148
|
-
return s;
|
|
149
|
-
}
|
|
150
|
-
//# sourceMappingURL=web.js.map
|
package/dist/commands/web.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @sentropic/agent-stats — CLI library entry.
|
|
3
|
-
* The binary lives in ./cli.ts. WP4 wires the `stats` and `report`
|
|
4
|
-
* subcommands; WP5+ will add the rest.
|
|
5
|
-
*/
|
|
6
|
-
export { VERSION } from '@sentropic/agent-stats-core';
|
|
7
|
-
export { runStats, type StatsCommandOptions, type StatsResult } from './commands/stats.js';
|
|
8
|
-
export { runReport, type ReportCommandOptions, type ReportResult } from './commands/report.js';
|
|
9
|
-
export { runClean, type CleanCommandOptions, type CleanCommandResult } from './commands/clean.js';
|
|
10
|
-
export { runAnomalies, type AnomaliesCommandOptions, type AnomaliesResult, } from './commands/anomalies.js';
|
|
11
|
-
export { runWeb, startWebServer, type WebCommandOptions, type StartedWebServer, } from './commands/web.js';
|
|
12
|
-
export { runAnalyze, type AnalyzeCommandOptions, type AnalyzeResult } from './commands/analyze.js';
|
|
13
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAE,KAAK,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,YAAY,EACZ,KAAK,uBAAuB,EAC5B,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,MAAM,EACN,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,KAAK,qBAAqB,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @sentropic/agent-stats — CLI library entry.
|
|
3
|
-
* The binary lives in ./cli.ts. WP4 wires the `stats` and `report`
|
|
4
|
-
* subcommands; WP5+ will add the rest.
|
|
5
|
-
*/
|
|
6
|
-
export { VERSION } from '@sentropic/agent-stats-core';
|
|
7
|
-
export { runStats } from './commands/stats.js';
|
|
8
|
-
export { runReport } from './commands/report.js';
|
|
9
|
-
export { runClean } from './commands/clean.js';
|
|
10
|
-
export { runAnomalies, } from './commands/anomalies.js';
|
|
11
|
-
export { runWeb, startWebServer, } from './commands/web.js';
|
|
12
|
-
export { runAnalyze } from './commands/analyze.js';
|
|
13
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAA8C,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,SAAS,EAAgD,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAqD,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,YAAY,GAGb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,MAAM,EACN,cAAc,GAGf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAkD,MAAM,uBAAuB,CAAC"}
|