@agentlensai/cli 0.10.0 → 0.13.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/LICENSE +21 -0
- package/dist/__tests__/migrate.test.d.ts +8 -0
- package/dist/__tests__/migrate.test.d.ts.map +1 -0
- package/dist/__tests__/migrate.test.js +153 -0
- package/dist/__tests__/migrate.test.js.map +1 -0
- package/dist/commands/audit.d.ts +2 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +119 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/diagnose.d.ts +2 -0
- package/dist/commands/diagnose.d.ts.map +1 -0
- package/dist/commands/diagnose.js +148 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/lessons.d.ts +7 -1
- package/dist/commands/lessons.d.ts.map +1 -1
- package/dist/commands/lessons.js +13 -367
- package/dist/commands/lessons.js.map +1 -1
- package/dist/commands/migrate.d.ts +30 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +342 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/index.js +17 -2
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Amit Paz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/migrate.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration CLI Tests (S-8.4)
|
|
3
|
+
*
|
|
4
|
+
* Tests for the `agentlens migrate` command: SQLite export,
|
|
5
|
+
* progress tracking, resume, and reverse migration.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
8
|
+
import { existsSync, writeFileSync, readFileSync, mkdirSync, unlinkSync, rmSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
function getErrorMessage(err) {
|
|
11
|
+
if (err instanceof Error)
|
|
12
|
+
return err.message;
|
|
13
|
+
return String(err);
|
|
14
|
+
}
|
|
15
|
+
import { tmpdir } from 'node:os';
|
|
16
|
+
import { exportFromSqlite } from '../commands/migrate.js';
|
|
17
|
+
// ═══════════════════════════════════════════
|
|
18
|
+
// SQLite Export Tests
|
|
19
|
+
// ═══════════════════════════════════════════
|
|
20
|
+
describe('S-8.4: Migration CLI', () => {
|
|
21
|
+
describe('exportFromSqlite', () => {
|
|
22
|
+
it('throws if database file not found', async () => {
|
|
23
|
+
await expect(exportFromSqlite('/nonexistent/db.sqlite')).rejects.toThrow('SQLite database not found');
|
|
24
|
+
});
|
|
25
|
+
// Note: Tests that require better-sqlite3 are integration tests.
|
|
26
|
+
// Unit tests mock at the boundary.
|
|
27
|
+
it('throws if better-sqlite3 is not available', async () => {
|
|
28
|
+
// Create a dummy file so the existence check passes
|
|
29
|
+
const tmpFile = join(tmpdir(), `test-migrate-${Date.now()}.db`);
|
|
30
|
+
writeFileSync(tmpFile, '');
|
|
31
|
+
// The import will fail because better-sqlite3 isn't typically available in test env
|
|
32
|
+
// This test verifies the error message is helpful
|
|
33
|
+
try {
|
|
34
|
+
await exportFromSqlite(tmpFile);
|
|
35
|
+
// If better-sqlite3 IS installed, the file won't be a valid SQLite DB
|
|
36
|
+
// so it will throw a different error — that's fine too
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
expect(getErrorMessage(err)).toMatch(/better-sqlite3|not a database|SQLite/i);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
try {
|
|
43
|
+
unlinkSync(tmpFile);
|
|
44
|
+
}
|
|
45
|
+
catch { }
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
describe('NDJSON format', () => {
|
|
50
|
+
it('each record has _type and _version fields', () => {
|
|
51
|
+
const records = [
|
|
52
|
+
{ _type: 'agent', _version: 1, id: 'a1', name: 'Test' },
|
|
53
|
+
{ _type: 'session', _version: 1, id: 's1', agent_id: 'a1' },
|
|
54
|
+
{ _type: 'event', _version: 1, id: 'e1', session_id: 's1', type: 'llm_call' },
|
|
55
|
+
];
|
|
56
|
+
for (const rec of records) {
|
|
57
|
+
const line = JSON.stringify(rec);
|
|
58
|
+
const parsed = JSON.parse(line);
|
|
59
|
+
expect(parsed._type).toBeDefined();
|
|
60
|
+
expect(parsed._version).toBe(1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
it('checksum record has sha256 and counts', () => {
|
|
64
|
+
const checksum = {
|
|
65
|
+
_type: 'checksum',
|
|
66
|
+
sha256: 'a'.repeat(64),
|
|
67
|
+
counts: { agent: 1, session: 2, event: 5 },
|
|
68
|
+
exported_at: '2026-01-15T12:00:00Z',
|
|
69
|
+
};
|
|
70
|
+
const parsed = JSON.parse(JSON.stringify(checksum));
|
|
71
|
+
expect(parsed.sha256).toHaveLength(64);
|
|
72
|
+
expect(parsed.counts.agent).toBe(1);
|
|
73
|
+
expect(parsed.counts.session).toBe(2);
|
|
74
|
+
expect(parsed.counts.event).toBe(5);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('progress tracking', () => {
|
|
78
|
+
it('state file tracks migration progress', () => {
|
|
79
|
+
const state = {
|
|
80
|
+
direction: 'up',
|
|
81
|
+
phase: 'upload',
|
|
82
|
+
exportFile: '/tmp/export.ndjson',
|
|
83
|
+
lastUploadedLine: 250,
|
|
84
|
+
totalLines: 1000,
|
|
85
|
+
counts: { agent: 5, session: 20, event: 225 },
|
|
86
|
+
};
|
|
87
|
+
// Verify state structure is serializable
|
|
88
|
+
const serialized = JSON.stringify(state);
|
|
89
|
+
const deserialized = JSON.parse(serialized);
|
|
90
|
+
expect(deserialized.lastUploadedLine).toBe(250);
|
|
91
|
+
expect(deserialized.phase).toBe('upload');
|
|
92
|
+
});
|
|
93
|
+
it('resume starts from lastUploadedLine', () => {
|
|
94
|
+
const state = {
|
|
95
|
+
direction: 'up',
|
|
96
|
+
phase: 'upload',
|
|
97
|
+
lastUploadedLine: 500,
|
|
98
|
+
totalLines: 1000,
|
|
99
|
+
};
|
|
100
|
+
// Simulate batch calculation
|
|
101
|
+
const batchSize = 100;
|
|
102
|
+
const startLine = state.lastUploadedLine;
|
|
103
|
+
const batches = [];
|
|
104
|
+
for (let i = startLine; i < state.totalLines; i += batchSize) {
|
|
105
|
+
batches.push(i);
|
|
106
|
+
}
|
|
107
|
+
expect(batches[0]).toBe(500); // Starts from where we left off
|
|
108
|
+
expect(batches.length).toBe(5); // 500-1000 in batches of 100
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('verification', () => {
|
|
112
|
+
it('count comparison detects mismatches', () => {
|
|
113
|
+
const localCounts = { agent: 5, session: 20, event: 100 };
|
|
114
|
+
const remoteCounts = { agent: 5, session: 20, event: 95 };
|
|
115
|
+
const mismatches = [];
|
|
116
|
+
for (const [type, count] of Object.entries(localCounts)) {
|
|
117
|
+
const remote = remoteCounts[type] ?? 0;
|
|
118
|
+
if (remote < count) {
|
|
119
|
+
mismatches.push(type);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
expect(mismatches).toContain('event');
|
|
123
|
+
expect(mismatches).not.toContain('agent');
|
|
124
|
+
});
|
|
125
|
+
it('count comparison passes when all match', () => {
|
|
126
|
+
const localCounts = { agent: 5, session: 20, event: 100 };
|
|
127
|
+
const remoteCounts = { agent: 5, session: 20, event: 100 };
|
|
128
|
+
let allMatch = true;
|
|
129
|
+
for (const [type, count] of Object.entries(localCounts)) {
|
|
130
|
+
const remote = remoteCounts[type] ?? 0;
|
|
131
|
+
if (remote < count)
|
|
132
|
+
allMatch = false;
|
|
133
|
+
}
|
|
134
|
+
expect(allMatch).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('reverse migration (cloud → self-hosted)', () => {
|
|
138
|
+
it('NDJSON export file can be parsed line by line', () => {
|
|
139
|
+
const ndjson = [
|
|
140
|
+
'{"_type":"agent","_version":1,"id":"a1","name":"Test"}',
|
|
141
|
+
'{"_type":"session","_version":1,"id":"s1","agent_id":"a1","created_at":"2026-01-15T10:00:00Z"}',
|
|
142
|
+
'{"_type":"event","_version":1,"id":"e1","session_id":"s1","type":"llm_call","timestamp":"2026-01-15T10:00:01Z","data":{}}',
|
|
143
|
+
'{"_type":"checksum","sha256":"abc123","counts":{"agent":1,"session":1,"event":1},"exported_at":"2026-01-15T12:00:00Z"}',
|
|
144
|
+
].join('\n');
|
|
145
|
+
const lines = ndjson.split('\n').filter(Boolean);
|
|
146
|
+
expect(lines.length).toBe(4);
|
|
147
|
+
const records = lines.map((l) => JSON.parse(l));
|
|
148
|
+
const types = records.map((r) => r._type);
|
|
149
|
+
expect(types).toEqual(['agent', 'session', 'event', 'checksum']);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=migrate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.test.js","sourceRoot":"","sources":["../../src/__tests__/migrate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AA0BA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens audit — Audit trail verification
|
|
3
|
+
*/
|
|
4
|
+
import { parseArgs } from 'node:util';
|
|
5
|
+
import { writeFileSync } from 'node:fs';
|
|
6
|
+
import { createClientFromConfig } from '../lib/client.js';
|
|
7
|
+
import { printJson } from '../lib/output.js';
|
|
8
|
+
const HELP = `Usage: agentlens audit verify [options]
|
|
9
|
+
|
|
10
|
+
Verify audit trail hash chain integrity.
|
|
11
|
+
|
|
12
|
+
Options:
|
|
13
|
+
--from <date> Start date (ISO 8601)
|
|
14
|
+
--to <date> End date (ISO 8601)
|
|
15
|
+
--session-id <id> Verify a single session
|
|
16
|
+
--output <path> Save signed JSON report to file
|
|
17
|
+
--format <fmt> Output format: table (default) or json
|
|
18
|
+
--url <url> Server URL (overrides config)
|
|
19
|
+
-h, --help Show help
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
agentlens audit verify --from 2026-01-01 --to 2026-02-01
|
|
23
|
+
agentlens audit verify --session-id sess_abc
|
|
24
|
+
agentlens audit verify --from 2026-01-01 --to 2026-02-01 --output report.json`;
|
|
25
|
+
export async function runAuditCommand(argv) {
|
|
26
|
+
const subcommand = argv[0];
|
|
27
|
+
if (subcommand === 'verify') {
|
|
28
|
+
await runAuditVerify(argv.slice(1));
|
|
29
|
+
}
|
|
30
|
+
else if (subcommand === '--help' || subcommand === '-h' || !subcommand) {
|
|
31
|
+
console.log(HELP);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.error(`Unknown audit subcommand: ${subcommand}`);
|
|
35
|
+
console.log(HELP);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async function runAuditVerify(argv) {
|
|
40
|
+
const { values } = parseArgs({
|
|
41
|
+
args: argv,
|
|
42
|
+
options: {
|
|
43
|
+
from: { type: 'string' },
|
|
44
|
+
to: { type: 'string' },
|
|
45
|
+
'session-id': { type: 'string' },
|
|
46
|
+
output: { type: 'string' },
|
|
47
|
+
format: { type: 'string', default: 'table' },
|
|
48
|
+
url: { type: 'string' },
|
|
49
|
+
help: { type: 'boolean', short: 'h' },
|
|
50
|
+
},
|
|
51
|
+
strict: true,
|
|
52
|
+
});
|
|
53
|
+
if (values.help) {
|
|
54
|
+
console.log(HELP);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const sessionId = values['session-id'];
|
|
58
|
+
const from = values.from;
|
|
59
|
+
const to = values.to;
|
|
60
|
+
if (!sessionId && (!from || !to)) {
|
|
61
|
+
console.error('Error: Provide --from/--to or --session-id');
|
|
62
|
+
console.log(HELP);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
const client = createClientFromConfig(values.url);
|
|
66
|
+
const report = await client.verifyAudit({
|
|
67
|
+
from: from || undefined,
|
|
68
|
+
to: to || undefined,
|
|
69
|
+
sessionId: sessionId || undefined,
|
|
70
|
+
});
|
|
71
|
+
// Save to file if requested
|
|
72
|
+
if (values.output) {
|
|
73
|
+
writeFileSync(values.output, JSON.stringify(report, null, 2));
|
|
74
|
+
console.log(`Report saved to ${values.output}`);
|
|
75
|
+
}
|
|
76
|
+
// Output
|
|
77
|
+
if (values.format === 'json') {
|
|
78
|
+
printJson(report);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Human-readable table output
|
|
82
|
+
const statusIcon = report.verified ? '\x1b[32m✓ VERIFIED\x1b[0m' : '\x1b[31m✗ FAILED\x1b[0m';
|
|
83
|
+
console.log('');
|
|
84
|
+
console.log('Audit Trail Verification');
|
|
85
|
+
console.log('========================');
|
|
86
|
+
console.log(`Status: ${statusIcon}`);
|
|
87
|
+
console.log(`Verified: ${report.verifiedAt}`);
|
|
88
|
+
if (report.range) {
|
|
89
|
+
console.log(`Range: ${report.range.from} → ${report.range.to}`);
|
|
90
|
+
}
|
|
91
|
+
if (report.sessionId) {
|
|
92
|
+
console.log(`Session: ${report.sessionId}`);
|
|
93
|
+
}
|
|
94
|
+
console.log(`Sessions: ${report.sessionsVerified}`);
|
|
95
|
+
console.log(`Events: ${report.totalEvents.toLocaleString()}`);
|
|
96
|
+
console.log(`First Hash: ${report.firstHash ?? 'N/A'}`);
|
|
97
|
+
console.log(`Last Hash: ${report.lastHash ?? 'N/A'}`);
|
|
98
|
+
console.log(`Signed: ${report.signature ? 'Yes (hmac-sha256)' : 'No'}`);
|
|
99
|
+
if (report.brokenChains.length > 0) {
|
|
100
|
+
console.log('');
|
|
101
|
+
console.log('Broken Chains:');
|
|
102
|
+
console.log(' Session | Failed At | Event ID | Reason');
|
|
103
|
+
console.log(' ' + '─'.repeat(80));
|
|
104
|
+
for (const bc of report.brokenChains) {
|
|
105
|
+
console.log(` ${bc.sessionId.padEnd(12)}| index ${String(bc.failedAtIndex).padEnd(4)}| ${bc.failedEventId.padEnd(21)}| ${bc.reason}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.log('');
|
|
110
|
+
console.log('Broken Chains: None');
|
|
111
|
+
}
|
|
112
|
+
console.log('');
|
|
113
|
+
}
|
|
114
|
+
// Exit code
|
|
115
|
+
if (!report.verified) {
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;gFAgBmE,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAc;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAc;IAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACtB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YAC5C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;IAErB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,EAAE,IAAI,IAAI,SAAS;QACvB,EAAE,EAAE,EAAE,IAAI,SAAS;QACnB,SAAS,EAAE,SAAS,IAAI,SAAS;KAClC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,SAAS;IACT,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,SAAS,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,8BAA8B;QAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,yBAAyB,CAAC;QAC7F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5E,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YACzI,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,YAAY;IACZ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"AAyBA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEtE"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens diagnose — AI-powered diagnostics & root cause analysis [F18-S9]
|
|
3
|
+
*/
|
|
4
|
+
import { parseArgs } from 'node:util';
|
|
5
|
+
import { loadConfig } from '../lib/config.js';
|
|
6
|
+
import { printJson } from '../lib/output.js';
|
|
7
|
+
const HELP = `Usage: agentlens diagnose <agentId> [options]
|
|
8
|
+
agentlens diagnose --session <sessionId> [options]
|
|
9
|
+
|
|
10
|
+
Run AI-powered diagnostics on an agent or session.
|
|
11
|
+
|
|
12
|
+
Options:
|
|
13
|
+
--session <id> Diagnose a specific session instead of an agent
|
|
14
|
+
--window <N> Time window in days (default: 7, agent-level only)
|
|
15
|
+
--refresh Bypass cache and force fresh analysis
|
|
16
|
+
--url <url> Server URL (overrides config)
|
|
17
|
+
-j, --json Output raw JSON
|
|
18
|
+
-h, --help Show help
|
|
19
|
+
|
|
20
|
+
Examples:
|
|
21
|
+
agentlens diagnose my-coding-agent
|
|
22
|
+
agentlens diagnose my-agent --window 14 --refresh
|
|
23
|
+
agentlens diagnose --session sess_abc123 --json`;
|
|
24
|
+
export async function runDiagnoseCommand(argv) {
|
|
25
|
+
const { values, positionals } = parseArgs({
|
|
26
|
+
args: argv,
|
|
27
|
+
options: {
|
|
28
|
+
session: { type: 'string', short: 's' },
|
|
29
|
+
window: { type: 'string', short: 'w' },
|
|
30
|
+
refresh: { type: 'boolean', default: false },
|
|
31
|
+
url: { type: 'string' },
|
|
32
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
33
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
34
|
+
},
|
|
35
|
+
allowPositionals: true,
|
|
36
|
+
});
|
|
37
|
+
if (values.help) {
|
|
38
|
+
console.log(HELP);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const config = loadConfig();
|
|
42
|
+
const baseUrl = values.url ?? config.url;
|
|
43
|
+
const isSession = !!values.session;
|
|
44
|
+
if (!isSession && positionals.length === 0) {
|
|
45
|
+
console.error('Error: Provide an agent ID or use --session <id>');
|
|
46
|
+
console.log(HELP);
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
51
|
+
if (config.apiKey)
|
|
52
|
+
headers['Authorization'] = `Bearer ${config.apiKey}`;
|
|
53
|
+
let report;
|
|
54
|
+
if (isSession) {
|
|
55
|
+
const params = new URLSearchParams();
|
|
56
|
+
if (values.refresh)
|
|
57
|
+
params.set('refresh', 'true');
|
|
58
|
+
const qs = params.toString() ? `?${params}` : '';
|
|
59
|
+
const res = await fetch(`${baseUrl}/api/sessions/${values.session}/diagnose${qs}`, {
|
|
60
|
+
method: 'POST',
|
|
61
|
+
headers,
|
|
62
|
+
});
|
|
63
|
+
report = (await res.json());
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const agentId = positionals[0];
|
|
67
|
+
const params = new URLSearchParams();
|
|
68
|
+
if (values.window)
|
|
69
|
+
params.set('window', values.window);
|
|
70
|
+
if (values.refresh)
|
|
71
|
+
params.set('refresh', 'true');
|
|
72
|
+
const qs = params.toString() ? `?${params}` : '';
|
|
73
|
+
const res = await fetch(`${baseUrl}/api/agents/${agentId}/diagnose${qs}`, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers,
|
|
76
|
+
});
|
|
77
|
+
report = (await res.json());
|
|
78
|
+
}
|
|
79
|
+
if (values.json) {
|
|
80
|
+
printJson(report);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
formatReport(report);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
87
|
+
console.error(`Error: ${msg}`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function formatReport(r) {
|
|
92
|
+
const severity = r.severity;
|
|
93
|
+
const icon = severity === 'critical'
|
|
94
|
+
? '🔴'
|
|
95
|
+
: severity === 'warning'
|
|
96
|
+
? '⚠️'
|
|
97
|
+
: severity === 'info'
|
|
98
|
+
? 'ℹ️'
|
|
99
|
+
: '✅';
|
|
100
|
+
const label = severity.toUpperCase();
|
|
101
|
+
const target = r.type === 'session' ? `Session: ${r.targetId}` : `Agent: ${r.targetId}`;
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log(`╔${'═'.repeat(50)}╗`);
|
|
104
|
+
console.log(`║ ${icon} ${label} — ${target}`.padEnd(51) + '║');
|
|
105
|
+
console.log(`╚${'═'.repeat(50)}╝`);
|
|
106
|
+
if (r.healthScore !== undefined) {
|
|
107
|
+
console.log(`\nHealth Score: ${r.healthScore}/100`);
|
|
108
|
+
}
|
|
109
|
+
console.log(`\nSummary:\n ${r.summary}`);
|
|
110
|
+
const rootCauses = r.rootCauses;
|
|
111
|
+
if (rootCauses && rootCauses.length > 0) {
|
|
112
|
+
console.log('\nRoot Causes:');
|
|
113
|
+
for (let i = 0; i < rootCauses.length; i++) {
|
|
114
|
+
const rc = rootCauses[i];
|
|
115
|
+
const conf = rc.confidence ?? 0;
|
|
116
|
+
const level = conf >= 0.7 ? 'HIGH' : conf >= 0.4 ? 'MED ' : 'LOW ';
|
|
117
|
+
console.log(` ${i + 1}. [${level} ${conf.toFixed(2)}] ${rc.description}`);
|
|
118
|
+
console.log(` Category: ${rc.category}`);
|
|
119
|
+
const evidence = rc.evidence;
|
|
120
|
+
if (evidence && evidence.length > 0) {
|
|
121
|
+
console.log(' Evidence:');
|
|
122
|
+
for (const e of evidence) {
|
|
123
|
+
console.log(` • ${e.summary}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const recs = r.recommendations;
|
|
129
|
+
if (recs && recs.length > 0) {
|
|
130
|
+
console.log('\nRecommendations:');
|
|
131
|
+
for (const rec of recs) {
|
|
132
|
+
const p = (rec.priority ?? 'low').toUpperCase();
|
|
133
|
+
console.log(` ▸ [${p}] ${rec.action}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const meta = r.llmMeta;
|
|
137
|
+
if (meta && meta.provider !== 'none') {
|
|
138
|
+
console.log('');
|
|
139
|
+
console.log('─'.repeat(52));
|
|
140
|
+
const cost = meta.estimatedCostUsd ?? 0;
|
|
141
|
+
console.log(`Model: ${meta.model} | Tokens: ${meta.inputTokens} in / ${meta.outputTokens} out | Cost: ~$${cost.toFixed(4)} | ${(meta.latencyMs / 1000).toFixed(1)}s`);
|
|
142
|
+
}
|
|
143
|
+
if (r.source === 'fallback') {
|
|
144
|
+
console.log('\n⚠ AI diagnostics unavailable — showing heuristic analysis');
|
|
145
|
+
}
|
|
146
|
+
console.log('');
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* agentlens lessons — DEPRECATED
|
|
3
|
+
*
|
|
4
|
+
* Lesson methods have been removed from AgentLens SDK.
|
|
5
|
+
* Use lore-sdk directly: https://github.com/amitpaz1/lore
|
|
6
|
+
*/
|
|
7
|
+
export declare function lessonsCommand(_args: string[]): Promise<void>;
|
|
2
8
|
//# sourceMappingURL=lessons.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lessons.d.ts","sourceRoot":"","sources":["../../src/commands/lessons.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lessons.d.ts","sourceRoot":"","sources":["../../src/commands/lessons.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnE"}
|