@agentlensai/cli 0.2.0 → 0.3.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/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/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/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 +84 -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 +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4CrD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens config — get/set configuration
|
|
3
|
+
*/
|
|
4
|
+
import { loadConfig, saveConfig, maskApiKey } from '../lib/config.js';
|
|
5
|
+
export function runConfigCommand(args) {
|
|
6
|
+
const subcommand = args[0];
|
|
7
|
+
if (subcommand === 'set') {
|
|
8
|
+
const key = args[1];
|
|
9
|
+
const value = args[2];
|
|
10
|
+
if (!key || !value) {
|
|
11
|
+
console.error('Usage: agentlens config set <key> <value>');
|
|
12
|
+
console.error('Keys: url, api-key');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const config = loadConfig();
|
|
16
|
+
switch (key) {
|
|
17
|
+
case 'url':
|
|
18
|
+
config.url = value;
|
|
19
|
+
break;
|
|
20
|
+
case 'api-key':
|
|
21
|
+
config.apiKey = value;
|
|
22
|
+
break;
|
|
23
|
+
default:
|
|
24
|
+
console.error(`Unknown config key: ${key}`);
|
|
25
|
+
console.error('Valid keys: url, api-key');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
saveConfig(config);
|
|
29
|
+
console.log(`✓ Set ${key}`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (subcommand === 'get' || !subcommand) {
|
|
33
|
+
const config = loadConfig();
|
|
34
|
+
console.log('AgentLens CLI Configuration:');
|
|
35
|
+
console.log(` url: ${config.url}`);
|
|
36
|
+
console.log(` api-key: ${config.apiKey ? maskApiKey(config.apiKey) : '(not set)'}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.error(`Unknown config subcommand: ${subcommand}`);
|
|
40
|
+
console.error('Usage: agentlens config [get|set <key> <value>]');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEtE,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC3D,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,KAAK;gBACR,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC;gBACnB,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;gBACtB,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QAED,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"AAQA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDpE"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens events — query events
|
|
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
|
+
export async function runEventsCommand(argv) {
|
|
8
|
+
const { values } = parseArgs({
|
|
9
|
+
args: argv,
|
|
10
|
+
options: {
|
|
11
|
+
session: { type: 'string', short: 's' },
|
|
12
|
+
type: { type: 'string', short: 't' },
|
|
13
|
+
limit: { type: 'string', short: 'l' },
|
|
14
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
15
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
16
|
+
},
|
|
17
|
+
allowPositionals: true,
|
|
18
|
+
});
|
|
19
|
+
if (values.help) {
|
|
20
|
+
console.log(`Usage: agentlens events [options]
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
-s, --session <id> Filter by session ID
|
|
24
|
+
-t, --type <type> Filter by event type (e.g. tool_call)
|
|
25
|
+
-l, --limit <n> Max number of events (default: 20)
|
|
26
|
+
-j, --json Output raw JSON
|
|
27
|
+
-h, --help Show help`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const client = createClientFromConfig();
|
|
31
|
+
const limit = values.limit ? parseInt(values.limit, 10) : 20;
|
|
32
|
+
const result = await client.queryEvents({
|
|
33
|
+
sessionId: values.session ?? undefined,
|
|
34
|
+
eventType: values.type ?? undefined,
|
|
35
|
+
limit,
|
|
36
|
+
order: 'desc',
|
|
37
|
+
});
|
|
38
|
+
if (values.json) {
|
|
39
|
+
printJson(result);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (result.events.length === 0) {
|
|
43
|
+
console.log('No events found.');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const headers = ['ID', 'Time', 'Session', 'Type', 'Severity', 'Agent'];
|
|
47
|
+
const rows = result.events.map((e) => [
|
|
48
|
+
truncate(e.id, 16),
|
|
49
|
+
formatTimestamp(e.timestamp),
|
|
50
|
+
truncate(e.sessionId, 14),
|
|
51
|
+
e.eventType,
|
|
52
|
+
e.severity,
|
|
53
|
+
truncate(e.agentId, 14),
|
|
54
|
+
]);
|
|
55
|
+
printTable(headers, rows);
|
|
56
|
+
console.log(`\nShowing ${result.events.length} of ${result.total} events.`);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEpF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YACvC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YACpC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YACrC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;YACrD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;SACtD;QACD,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;kCAOkB,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;QACtC,SAAS,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;QACtC,SAAS,EAAG,MAAM,CAAC,IAAkB,IAAI,SAAS;QAClD,KAAK;QACL,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,SAAS,CAAC,MAAM,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACpC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5B,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;QACzB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,QAAQ;QACV,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;KACxB,CAAC,CAAC;IAEH,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/commands/llm.ts"],"names":[],"mappings":"AAwBA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjE"}
|
|
@@ -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":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens sessions — list and inspect sessions
|
|
3
|
+
*/
|
|
4
|
+
import { parseArgs } from 'node:util';
|
|
5
|
+
import { createClientFromConfig } from '../lib/client.js';
|
|
6
|
+
import { printTable, printJson, formatTimestamp, formatDuration, truncate, } from '../lib/output.js';
|
|
7
|
+
export async function runSessionsCommand(argv) {
|
|
8
|
+
const { values, positionals } = parseArgs({
|
|
9
|
+
args: argv,
|
|
10
|
+
options: {
|
|
11
|
+
status: { type: 'string' },
|
|
12
|
+
agent: { type: 'string', short: 'a' },
|
|
13
|
+
limit: { type: 'string', short: 'l' },
|
|
14
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
15
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
16
|
+
},
|
|
17
|
+
allowPositionals: true,
|
|
18
|
+
});
|
|
19
|
+
// agentlens sessions show <id>
|
|
20
|
+
if (positionals[0] === 'show') {
|
|
21
|
+
const sessionId = positionals[1];
|
|
22
|
+
if (!sessionId) {
|
|
23
|
+
console.error('Usage: agentlens sessions show <session-id>');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
await showSession(sessionId, values.json ?? false);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (values.help) {
|
|
30
|
+
console.log(`Usage: agentlens sessions [options]
|
|
31
|
+
agentlens sessions show <id>
|
|
32
|
+
|
|
33
|
+
Options:
|
|
34
|
+
--status <status> Filter by status (active, completed, error)
|
|
35
|
+
-a, --agent <id> Filter by agent ID
|
|
36
|
+
-l, --limit <n> Max number of sessions (default: 20)
|
|
37
|
+
-j, --json Output raw JSON
|
|
38
|
+
-h, --help Show help`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const client = createClientFromConfig();
|
|
42
|
+
const limit = values.limit ? parseInt(values.limit, 10) : 20;
|
|
43
|
+
const result = await client.getSessions({
|
|
44
|
+
status: values.status ?? undefined,
|
|
45
|
+
agentId: values.agent ?? undefined,
|
|
46
|
+
limit,
|
|
47
|
+
});
|
|
48
|
+
if (values.json) {
|
|
49
|
+
printJson(result);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (result.sessions.length === 0) {
|
|
53
|
+
console.log('No sessions found.');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const headers = ['ID', 'Agent', 'Status', 'Started', 'Duration', 'Events', 'Errors'];
|
|
57
|
+
const rows = result.sessions.map((s) => [
|
|
58
|
+
truncate(s.id, 16),
|
|
59
|
+
truncate(s.agentId, 14),
|
|
60
|
+
s.status,
|
|
61
|
+
formatTimestamp(s.startedAt),
|
|
62
|
+
formatDuration(s.startedAt, s.endedAt),
|
|
63
|
+
String(s.eventCount),
|
|
64
|
+
String(s.errorCount),
|
|
65
|
+
]);
|
|
66
|
+
printTable(headers, rows);
|
|
67
|
+
console.log(`\nShowing ${result.sessions.length} of ${result.total} sessions.`);
|
|
68
|
+
}
|
|
69
|
+
async function showSession(sessionId, json) {
|
|
70
|
+
const client = createClientFromConfig();
|
|
71
|
+
const [session, timeline] = await Promise.all([
|
|
72
|
+
client.getSession(sessionId),
|
|
73
|
+
client.getSessionTimeline(sessionId),
|
|
74
|
+
]);
|
|
75
|
+
if (json) {
|
|
76
|
+
printJson({ session, timeline });
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
console.log(`\nSession: ${session.id}`);
|
|
80
|
+
console.log(` Agent: ${session.agentId}${session.agentName ? ` (${session.agentName})` : ''}`);
|
|
81
|
+
console.log(` Status: ${session.status}`);
|
|
82
|
+
console.log(` Started: ${formatTimestamp(session.startedAt)}`);
|
|
83
|
+
console.log(` Duration: ${formatDuration(session.startedAt, session.endedAt)}`);
|
|
84
|
+
console.log(` Events: ${session.eventCount} total, ${session.toolCallCount} tool calls, ${session.errorCount} errors`);
|
|
85
|
+
if (session.totalCostUsd > 0) {
|
|
86
|
+
console.log(` Cost: $${session.totalCostUsd.toFixed(4)}`);
|
|
87
|
+
}
|
|
88
|
+
console.log(` Chain: ${timeline.chainValid ? '✓ valid' : '✗ broken'}`);
|
|
89
|
+
if (timeline.events.length > 0) {
|
|
90
|
+
console.log(`\nTimeline (${timeline.events.length} events):`);
|
|
91
|
+
const headers = ['Time', 'Type', 'Severity', 'Summary'];
|
|
92
|
+
const rows = timeline.events.map((e) => [
|
|
93
|
+
formatTimestamp(e.timestamp),
|
|
94
|
+
e.eventType,
|
|
95
|
+
e.severity,
|
|
96
|
+
truncate(summarizePayload(e.eventType, e.payload), 40),
|
|
97
|
+
]);
|
|
98
|
+
printTable(headers, rows);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function summarizePayload(eventType, payload) {
|
|
102
|
+
if (!payload || typeof payload !== 'object')
|
|
103
|
+
return '';
|
|
104
|
+
const p = payload;
|
|
105
|
+
switch (eventType) {
|
|
106
|
+
case 'tool_call':
|
|
107
|
+
return `${p['toolName'] ?? 'unknown'}()`;
|
|
108
|
+
case 'tool_response':
|
|
109
|
+
return `${p['toolName'] ?? ''} → ${p['durationMs'] ?? '?'}ms`;
|
|
110
|
+
case 'tool_error':
|
|
111
|
+
return `${p['toolName'] ?? ''}: ${p['error'] ?? 'error'}`;
|
|
112
|
+
case 'session_started':
|
|
113
|
+
return p['agentName'] ? String(p['agentName']) : '';
|
|
114
|
+
case 'session_ended':
|
|
115
|
+
return String(p['reason'] ?? 'ended');
|
|
116
|
+
default:
|
|
117
|
+
return '';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tail.d.ts","sourceRoot":"","sources":["../../src/commands/tail.ts"],"names":[],"mappings":"AAUA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoGlE"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens tail — stream live events via SSE
|
|
3
|
+
*
|
|
4
|
+
* Connects to the /api/stream SSE endpoint. The endpoint is being built
|
|
5
|
+
* in Epic 14 in parallel — the command structure is ready for it.
|
|
6
|
+
*/
|
|
7
|
+
import { parseArgs } from 'node:util';
|
|
8
|
+
import { loadConfig } from '../lib/config.js';
|
|
9
|
+
import { formatTimestamp, truncate } from '../lib/output.js';
|
|
10
|
+
export async function runTailCommand(argv) {
|
|
11
|
+
const { values } = parseArgs({
|
|
12
|
+
args: argv,
|
|
13
|
+
options: {
|
|
14
|
+
session: { type: 'string', short: 's' },
|
|
15
|
+
type: { type: 'string', short: 't' },
|
|
16
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
17
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
18
|
+
},
|
|
19
|
+
allowPositionals: false,
|
|
20
|
+
});
|
|
21
|
+
if (values.help) {
|
|
22
|
+
console.log(`Usage: agentlens tail [options]
|
|
23
|
+
|
|
24
|
+
Stream live events as they arrive.
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
-s, --session <id> Filter by session ID
|
|
28
|
+
-t, --type <type> Filter by event type
|
|
29
|
+
-j, --json Output raw JSON per event
|
|
30
|
+
-h, --help Show help
|
|
31
|
+
|
|
32
|
+
Press Ctrl+C to stop.`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const config = loadConfig();
|
|
36
|
+
const baseUrl = config.url.replace(/\/+$/, '');
|
|
37
|
+
// Build SSE URL with filters
|
|
38
|
+
const params = new URLSearchParams();
|
|
39
|
+
if (values.session)
|
|
40
|
+
params.set('sessionId', values.session);
|
|
41
|
+
if (values.type)
|
|
42
|
+
params.set('eventType', values.type);
|
|
43
|
+
const sseUrl = `${baseUrl}/api/stream${params.toString() ? '?' + params.toString() : ''}`;
|
|
44
|
+
const headers = {
|
|
45
|
+
'Accept': 'text/event-stream',
|
|
46
|
+
};
|
|
47
|
+
if (config.apiKey) {
|
|
48
|
+
headers['Authorization'] = `Bearer ${config.apiKey}`;
|
|
49
|
+
}
|
|
50
|
+
console.log(`Connecting to ${baseUrl}...`);
|
|
51
|
+
// Use native fetch with streaming (works in Node.js ≥ 18)
|
|
52
|
+
let response;
|
|
53
|
+
try {
|
|
54
|
+
response = await fetch(sseUrl, {
|
|
55
|
+
headers,
|
|
56
|
+
signal: createAbortOnSigint(),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (err.name === 'AbortError') {
|
|
61
|
+
console.log('\nDisconnected.');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
console.error(`Failed to connect: ${err instanceof Error ? err.message : String(err)}`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const text = await response.text().catch(() => '');
|
|
69
|
+
console.error(`Server returned ${response.status}: ${text}`);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
if (!response.body) {
|
|
73
|
+
console.error('No response body (streaming not supported)');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
console.log('Connected. Streaming events (Ctrl+C to stop)...\n');
|
|
77
|
+
// Parse SSE stream
|
|
78
|
+
const decoder = new TextDecoder();
|
|
79
|
+
let buffer = '';
|
|
80
|
+
try {
|
|
81
|
+
for await (const chunk of response.body) {
|
|
82
|
+
buffer += decoder.decode(chunk, { stream: true });
|
|
83
|
+
// Process complete SSE messages (double newline separated)
|
|
84
|
+
const messages = buffer.split('\n\n');
|
|
85
|
+
buffer = messages.pop() ?? '';
|
|
86
|
+
for (const msg of messages) {
|
|
87
|
+
processSSEMessage(msg, values.json ?? false);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (err.name === 'AbortError') {
|
|
93
|
+
// Normal Ctrl+C
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.error(`\nStream error: ${err instanceof Error ? err.message : String(err)}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
console.log('\nDisconnected.');
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Parse and display a single SSE message.
|
|
103
|
+
*/
|
|
104
|
+
function processSSEMessage(raw, jsonOutput) {
|
|
105
|
+
let eventType = 'message';
|
|
106
|
+
let data = '';
|
|
107
|
+
for (const line of raw.split('\n')) {
|
|
108
|
+
if (line.startsWith('event:')) {
|
|
109
|
+
eventType = line.slice(6).trim();
|
|
110
|
+
}
|
|
111
|
+
else if (line.startsWith('data:')) {
|
|
112
|
+
data += line.slice(5).trim();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Skip heartbeats
|
|
116
|
+
if (eventType === 'heartbeat')
|
|
117
|
+
return;
|
|
118
|
+
if (!data)
|
|
119
|
+
return;
|
|
120
|
+
if (jsonOutput) {
|
|
121
|
+
console.log(data);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Try to parse as event JSON
|
|
125
|
+
try {
|
|
126
|
+
const event = JSON.parse(data);
|
|
127
|
+
const ts = typeof event['timestamp'] === 'string' ? formatTimestamp(event['timestamp']) : '';
|
|
128
|
+
const type = event['eventType'] ?? eventType;
|
|
129
|
+
const severity = event['severity'] ?? 'info';
|
|
130
|
+
const session = truncate(String(event['sessionId'] ?? ''), 14);
|
|
131
|
+
const agent = truncate(String(event['agentId'] ?? ''), 14);
|
|
132
|
+
console.log(`[${ts}] ${String(type).padEnd(16)} ${String(severity).padEnd(8)} ${session} ${agent}`);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Raw message
|
|
136
|
+
console.log(`[${eventType}] ${truncate(data, 100)}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create an AbortSignal that triggers on SIGINT (Ctrl+C).
|
|
141
|
+
*/
|
|
142
|
+
function createAbortOnSigint() {
|
|
143
|
+
const controller = new AbortController();
|
|
144
|
+
const handler = () => {
|
|
145
|
+
controller.abort();
|
|
146
|
+
process.removeListener('SIGINT', handler);
|
|
147
|
+
};
|
|
148
|
+
process.on('SIGINT', handler);
|
|
149
|
+
return controller.signal;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=tail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tail.js","sourceRoot":"","sources":["../../src/commands/tail.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
/**
|
|
2
|
-
* @
|
|
3
|
+
* @agentlensai/cli — Command-line interface for AgentLens
|
|
4
|
+
*
|
|
5
|
+
* Uses node:util parseArgs for lightweight argument parsing.
|
|
3
6
|
*/
|
|
4
|
-
export
|
|
7
|
+
export {};
|
|
5
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
1
2
|
/**
|
|
2
|
-
* @
|
|
3
|
+
* @agentlensai/cli — Command-line interface for AgentLens
|
|
4
|
+
*
|
|
5
|
+
* Uses node:util parseArgs for lightweight argument parsing.
|
|
3
6
|
*/
|
|
4
|
-
|
|
7
|
+
import { runConfigCommand } from './commands/config.js';
|
|
8
|
+
import { runEventsCommand } from './commands/events.js';
|
|
9
|
+
import { runLlmCommand } from './commands/llm.js';
|
|
10
|
+
import { runSessionsCommand } from './commands/sessions.js';
|
|
11
|
+
import { runTailCommand } from './commands/tail.js';
|
|
12
|
+
const HELP = `AgentLens CLI — Observability for AI agents
|
|
13
|
+
|
|
14
|
+
Usage: agentlens <command> [options]
|
|
15
|
+
|
|
16
|
+
Commands:
|
|
17
|
+
config Get or set configuration (url, api-key)
|
|
18
|
+
events Query events
|
|
19
|
+
sessions List and inspect sessions
|
|
20
|
+
tail Stream live events (SSE)
|
|
21
|
+
llm LLM call tracking (stats, models, recent)
|
|
22
|
+
|
|
23
|
+
Run "agentlens <command> --help" for command-specific help.
|
|
24
|
+
|
|
25
|
+
Configuration:
|
|
26
|
+
agentlens config set url http://localhost:3400
|
|
27
|
+
agentlens config set api-key als_xxx
|
|
28
|
+
agentlens config get
|
|
29
|
+
`;
|
|
30
|
+
async function main() {
|
|
31
|
+
const args = process.argv.slice(2);
|
|
32
|
+
const command = args[0];
|
|
33
|
+
const rest = args.slice(1);
|
|
34
|
+
switch (command) {
|
|
35
|
+
case 'config':
|
|
36
|
+
runConfigCommand(rest);
|
|
37
|
+
break;
|
|
38
|
+
case 'events':
|
|
39
|
+
await runEventsCommand(rest);
|
|
40
|
+
break;
|
|
41
|
+
case 'llm':
|
|
42
|
+
await runLlmCommand(rest);
|
|
43
|
+
break;
|
|
44
|
+
case 'sessions':
|
|
45
|
+
await runSessionsCommand(rest);
|
|
46
|
+
break;
|
|
47
|
+
case 'tail':
|
|
48
|
+
await runTailCommand(rest);
|
|
49
|
+
break;
|
|
50
|
+
case '--help':
|
|
51
|
+
case '-h':
|
|
52
|
+
case undefined:
|
|
53
|
+
console.log(HELP);
|
|
54
|
+
break;
|
|
55
|
+
case '--version':
|
|
56
|
+
case '-v':
|
|
57
|
+
console.log('0.0.0');
|
|
58
|
+
break;
|
|
59
|
+
default:
|
|
60
|
+
console.error(`Unknown command: ${command}`);
|
|
61
|
+
console.log(HELP);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
main().catch((err) => {
|
|
66
|
+
if (err && typeof err === 'object' && 'name' in err) {
|
|
67
|
+
const e = err;
|
|
68
|
+
// Show friendly error for SDK errors
|
|
69
|
+
if (e.name === 'ConnectionError') {
|
|
70
|
+
console.error(`Error: Cannot connect to AgentLens server.`);
|
|
71
|
+
console.error(` ${e.message}`);
|
|
72
|
+
console.error(`\nMake sure the server is running and check your config with: agentlens config get`);
|
|
73
|
+
}
|
|
74
|
+
else if (e.name === 'AuthenticationError') {
|
|
75
|
+
console.error(`Error: Authentication failed.`);
|
|
76
|
+
console.error(` Set your API key with: agentlens config set api-key <key>`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
console.error(`Error: ${e.message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
console.error(`Error: ${err}`);
|
|
84
|
+
}
|
|
85
|
+
process.exit(1);
|
|
86
|
+
});
|
|
5
87
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;CAiBZ,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM;QAER,KAAK,KAAK;YACR,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM;QAER,KAAK,UAAU;YACb,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM;QAER,KAAK,MAAM;YACT,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM;QAER,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,SAAS;YACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM;QAER,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM;QAER;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QACpD,MAAM,CAAC,GAAG,GAAyD,CAAC;QACpE,qCAAqC;QACrC,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACtG,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create an AgentLensClient from CLI config.
|
|
3
|
+
*
|
|
4
|
+
* @param urlOverride - Optional URL that takes precedence over the stored config.
|
|
5
|
+
*/
|
|
6
|
+
import { AgentLensClient } from '@agentlensai/sdk';
|
|
7
|
+
export declare function createClientFromConfig(urlOverride?: string): AgentLensClient;
|
|
8
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,wBAAgB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,CAM5E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create an AgentLensClient from CLI config.
|
|
3
|
+
*
|
|
4
|
+
* @param urlOverride - Optional URL that takes precedence over the stored config.
|
|
5
|
+
*/
|
|
6
|
+
import { AgentLensClient } from '@agentlensai/sdk';
|
|
7
|
+
import { loadConfig } from './config.js';
|
|
8
|
+
export function createClientFromConfig(urlOverride) {
|
|
9
|
+
const config = loadConfig();
|
|
10
|
+
return new AgentLensClient({
|
|
11
|
+
url: urlOverride ?? config.url,
|
|
12
|
+
apiKey: config.apiKey,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,sBAAsB,CAAC,WAAoB;IACzD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,IAAI,eAAe,CAAC;QACzB,GAAG,EAAE,WAAW,IAAI,MAAM,CAAC,GAAG;QAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface CliConfig {
|
|
2
|
+
url: string;
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Load config from ~/.agentlens/config.json (returns defaults if missing).
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadConfig(): CliConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Save config to ~/.agentlens/config.json.
|
|
11
|
+
*/
|
|
12
|
+
export declare function saveConfig(config: CliConfig): void;
|
|
13
|
+
/**
|
|
14
|
+
* Mask an API key for display: show first 8 chars + mask the rest.
|
|
15
|
+
*/
|
|
16
|
+
export declare function maskApiKey(key: string): string;
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAOtC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Configuration — stored in ~/.agentlens/config.json
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
const CONFIG_DIR = join(homedir(), '.agentlens');
|
|
8
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
url: 'http://localhost:3400',
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Load config from ~/.agentlens/config.json (returns defaults if missing).
|
|
14
|
+
*/
|
|
15
|
+
export function loadConfig() {
|
|
16
|
+
try {
|
|
17
|
+
const raw = readFileSync(CONFIG_FILE, 'utf-8');
|
|
18
|
+
return { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return { ...DEFAULT_CONFIG };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Save config to ~/.agentlens/config.json.
|
|
26
|
+
*/
|
|
27
|
+
export function saveConfig(config) {
|
|
28
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
29
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Mask an API key for display: show first 8 chars + mask the rest.
|
|
33
|
+
*/
|
|
34
|
+
export function maskApiKey(key) {
|
|
35
|
+
if (key.length <= 8)
|
|
36
|
+
return key;
|
|
37
|
+
return key.slice(0, 8) + '•'.repeat(Math.min(key.length - 8, 24));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOlC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,cAAc,GAAc;IAChC,GAAG,EAAE,uBAAuB;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Output Formatting Utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Print data as a simple aligned table to stdout.
|
|
6
|
+
*/
|
|
7
|
+
export declare function printTable(headers: string[], rows: string[][]): void;
|
|
8
|
+
/**
|
|
9
|
+
* Print JSON to stdout (pretty if tty, compact otherwise).
|
|
10
|
+
*/
|
|
11
|
+
export declare function printJson(data: unknown): void;
|
|
12
|
+
/**
|
|
13
|
+
* Format a timestamp for table display.
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatTimestamp(ts: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Format a duration in milliseconds to a human-readable string.
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatDuration(startedAt: string, endedAt?: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Truncate a string to a max length with "…" suffix.
|
|
22
|
+
*/
|
|
23
|
+
export declare function truncate(str: string, max: number): string;
|
|
24
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,GACf,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAG7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAclD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Output Formatting Utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Print data as a simple aligned table to stdout.
|
|
6
|
+
*/
|
|
7
|
+
export function printTable(headers, rows) {
|
|
8
|
+
const colWidths = headers.map((h, i) => {
|
|
9
|
+
const maxData = rows.reduce((max, row) => Math.max(max, (row[i] ?? '').length), 0);
|
|
10
|
+
return Math.max(h.length, maxData);
|
|
11
|
+
});
|
|
12
|
+
const sep = colWidths.map((w) => '─'.repeat(w + 2)).join('┼');
|
|
13
|
+
const formatRow = (cells) => cells.map((cell, i) => ` ${(cell ?? '').padEnd(colWidths[i])} `).join('│');
|
|
14
|
+
console.log(formatRow(headers));
|
|
15
|
+
console.log(sep);
|
|
16
|
+
for (const row of rows) {
|
|
17
|
+
console.log(formatRow(row));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Print JSON to stdout (pretty if tty, compact otherwise).
|
|
22
|
+
*/
|
|
23
|
+
export function printJson(data) {
|
|
24
|
+
const indent = process.stdout.isTTY ? 2 : 0;
|
|
25
|
+
console.log(JSON.stringify(data, null, indent));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Format a timestamp for table display.
|
|
29
|
+
*/
|
|
30
|
+
export function formatTimestamp(ts) {
|
|
31
|
+
try {
|
|
32
|
+
const d = new Date(ts);
|
|
33
|
+
return d.toLocaleString('en-US', {
|
|
34
|
+
month: 'short',
|
|
35
|
+
day: '2-digit',
|
|
36
|
+
hour: '2-digit',
|
|
37
|
+
minute: '2-digit',
|
|
38
|
+
second: '2-digit',
|
|
39
|
+
hour12: false,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return ts;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Format a duration in milliseconds to a human-readable string.
|
|
48
|
+
*/
|
|
49
|
+
export function formatDuration(startedAt, endedAt) {
|
|
50
|
+
if (!endedAt)
|
|
51
|
+
return 'running';
|
|
52
|
+
const ms = new Date(endedAt).getTime() - new Date(startedAt).getTime();
|
|
53
|
+
if (ms < 1000)
|
|
54
|
+
return `${ms}ms`;
|
|
55
|
+
if (ms < 60_000)
|
|
56
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
57
|
+
const mins = Math.floor(ms / 60_000);
|
|
58
|
+
const secs = Math.floor((ms % 60_000) / 1000);
|
|
59
|
+
return `${mins}m${secs}s`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Truncate a string to a max length with "…" suffix.
|
|
63
|
+
*/
|
|
64
|
+
export function truncate(str, max) {
|
|
65
|
+
if (str.length <= max)
|
|
66
|
+
return str;
|
|
67
|
+
return str.slice(0, max - 1) + '…';
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentlensai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Command-line interface for AgentLens — query events, sessions, and manage your observability server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dist"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@agentlensai/sdk": "0.
|
|
40
|
+
"@agentlensai/sdk": "0.3.0"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"build": "tsc -b",
|