@agentlensai/cli 0.2.0 → 0.5.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/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +43 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/context.d.ts +2 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +105 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/events.d.ts +2 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +58 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/lessons.d.ts +2 -0
- package/dist/commands/lessons.d.ts.map +1 -0
- package/dist/commands/lessons.js +373 -0
- package/dist/commands/lessons.js.map +1 -0
- package/dist/commands/llm.d.ts +2 -0
- package/dist/commands/llm.d.ts.map +1 -0
- package/dist/commands/llm.js +226 -0
- package/dist/commands/llm.js.map +1 -0
- package/dist/commands/recall.d.ts +2 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +84 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/reflect.d.ts +2 -0
- package/dist/commands/reflect.d.ts.map +1 -0
- package/dist/commands/reflect.js +210 -0
- package/dist/commands/reflect.js.map +1 -0
- package/dist/commands/sessions.d.ts +2 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +120 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/tail.d.ts +2 -0
- package/dist/commands/tail.d.ts.map +1 -0
- package/dist/commands/tail.js +151 -0
- package/dist/commands/tail.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +104 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +8 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +15 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +17 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +39 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +24 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +69 -0
- package/dist/lib/output.js.map +1 -0
- package/package.json +5 -5
- package/LICENSE +0 -21
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens llm — LLM call tracking stats, model breakdown, and recent calls
|
|
3
|
+
*/
|
|
4
|
+
import { parseArgs } from 'node:util';
|
|
5
|
+
import { createClientFromConfig } from '../lib/client.js';
|
|
6
|
+
import { printTable, printJson, formatTimestamp, truncate } from '../lib/output.js';
|
|
7
|
+
const HELP = `Usage: agentlens llm <subcommand> [options]
|
|
8
|
+
|
|
9
|
+
Subcommands:
|
|
10
|
+
stats Show LLM usage summary
|
|
11
|
+
models List models with cost breakdown
|
|
12
|
+
recent Show recent LLM calls
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
--from <date> Start date (ISO 8601)
|
|
16
|
+
--to <date> End date (ISO 8601)
|
|
17
|
+
--agent <id> Filter by agent ID
|
|
18
|
+
--model <name> Filter by model name
|
|
19
|
+
--url <url> Server URL (overrides config)
|
|
20
|
+
-j, --json Output raw JSON
|
|
21
|
+
-h, --help Show help`;
|
|
22
|
+
export async function runLlmCommand(argv) {
|
|
23
|
+
const subcommand = argv[0];
|
|
24
|
+
const rest = argv.slice(1);
|
|
25
|
+
switch (subcommand) {
|
|
26
|
+
case 'stats':
|
|
27
|
+
await runLlmStats(rest);
|
|
28
|
+
break;
|
|
29
|
+
case 'models':
|
|
30
|
+
await runLlmModels(rest);
|
|
31
|
+
break;
|
|
32
|
+
case 'recent':
|
|
33
|
+
await runLlmRecent(rest);
|
|
34
|
+
break;
|
|
35
|
+
case '--help':
|
|
36
|
+
case '-h':
|
|
37
|
+
case undefined:
|
|
38
|
+
console.log(HELP);
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
console.error(`Unknown llm subcommand: ${subcommand}`);
|
|
42
|
+
console.log(HELP);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function parseLlmArgs(argv) {
|
|
47
|
+
return parseArgs({
|
|
48
|
+
args: argv,
|
|
49
|
+
options: {
|
|
50
|
+
from: { type: 'string' },
|
|
51
|
+
to: { type: 'string' },
|
|
52
|
+
agent: { type: 'string', short: 'a' },
|
|
53
|
+
model: { type: 'string', short: 'm' },
|
|
54
|
+
url: { type: 'string' },
|
|
55
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
56
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
57
|
+
},
|
|
58
|
+
allowPositionals: false,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function formatCost(usd) {
|
|
62
|
+
return `$${usd.toFixed(4)}`;
|
|
63
|
+
}
|
|
64
|
+
function formatNumber(n) {
|
|
65
|
+
return n.toLocaleString('en-US');
|
|
66
|
+
}
|
|
67
|
+
function formatLatency(ms) {
|
|
68
|
+
return `${formatNumber(Math.round(ms))}ms`;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* agentlens llm stats — show LLM usage summary
|
|
72
|
+
*/
|
|
73
|
+
async function runLlmStats(argv) {
|
|
74
|
+
const { values } = parseLlmArgs(argv);
|
|
75
|
+
if (values.help) {
|
|
76
|
+
console.log(`Usage: agentlens llm stats [options]
|
|
77
|
+
|
|
78
|
+
Show overall LLM usage summary: total calls, cost, tokens, and latency.
|
|
79
|
+
|
|
80
|
+
Options:
|
|
81
|
+
--from <date> Start date (ISO 8601)
|
|
82
|
+
--to <date> End date (ISO 8601)
|
|
83
|
+
--agent <id> Filter by agent ID
|
|
84
|
+
--model <name> Filter by model name
|
|
85
|
+
--url <url> Server URL (overrides config)
|
|
86
|
+
-j, --json Output raw JSON
|
|
87
|
+
-h, --help Show help`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const client = createClientFromConfig(values.url);
|
|
91
|
+
const analytics = await client.getLlmAnalytics({
|
|
92
|
+
from: values.from ?? undefined,
|
|
93
|
+
to: values.to ?? undefined,
|
|
94
|
+
agentId: values.agent ?? undefined,
|
|
95
|
+
model: values.model ?? undefined,
|
|
96
|
+
});
|
|
97
|
+
if (values.json) {
|
|
98
|
+
printJson(analytics.summary);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const s = analytics.summary;
|
|
102
|
+
const totalTokens = s.totalInputTokens + s.totalOutputTokens;
|
|
103
|
+
console.log('');
|
|
104
|
+
console.log('LLM Usage Summary');
|
|
105
|
+
console.log(` Total Calls: ${formatNumber(s.totalCalls)}`);
|
|
106
|
+
console.log(` Total Cost: ${formatCost(s.totalCostUsd)}`);
|
|
107
|
+
console.log(` Total Tokens: ${formatNumber(totalTokens)} (${formatNumber(s.totalInputTokens)} in / ${formatNumber(s.totalOutputTokens)} out)`);
|
|
108
|
+
console.log(` Avg Latency: ${formatLatency(s.avgLatencyMs)}`);
|
|
109
|
+
console.log(` Avg Cost/Call: ${formatCost(s.avgCostPerCall)}`);
|
|
110
|
+
console.log('');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* agentlens llm models — list models with cost breakdown
|
|
114
|
+
*/
|
|
115
|
+
async function runLlmModels(argv) {
|
|
116
|
+
const { values } = parseLlmArgs(argv);
|
|
117
|
+
if (values.help) {
|
|
118
|
+
console.log(`Usage: agentlens llm models [options]
|
|
119
|
+
|
|
120
|
+
List models used with cost breakdown.
|
|
121
|
+
|
|
122
|
+
Options:
|
|
123
|
+
--from <date> Start date (ISO 8601)
|
|
124
|
+
--to <date> End date (ISO 8601)
|
|
125
|
+
--agent <id> Filter by agent ID
|
|
126
|
+
--model <name> Filter by model name
|
|
127
|
+
--url <url> Server URL (overrides config)
|
|
128
|
+
-j, --json Output raw JSON
|
|
129
|
+
-h, --help Show help`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const client = createClientFromConfig(values.url);
|
|
133
|
+
const analytics = await client.getLlmAnalytics({
|
|
134
|
+
from: values.from ?? undefined,
|
|
135
|
+
to: values.to ?? undefined,
|
|
136
|
+
agentId: values.agent ?? undefined,
|
|
137
|
+
model: values.model ?? undefined,
|
|
138
|
+
});
|
|
139
|
+
if (values.json) {
|
|
140
|
+
printJson(analytics.byModel);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (analytics.byModel.length === 0) {
|
|
144
|
+
console.log('No LLM calls found.');
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const headers = ['Provider', 'Model', 'Calls', 'Tokens', 'Cost', 'Avg Latency'];
|
|
148
|
+
const rows = analytics.byModel.map((m) => [
|
|
149
|
+
m.provider,
|
|
150
|
+
truncate(m.model, 28),
|
|
151
|
+
formatNumber(m.calls),
|
|
152
|
+
formatNumber(m.inputTokens + m.outputTokens),
|
|
153
|
+
formatCost(m.costUsd),
|
|
154
|
+
formatLatency(m.avgLatencyMs),
|
|
155
|
+
]);
|
|
156
|
+
printTable(headers, rows);
|
|
157
|
+
console.log(`\n${analytics.byModel.length} model(s).`);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* agentlens llm recent — show recent LLM calls
|
|
161
|
+
*/
|
|
162
|
+
async function runLlmRecent(argv) {
|
|
163
|
+
const { values } = parseLlmArgs(argv);
|
|
164
|
+
if (values.help) {
|
|
165
|
+
console.log(`Usage: agentlens llm recent [options]
|
|
166
|
+
|
|
167
|
+
Show recent LLM calls with latency and cost.
|
|
168
|
+
|
|
169
|
+
Options:
|
|
170
|
+
--from <date> Start date (ISO 8601)
|
|
171
|
+
--to <date> End date (ISO 8601)
|
|
172
|
+
--agent <id> Filter by agent ID
|
|
173
|
+
--model <name> Filter by model name
|
|
174
|
+
--url <url> Server URL (overrides config)
|
|
175
|
+
-j, --json Output raw JSON
|
|
176
|
+
-h, --help Show help`);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const client = createClientFromConfig(values.url);
|
|
180
|
+
// Query recent llm_response events (they carry all the metrics)
|
|
181
|
+
const result = await client.queryEvents({
|
|
182
|
+
eventType: 'llm_response',
|
|
183
|
+
from: values.from ?? undefined,
|
|
184
|
+
to: values.to ?? undefined,
|
|
185
|
+
agentId: values.agent ?? undefined,
|
|
186
|
+
limit: 10,
|
|
187
|
+
order: 'desc',
|
|
188
|
+
});
|
|
189
|
+
if (values.json) {
|
|
190
|
+
printJson(result);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (result.events.length === 0) {
|
|
194
|
+
console.log('No recent LLM calls found.');
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Filter by model if specified (server may not support model filter on events query)
|
|
198
|
+
let events = result.events;
|
|
199
|
+
if (values.model) {
|
|
200
|
+
events = events.filter((e) => {
|
|
201
|
+
const p = e.payload;
|
|
202
|
+
return p['model'] === values.model;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
const headers = ['Timestamp', 'Model', 'Tokens', 'Cost', 'Latency', 'Finish'];
|
|
206
|
+
const rows = events.map((e) => {
|
|
207
|
+
const p = e.payload;
|
|
208
|
+
const usage = p['usage'];
|
|
209
|
+
const totalTokens = usage?.['totalTokens'] ?? 0;
|
|
210
|
+
const costUsd = p['costUsd'] ?? 0;
|
|
211
|
+
const latencyMs = p['latencyMs'] ?? 0;
|
|
212
|
+
const model = String(p['model'] ?? 'unknown');
|
|
213
|
+
const finishReason = String(p['finishReason'] ?? '');
|
|
214
|
+
return [
|
|
215
|
+
formatTimestamp(e.timestamp),
|
|
216
|
+
truncate(model, 24),
|
|
217
|
+
formatNumber(totalTokens),
|
|
218
|
+
formatCost(costUsd),
|
|
219
|
+
formatLatency(latencyMs),
|
|
220
|
+
finishReason,
|
|
221
|
+
];
|
|
222
|
+
});
|
|
223
|
+
printTable(headers, rows);
|
|
224
|
+
console.log(`\nShowing ${events.length} of ${result.total} LLM calls.`);
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/commands/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/commands/recall.ts"],"names":[],"mappings":"AA+BA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DpE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens recall — Semantic search over agent memory
|
|
3
|
+
*/
|
|
4
|
+
import { parseArgs } from 'node:util';
|
|
5
|
+
import { createClientFromConfig } from '../lib/client.js';
|
|
6
|
+
import { printTable, printJson, truncate } from '../lib/output.js';
|
|
7
|
+
const HELP = `Usage: agentlens recall <query> [options]
|
|
8
|
+
|
|
9
|
+
Semantic search over agent memory — find past events, sessions, and lessons by meaning.
|
|
10
|
+
|
|
11
|
+
Arguments:
|
|
12
|
+
query Natural language search query
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
--scope <scope> Search scope: all|events|sessions|lessons (default: all)
|
|
16
|
+
--limit <n> Maximum results (default: 10)
|
|
17
|
+
--from <date> Start date (ISO 8601)
|
|
18
|
+
--to <date> End date (ISO 8601)
|
|
19
|
+
--agent <id> Filter by agent ID
|
|
20
|
+
--min-score <n> Minimum similarity score 0-1 (default: 0)
|
|
21
|
+
--url <url> Server URL (overrides config)
|
|
22
|
+
-j, --json Output raw JSON
|
|
23
|
+
-h, --help Show help
|
|
24
|
+
|
|
25
|
+
Examples:
|
|
26
|
+
agentlens recall "authentication errors"
|
|
27
|
+
agentlens recall "deployment failures" --scope events --limit 20
|
|
28
|
+
agentlens recall "user onboarding" --from 2026-01-01 --to 2026-02-01
|
|
29
|
+
agentlens recall "auth" --json`;
|
|
30
|
+
export async function runRecallCommand(argv) {
|
|
31
|
+
const { values, positionals } = parseArgs({
|
|
32
|
+
args: argv,
|
|
33
|
+
options: {
|
|
34
|
+
scope: { type: 'string' },
|
|
35
|
+
limit: { type: 'string', short: 'l' },
|
|
36
|
+
from: { type: 'string' },
|
|
37
|
+
to: { type: 'string' },
|
|
38
|
+
agent: { type: 'string', short: 'a' },
|
|
39
|
+
'min-score': { type: 'string' },
|
|
40
|
+
url: { type: 'string' },
|
|
41
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
42
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
43
|
+
},
|
|
44
|
+
allowPositionals: true,
|
|
45
|
+
});
|
|
46
|
+
if (values.help) {
|
|
47
|
+
console.log(HELP);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const query = positionals[0];
|
|
51
|
+
if (!query) {
|
|
52
|
+
console.error('Error: Query argument is required.\n');
|
|
53
|
+
console.log(HELP);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
const client = createClientFromConfig(values.url);
|
|
57
|
+
const result = await client.recall({
|
|
58
|
+
query,
|
|
59
|
+
scope: values.scope,
|
|
60
|
+
agentId: values.agent ?? undefined,
|
|
61
|
+
from: values.from ?? undefined,
|
|
62
|
+
to: values.to ?? undefined,
|
|
63
|
+
limit: values.limit ? parseInt(values.limit, 10) : undefined,
|
|
64
|
+
minScore: values['min-score'] ? parseFloat(values['min-score']) : undefined,
|
|
65
|
+
});
|
|
66
|
+
if (values.json) {
|
|
67
|
+
printJson(result);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (result.results.length === 0) {
|
|
71
|
+
console.log(`No results found for "${query}".`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const headers = ['#', 'Source', 'Score', 'Text'];
|
|
75
|
+
const rows = result.results.map((r, i) => [
|
|
76
|
+
String(i + 1),
|
|
77
|
+
r.sourceType,
|
|
78
|
+
`${(r.score * 100).toFixed(1)}%`,
|
|
79
|
+
truncate(r.text.replace(/\n/g, ' '), 80),
|
|
80
|
+
]);
|
|
81
|
+
printTable(headers, rows);
|
|
82
|
+
console.log(`\n${result.totalResults} result(s) for "${query}".`);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/commands/recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.d.ts","sourceRoot":"","sources":["../../src/commands/reflect.ts"],"names":[],"mappings":"AAkCA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DrE"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens reflect — Pattern analysis across agent sessions
|
|
3
|
+
*/
|
|
4
|
+
import { parseArgs } from 'node:util';
|
|
5
|
+
import { createClientFromConfig } from '../lib/client.js';
|
|
6
|
+
import { printTable, printJson, formatTimestamp, truncate } from '../lib/output.js';
|
|
7
|
+
const ANALYSIS_TYPES = ['error_patterns', 'cost_analysis', 'tool_sequences', 'performance_trends'];
|
|
8
|
+
const HELP = `Usage: agentlens reflect <analysis_type> [options]
|
|
9
|
+
|
|
10
|
+
Analyze behavioral patterns from agent sessions.
|
|
11
|
+
|
|
12
|
+
Analysis Types:
|
|
13
|
+
error_patterns Recurring error patterns across sessions
|
|
14
|
+
cost_analysis Cost breakdown and trends by model/agent
|
|
15
|
+
tool_sequences Common tool usage patterns and error rates
|
|
16
|
+
performance_trends Success rate and duration trends over time
|
|
17
|
+
|
|
18
|
+
Options:
|
|
19
|
+
--agent <id> Filter by agent ID
|
|
20
|
+
--from <date> Start date (ISO 8601)
|
|
21
|
+
--to <date> End date (ISO 8601)
|
|
22
|
+
--limit <n> Maximum results (default: 20)
|
|
23
|
+
--url <url> Server URL (overrides config)
|
|
24
|
+
-j, --json Output raw JSON
|
|
25
|
+
-h, --help Show help
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
agentlens reflect error_patterns
|
|
29
|
+
agentlens reflect cost_analysis --agent my-agent --from 2026-01-01
|
|
30
|
+
agentlens reflect tool_sequences --limit 20
|
|
31
|
+
agentlens reflect performance_trends`;
|
|
32
|
+
export async function runReflectCommand(argv) {
|
|
33
|
+
const { values, positionals } = parseArgs({
|
|
34
|
+
args: argv,
|
|
35
|
+
options: {
|
|
36
|
+
agent: { type: 'string', short: 'a' },
|
|
37
|
+
from: { type: 'string' },
|
|
38
|
+
to: { type: 'string' },
|
|
39
|
+
limit: { type: 'string', short: 'l' },
|
|
40
|
+
url: { type: 'string' },
|
|
41
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
42
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
43
|
+
},
|
|
44
|
+
allowPositionals: true,
|
|
45
|
+
});
|
|
46
|
+
if (values.help || positionals.length === 0) {
|
|
47
|
+
console.log(HELP);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const analysis = positionals[0];
|
|
51
|
+
if (!ANALYSIS_TYPES.includes(analysis)) {
|
|
52
|
+
console.error(`Unknown analysis type: ${analysis}`);
|
|
53
|
+
console.error(`Valid types: ${ANALYSIS_TYPES.join(', ')}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
const client = createClientFromConfig(values.url);
|
|
57
|
+
const result = await client.reflect({
|
|
58
|
+
analysis,
|
|
59
|
+
agentId: values.agent ?? undefined,
|
|
60
|
+
from: values.from ?? undefined,
|
|
61
|
+
to: values.to ?? undefined,
|
|
62
|
+
limit: values.limit ? parseInt(values.limit, 10) : undefined,
|
|
63
|
+
});
|
|
64
|
+
if (values.json) {
|
|
65
|
+
printJson(result);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Dispatch to per-analysis-type formatter
|
|
69
|
+
switch (analysis) {
|
|
70
|
+
case 'error_patterns':
|
|
71
|
+
formatErrorPatterns(result);
|
|
72
|
+
break;
|
|
73
|
+
case 'cost_analysis':
|
|
74
|
+
formatCostAnalysis(result);
|
|
75
|
+
break;
|
|
76
|
+
case 'tool_sequences':
|
|
77
|
+
formatToolSequences(result);
|
|
78
|
+
break;
|
|
79
|
+
case 'performance_trends':
|
|
80
|
+
formatPerformanceTrends(result);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
// Always show metadata
|
|
84
|
+
const m = result.metadata;
|
|
85
|
+
console.log(`\nAnalyzed ${m.sessionsAnalyzed} session(s), ${m.eventsAnalyzed} event(s).`);
|
|
86
|
+
console.log(`Time range: ${m.timeRange.from} → ${m.timeRange.to}`);
|
|
87
|
+
}
|
|
88
|
+
function formatErrorPatterns(result) {
|
|
89
|
+
console.log('\nError Patterns\n');
|
|
90
|
+
if (result.insights.length === 0) {
|
|
91
|
+
console.log('No error patterns found.');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const headers = ['Pattern', 'Count', 'First Seen', 'Last Seen'];
|
|
95
|
+
const rows = result.insights.map((insight) => {
|
|
96
|
+
const d = insight.data;
|
|
97
|
+
return [
|
|
98
|
+
truncate(insight.summary, 50),
|
|
99
|
+
String(d.count ?? ''),
|
|
100
|
+
d.firstSeen ? formatTimestamp(String(d.firstSeen)) : '',
|
|
101
|
+
d.lastSeen ? formatTimestamp(String(d.lastSeen)) : '',
|
|
102
|
+
];
|
|
103
|
+
});
|
|
104
|
+
printTable(headers, rows);
|
|
105
|
+
}
|
|
106
|
+
function formatCostAnalysis(result) {
|
|
107
|
+
console.log('\nCost Analysis\n');
|
|
108
|
+
if (result.insights.length === 0) {
|
|
109
|
+
console.log('No cost data found.');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Look for summary insight
|
|
113
|
+
const summaryInsight = result.insights.find((i) => i.type === 'summary' || i.type === 'cost_summary');
|
|
114
|
+
if (summaryInsight) {
|
|
115
|
+
const d = summaryInsight.data;
|
|
116
|
+
console.log(` Total Cost: $${Number(d.totalCost ?? 0).toFixed(4)}`);
|
|
117
|
+
console.log(` Avg/Session: $${Number(d.avgPerSession ?? 0).toFixed(4)}`);
|
|
118
|
+
console.log(` Total Sessions: ${d.totalSessions ?? ''}`);
|
|
119
|
+
console.log('');
|
|
120
|
+
}
|
|
121
|
+
// Look for model breakdown insights
|
|
122
|
+
const modelInsights = result.insights.filter((i) => i.type === 'model_breakdown' || i.type === 'by_model');
|
|
123
|
+
if (modelInsights.length > 0) {
|
|
124
|
+
console.log('Model Breakdown:');
|
|
125
|
+
const headers = ['Model', 'Calls', 'Cost', 'Avg/Call'];
|
|
126
|
+
const rows = modelInsights.map((insight) => {
|
|
127
|
+
const d = insight.data;
|
|
128
|
+
return [
|
|
129
|
+
truncate(String(d.model ?? insight.summary), 30),
|
|
130
|
+
String(d.callCount ?? d.calls ?? ''),
|
|
131
|
+
`$${Number(d.totalCost ?? d.costUsd ?? 0).toFixed(4)}`,
|
|
132
|
+
`$${Number(d.avgCostPerCall ?? 0).toFixed(4)}`,
|
|
133
|
+
];
|
|
134
|
+
});
|
|
135
|
+
printTable(headers, rows);
|
|
136
|
+
}
|
|
137
|
+
// If no structured data, show general insights
|
|
138
|
+
if (!summaryInsight && modelInsights.length === 0) {
|
|
139
|
+
for (const insight of result.insights) {
|
|
140
|
+
console.log(` [${insight.type}] ${insight.summary}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function formatToolSequences(result) {
|
|
145
|
+
console.log('\nTool Sequences\n');
|
|
146
|
+
if (result.insights.length === 0) {
|
|
147
|
+
console.log('No tool sequence patterns found.');
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const headers = ['Sequence', 'Frequency', 'Sessions', 'Error Rate'];
|
|
151
|
+
const rows = result.insights.map((insight) => {
|
|
152
|
+
const d = insight.data;
|
|
153
|
+
const tools = d.tools;
|
|
154
|
+
const seq = tools ? tools.join(' → ') : insight.summary;
|
|
155
|
+
return [
|
|
156
|
+
truncate(seq, 50),
|
|
157
|
+
String(d.frequency ?? ''),
|
|
158
|
+
String(d.sessions ?? ''),
|
|
159
|
+
d.errorRate !== undefined ? `${(Number(d.errorRate) * 100).toFixed(1)}%` : '',
|
|
160
|
+
];
|
|
161
|
+
});
|
|
162
|
+
printTable(headers, rows);
|
|
163
|
+
}
|
|
164
|
+
function formatPerformanceTrends(result) {
|
|
165
|
+
console.log('\nPerformance Trends\n');
|
|
166
|
+
if (result.insights.length === 0) {
|
|
167
|
+
console.log('No performance data found.');
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
// Look for current stats
|
|
171
|
+
const currentInsight = result.insights.find((i) => i.type === 'current' || i.type === 'performance_current');
|
|
172
|
+
if (currentInsight) {
|
|
173
|
+
const d = currentInsight.data;
|
|
174
|
+
console.log(` Success Rate: ${d.successRate !== undefined ? `${(Number(d.successRate) * 100).toFixed(1)}%` : 'N/A'}`);
|
|
175
|
+
console.log(` Avg Duration: ${d.avgDuration !== undefined ? `${Number(d.avgDuration).toFixed(0)}ms` : 'N/A'}`);
|
|
176
|
+
console.log(` Avg Tool Calls: ${d.avgToolCalls ?? 'N/A'}`);
|
|
177
|
+
console.log(` Avg Errors: ${d.avgErrors ?? 'N/A'}`);
|
|
178
|
+
console.log('');
|
|
179
|
+
}
|
|
180
|
+
// Look for assessment
|
|
181
|
+
const assessmentInsight = result.insights.find((i) => i.type === 'assessment' || i.type === 'trend_assessment');
|
|
182
|
+
if (assessmentInsight) {
|
|
183
|
+
const assessment = String(assessmentInsight.data.assessment ?? assessmentInsight.summary);
|
|
184
|
+
const icon = assessment === 'improving' ? '📈' : assessment === 'degrading' ? '📉' : '📊';
|
|
185
|
+
console.log(` Trend: ${icon} ${assessment}`);
|
|
186
|
+
console.log('');
|
|
187
|
+
}
|
|
188
|
+
// Show trend data if present
|
|
189
|
+
const trendInsights = result.insights.filter((i) => i.type === 'trend_bucket' || i.type === 'trend');
|
|
190
|
+
if (trendInsights.length > 0) {
|
|
191
|
+
const headers = ['Date', 'Success Rate', 'Duration', 'Errors'];
|
|
192
|
+
const rows = trendInsights.map((insight) => {
|
|
193
|
+
const d = insight.data;
|
|
194
|
+
return [
|
|
195
|
+
String(d.date ?? insight.summary),
|
|
196
|
+
d.successRate !== undefined ? `${(Number(d.successRate) * 100).toFixed(1)}%` : '',
|
|
197
|
+
d.duration !== undefined ? `${Number(d.duration).toFixed(0)}ms` : '',
|
|
198
|
+
String(d.errors ?? ''),
|
|
199
|
+
];
|
|
200
|
+
});
|
|
201
|
+
printTable(headers, rows);
|
|
202
|
+
}
|
|
203
|
+
// Fallback: show all insights
|
|
204
|
+
if (!currentInsight && !assessmentInsight && trendInsights.length === 0) {
|
|
205
|
+
for (const insight of result.insights) {
|
|
206
|
+
console.log(` [${insight.type}] ${insight.summary} (confidence: ${(insight.confidence * 100).toFixed(0)}%)`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=reflect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.js","sourceRoot":"","sources":["../../src/commands/reflect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAcA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEtE"}
|