@agentlensai/cli 0.3.0 → 0.6.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=health-optimize.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-optimize.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/health-optimize.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Tests for CLI health + optimize commands (Story 3.3)
3
+ */
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
+ // ─── Mock SDK client ────────────────────────────────────────────────
6
+ const mockGetHealth = vi.fn();
7
+ const mockGetHealthOverview = vi.fn();
8
+ const mockGetHealthHistory = vi.fn();
9
+ const mockGetOptimizationRecommendations = vi.fn();
10
+ vi.mock('@agentlensai/sdk', () => {
11
+ return {
12
+ AgentLensClient: class MockAgentLensClient {
13
+ getHealth = mockGetHealth;
14
+ getHealthOverview = mockGetHealthOverview;
15
+ getHealthHistory = mockGetHealthHistory;
16
+ getOptimizationRecommendations = mockGetOptimizationRecommendations;
17
+ },
18
+ };
19
+ });
20
+ vi.mock('../lib/config.js', () => ({
21
+ loadConfig: () => ({ url: 'http://localhost:3400', apiKey: 'test' }),
22
+ }));
23
+ // ─── Helpers ────────────────────────────────────────────────────────
24
+ let consoleOutput;
25
+ let originalLog;
26
+ let originalError;
27
+ beforeEach(() => {
28
+ consoleOutput = [];
29
+ originalLog = console.log;
30
+ originalError = console.error;
31
+ console.log = (...args) => consoleOutput.push(args.join(' '));
32
+ console.error = (...args) => consoleOutput.push(args.join(' '));
33
+ vi.clearAllMocks();
34
+ });
35
+ afterEach(() => {
36
+ console.log = originalLog;
37
+ console.error = originalError;
38
+ });
39
+ // ─── Sample data ────────────────────────────────────────────────────
40
+ const sampleHealthScore = {
41
+ agentId: 'agent-1',
42
+ overallScore: 82,
43
+ trend: 'improving',
44
+ trendDelta: 3.5,
45
+ dimensions: [
46
+ { name: 'error_rate', score: 90, weight: 0.3, rawValue: 0.02, description: 'Low error rate' },
47
+ { name: 'cost_efficiency', score: 75, weight: 0.2, rawValue: 0.005, description: 'Avg cost' },
48
+ ],
49
+ window: { from: '2026-02-01T00:00:00Z', to: '2026-02-08T00:00:00Z' },
50
+ sessionCount: 42,
51
+ computedAt: '2026-02-08T12:00:00Z',
52
+ };
53
+ const sampleSnapshot = {
54
+ agentId: 'agent-1',
55
+ date: '2026-02-07',
56
+ overallScore: 80,
57
+ errorRateScore: 88,
58
+ costEfficiencyScore: 72,
59
+ toolSuccessScore: 85,
60
+ latencyScore: 78,
61
+ completionRateScore: 90,
62
+ sessionCount: 10,
63
+ };
64
+ const sampleOptResult = {
65
+ recommendations: [
66
+ {
67
+ currentModel: 'claude-opus-4-6',
68
+ recommendedModel: 'claude-sonnet-4-20250514',
69
+ complexityTier: 'simple',
70
+ currentCostPerCall: 0.03,
71
+ recommendedCostPerCall: 0.003,
72
+ monthlySavings: 54.0,
73
+ callVolume: 2000,
74
+ currentSuccessRate: 0.98,
75
+ recommendedSuccessRate: 0.97,
76
+ confidence: 'high',
77
+ agentId: 'agent-1',
78
+ },
79
+ ],
80
+ totalPotentialSavings: 54.0,
81
+ period: 30,
82
+ analyzedCalls: 2000,
83
+ };
84
+ // ─── Tests ──────────────────────────────────────────────────────────
85
+ describe('health command', () => {
86
+ it('shows help with --help flag', async () => {
87
+ const { runHealthCommand } = await import('../commands/health.js');
88
+ await runHealthCommand(['--help']);
89
+ const output = consoleOutput.join('\n');
90
+ expect(output).toContain('Usage: agentlens health');
91
+ expect(output).toContain('--agent');
92
+ expect(output).toContain('--history');
93
+ });
94
+ it('displays health overview table', async () => {
95
+ mockGetHealthOverview.mockResolvedValue([sampleHealthScore]);
96
+ const { runHealthCommand } = await import('../commands/health.js');
97
+ await runHealthCommand([]);
98
+ const output = consoleOutput.join('\n');
99
+ expect(output).toContain('Agent Health Overview');
100
+ expect(output).toContain('agent-1');
101
+ expect(mockGetHealthOverview).toHaveBeenCalledWith(undefined);
102
+ });
103
+ it('displays detailed single agent health', async () => {
104
+ mockGetHealth.mockResolvedValue(sampleHealthScore);
105
+ const { runHealthCommand } = await import('../commands/health.js');
106
+ await runHealthCommand(['--agent', 'agent-1']);
107
+ const output = consoleOutput.join('\n');
108
+ expect(output).toContain('Agent Health');
109
+ expect(output).toContain('agent-1');
110
+ expect(output).toContain('error_rate');
111
+ expect(mockGetHealth).toHaveBeenCalledWith('agent-1', undefined);
112
+ });
113
+ it('displays health history with --agent and --history', async () => {
114
+ mockGetHealthHistory.mockResolvedValue([sampleSnapshot]);
115
+ const { runHealthCommand } = await import('../commands/health.js');
116
+ await runHealthCommand(['--agent', 'agent-1', '--history']);
117
+ const output = consoleOutput.join('\n');
118
+ expect(output).toContain('Health History');
119
+ expect(output).toContain('2026-02-07');
120
+ expect(mockGetHealthHistory).toHaveBeenCalledWith('agent-1', 30);
121
+ });
122
+ it('outputs JSON when --format json', async () => {
123
+ mockGetHealthOverview.mockResolvedValue([sampleHealthScore]);
124
+ const { runHealthCommand } = await import('../commands/health.js');
125
+ await runHealthCommand(['--format', 'json']);
126
+ const output = consoleOutput.join('\n');
127
+ // Should be valid JSON
128
+ const parsed = JSON.parse(output);
129
+ expect(parsed).toHaveLength(1);
130
+ expect(parsed[0].agentId).toBe('agent-1');
131
+ });
132
+ it('passes window parameter through', async () => {
133
+ mockGetHealthOverview.mockResolvedValue([]);
134
+ const { runHealthCommand } = await import('../commands/health.js');
135
+ await runHealthCommand(['--window', '14']);
136
+ expect(mockGetHealthOverview).toHaveBeenCalledWith(14);
137
+ });
138
+ });
139
+ describe('optimize command', () => {
140
+ it('shows help with --help flag', async () => {
141
+ const { runOptimizeCommand } = await import('../commands/optimize.js');
142
+ await runOptimizeCommand(['--help']);
143
+ const output = consoleOutput.join('\n');
144
+ expect(output).toContain('Usage: agentlens optimize');
145
+ expect(output).toContain('--agent');
146
+ });
147
+ it('displays recommendations table', async () => {
148
+ mockGetOptimizationRecommendations.mockResolvedValue(sampleOptResult);
149
+ const { runOptimizeCommand } = await import('../commands/optimize.js');
150
+ await runOptimizeCommand([]);
151
+ const output = consoleOutput.join('\n');
152
+ expect(output).toContain('Optimization Recommendations');
153
+ expect(output).toContain('$54.00');
154
+ expect(output).toContain('agent-1');
155
+ expect(mockGetOptimizationRecommendations).toHaveBeenCalledWith({
156
+ agentId: undefined,
157
+ period: undefined,
158
+ limit: undefined,
159
+ });
160
+ });
161
+ it('passes agent filter to SDK', async () => {
162
+ mockGetOptimizationRecommendations.mockResolvedValue({ ...sampleOptResult, recommendations: [] });
163
+ const { runOptimizeCommand } = await import('../commands/optimize.js');
164
+ await runOptimizeCommand(['--agent', 'agent-1']);
165
+ expect(mockGetOptimizationRecommendations).toHaveBeenCalledWith({
166
+ agentId: 'agent-1',
167
+ period: undefined,
168
+ limit: undefined,
169
+ });
170
+ });
171
+ it('outputs JSON when --format json', async () => {
172
+ mockGetOptimizationRecommendations.mockResolvedValue(sampleOptResult);
173
+ const { runOptimizeCommand } = await import('../commands/optimize.js');
174
+ await runOptimizeCommand(['--format', 'json']);
175
+ const output = consoleOutput.join('\n');
176
+ const parsed = JSON.parse(output);
177
+ expect(parsed.totalPotentialSavings).toBe(54.0);
178
+ expect(parsed.recommendations).toHaveLength(1);
179
+ });
180
+ });
181
+ //# sourceMappingURL=health-optimize.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-optimize.test.js","sourceRoot":"","sources":["../../src/__tests__/health-optimize.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runContextCommand(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AA2BA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFrE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * agentlens context — Cross-session context retrieval
3
+ */
4
+ import { parseArgs } from 'node:util';
5
+ import { createClientFromConfig } from '../lib/client.js';
6
+ import { printJson, truncate, formatTimestamp } from '../lib/output.js';
7
+ const HELP = `Usage: agentlens context <topic> [options]
8
+
9
+ Retrieve cross-session context for a topic — session summaries with relevance scores and related lessons.
10
+
11
+ Arguments:
12
+ topic Topic to retrieve context for
13
+
14
+ Options:
15
+ --user <id> Filter by user ID
16
+ --agent <id> Filter by agent ID
17
+ --limit <n> Maximum number of sessions (default: 5)
18
+ --url <url> Server URL (overrides config)
19
+ -j, --json Output raw JSON
20
+ -h, --help Show help
21
+
22
+ Examples:
23
+ agentlens context "database migrations"
24
+ agentlens context "user authentication" --user user123
25
+ agentlens context "API rate limiting" --agent my-agent --limit 3`;
26
+ export async function runContextCommand(argv) {
27
+ const { values, positionals } = parseArgs({
28
+ args: argv,
29
+ options: {
30
+ user: { type: 'string', short: 'u' },
31
+ agent: { type: 'string', short: 'a' },
32
+ limit: { type: 'string', short: 'l' },
33
+ url: { type: 'string' },
34
+ json: { type: 'boolean', short: 'j', default: false },
35
+ help: { type: 'boolean', short: 'h', default: false },
36
+ },
37
+ allowPositionals: true,
38
+ });
39
+ if (values.help) {
40
+ console.log(HELP);
41
+ return;
42
+ }
43
+ const topic = positionals[0];
44
+ if (!topic) {
45
+ console.error('Error: Topic argument is required.\n');
46
+ console.log(HELP);
47
+ process.exit(1);
48
+ }
49
+ const client = createClientFromConfig(values.url);
50
+ const result = await client.getContext({
51
+ topic,
52
+ userId: values.user ?? undefined,
53
+ agentId: values.agent ?? undefined,
54
+ limit: values.limit ? parseInt(values.limit, 10) : undefined,
55
+ });
56
+ if (values.json) {
57
+ printJson(result);
58
+ return;
59
+ }
60
+ console.log(`\nContext for "${result.topic}"\n`);
61
+ if (result.summary) {
62
+ console.log(`Summary: ${result.summary}\n`);
63
+ }
64
+ // Sessions
65
+ if (result.sessions.length > 0) {
66
+ console.log(`Related Sessions (${result.sessions.length} of ${result.totalSessions ?? result.sessions.length}):\n`);
67
+ for (const session of result.sessions) {
68
+ const score = `${(session.relevanceScore * 100).toFixed(1)}%`;
69
+ const started = formatTimestamp(session.startedAt);
70
+ const agent = 'agentId' in session ? session.agentId : '';
71
+ console.log(` [${score}] Session ${truncate(session.sessionId, 20)}`);
72
+ if (agent) {
73
+ console.log(` Agent: ${agent}`);
74
+ }
75
+ console.log(` Started: ${started}`);
76
+ if (session.summary) {
77
+ console.log(` ${truncate(session.summary, 80)}`);
78
+ }
79
+ if (session.keyEvents && session.keyEvents.length > 0) {
80
+ console.log(' Key events:');
81
+ for (const event of session.keyEvents.slice(0, 3)) {
82
+ console.log(` - [${event.eventType}] ${truncate(event.summary, 60)}`);
83
+ }
84
+ }
85
+ console.log('');
86
+ }
87
+ }
88
+ else {
89
+ console.log('No related sessions found.\n');
90
+ }
91
+ // Lessons
92
+ if (result.lessons.length > 0) {
93
+ console.log(`Related Lessons (${result.lessons.length}):\n`);
94
+ for (const lesson of result.lessons) {
95
+ const score = `${(lesson.relevanceScore * 100).toFixed(1)}%`;
96
+ console.log(` [${score}] ${lesson.title} (${lesson.category})`);
97
+ console.log(` ${truncate(lesson.content.replace(/\n/g, ' '), 80)}`);
98
+ console.log('');
99
+ }
100
+ }
101
+ else {
102
+ console.log('No related lessons found.\n');
103
+ }
104
+ }
105
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runHealthCommand(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAuCA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoGpE"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * agentlens health — Agent health scores and trends
3
+ */
4
+ import { parseArgs } from 'node:util';
5
+ import { createClientFromConfig } from '../lib/client.js';
6
+ import { printTable, printJson } from '../lib/output.js';
7
+ const HELP = `Usage: agentlens health [options]
8
+
9
+ Display agent health scores and trends.
10
+
11
+ Options:
12
+ --agent <id> Show detailed health for a specific agent
13
+ --history Show health history trend (requires --agent)
14
+ --window <days> Time window in days (default: 7)
15
+ --format <fmt> Output format: table (default) or json
16
+ --url <url> Server URL (overrides config)
17
+ -h, --help Show help
18
+
19
+ Examples:
20
+ agentlens health Overview of all agents
21
+ agentlens health --agent my-agent Detailed score with dimensions
22
+ agentlens health --agent my-agent --history Score trend over time
23
+ agentlens health --format json Raw JSON output`;
24
+ /** Color-code a score: green (≥75), yellow (50-74), red (<50) */
25
+ function colorScore(score) {
26
+ if (score >= 75)
27
+ return `\x1b[32m${score}\x1b[0m`; // green
28
+ if (score >= 50)
29
+ return `\x1b[33m${score}\x1b[0m`; // yellow
30
+ return `\x1b[31m${score}\x1b[0m`; // red
31
+ }
32
+ /** Trend arrow */
33
+ function trendIcon(trend, delta) {
34
+ if (trend === 'improving')
35
+ return `↑ +${delta.toFixed(1)}`;
36
+ if (trend === 'degrading')
37
+ return `↓ ${delta.toFixed(1)}`;
38
+ return `→ ${delta.toFixed(1)}`;
39
+ }
40
+ export async function runHealthCommand(argv) {
41
+ const { values } = parseArgs({
42
+ args: argv,
43
+ options: {
44
+ agent: { type: 'string', short: 'a' },
45
+ history: { type: 'boolean', default: false },
46
+ window: { type: 'string', short: 'w' },
47
+ format: { type: 'string', short: 'f' },
48
+ url: { type: 'string' },
49
+ help: { type: 'boolean', short: 'h', default: false },
50
+ },
51
+ allowPositionals: false,
52
+ });
53
+ if (values.help) {
54
+ console.log(HELP);
55
+ return;
56
+ }
57
+ const client = createClientFromConfig(values.url);
58
+ const windowDays = values.window ? parseInt(values.window, 10) : undefined;
59
+ const isJson = values.format === 'json';
60
+ if (values.agent && values.history) {
61
+ // History trend for a specific agent
62
+ const snapshots = await client.getHealthHistory(values.agent, windowDays ?? 30);
63
+ if (isJson) {
64
+ printJson(snapshots);
65
+ return;
66
+ }
67
+ console.log(`\nHealth History — ${values.agent}\n`);
68
+ if (snapshots.length === 0) {
69
+ console.log('No history data available.');
70
+ return;
71
+ }
72
+ const headers = ['Date', 'Overall', 'Error Rate', 'Cost Eff.', 'Tool Succ.', 'Latency', 'Completion', 'Sessions'];
73
+ const rows = snapshots.map((s) => [
74
+ s.date,
75
+ colorScore(s.overallScore),
76
+ colorScore(s.errorRateScore),
77
+ colorScore(s.costEfficiencyScore),
78
+ colorScore(s.toolSuccessScore),
79
+ colorScore(s.latencyScore),
80
+ colorScore(s.completionRateScore),
81
+ String(s.sessionCount),
82
+ ]);
83
+ printTable(headers, rows);
84
+ }
85
+ else if (values.agent) {
86
+ // Detailed health for a single agent
87
+ const health = await client.getHealth(values.agent, windowDays);
88
+ if (isJson) {
89
+ printJson(health);
90
+ return;
91
+ }
92
+ console.log(`\nAgent Health — ${health.agentId}\n`);
93
+ console.log(` Overall Score: ${colorScore(health.overallScore)} ${trendIcon(health.trend, health.trendDelta)}`);
94
+ console.log(` Sessions: ${health.sessionCount}`);
95
+ console.log(` Window: ${health.window.from} → ${health.window.to}`);
96
+ console.log(` Computed at: ${health.computedAt}`);
97
+ console.log('');
98
+ const headers = ['Dimension', 'Score', 'Weight', 'Raw Value', 'Description'];
99
+ const rows = health.dimensions.map((d) => [
100
+ d.name,
101
+ colorScore(d.score),
102
+ d.weight.toFixed(2),
103
+ String(d.rawValue),
104
+ d.description,
105
+ ]);
106
+ printTable(headers, rows);
107
+ }
108
+ else {
109
+ // Overview of all agents
110
+ const scores = await client.getHealthOverview(windowDays);
111
+ if (isJson) {
112
+ printJson(scores);
113
+ return;
114
+ }
115
+ console.log('\nAgent Health Overview\n');
116
+ if (scores.length === 0) {
117
+ console.log('No agents found.');
118
+ return;
119
+ }
120
+ const headers = ['Agent', 'Score', 'Trend', 'Sessions', 'Window'];
121
+ const rows = scores.map((s) => [
122
+ s.agentId,
123
+ colorScore(s.overallScore),
124
+ trendIcon(s.trend, s.trendDelta),
125
+ String(s.sessionCount),
126
+ `${s.window.from.slice(0, 10)} → ${s.window.to.slice(0, 10)}`,
127
+ ]);
128
+ printTable(headers, rows);
129
+ }
130
+ }
131
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runLessonsCommand(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=lessons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lessons.d.ts","sourceRoot":"","sources":["../../src/commands/lessons.ts"],"names":[],"mappings":"AAqDA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCrE"}