@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.
- package/dist/__tests__/health-optimize.test.d.ts +2 -0
- package/dist/__tests__/health-optimize.test.d.ts.map +1 -0
- package/dist/__tests__/health-optimize.test.js +181 -0
- package/dist/__tests__/health-optimize.test.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/health.d.ts +2 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +131 -0
- package/dist/commands/health.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/optimize.d.ts +2 -0
- package/dist/commands/optimize.d.ts.map +1 -0
- package/dist/commands/optimize.js +88 -0
- package/dist/commands/optimize.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/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/LICENSE +0 -21
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens lessons — Manage agent lessons (CRUD + search)
|
|
3
|
+
*/
|
|
4
|
+
import { parseArgs } from 'node:util';
|
|
5
|
+
import { createClientFromConfig } from '../lib/client.js';
|
|
6
|
+
import { printTable, printJson, truncate, formatTimestamp } from '../lib/output.js';
|
|
7
|
+
const HELP = `Usage: agentlens lessons <subcommand> [options]
|
|
8
|
+
|
|
9
|
+
Manage agent lessons — distilled insights and knowledge.
|
|
10
|
+
|
|
11
|
+
Subcommands:
|
|
12
|
+
list List lessons
|
|
13
|
+
create Create a new lesson
|
|
14
|
+
get <id> Get a lesson by ID
|
|
15
|
+
update <id> Update a lesson
|
|
16
|
+
delete <id> Delete (archive) a lesson
|
|
17
|
+
search <query> Search lessons by text
|
|
18
|
+
|
|
19
|
+
Options (common):
|
|
20
|
+
--url <url> Server URL (overrides config)
|
|
21
|
+
-j, --json Output raw JSON
|
|
22
|
+
-h, --help Show help
|
|
23
|
+
|
|
24
|
+
Options (list):
|
|
25
|
+
--category <cat> Filter by category
|
|
26
|
+
--importance <level> Filter by importance: low|normal|high|critical
|
|
27
|
+
--agent <id> Filter by agent ID
|
|
28
|
+
--limit <n> Max results (default: 20)
|
|
29
|
+
--offset <n> Pagination offset
|
|
30
|
+
|
|
31
|
+
Options (create):
|
|
32
|
+
--title <title> Lesson title (required)
|
|
33
|
+
--content <text> Lesson content (required)
|
|
34
|
+
--category <cat> Category (default: general)
|
|
35
|
+
--importance <level> Importance: low|normal|high|critical (default: normal)
|
|
36
|
+
--agent <id> Agent ID to scope the lesson to
|
|
37
|
+
|
|
38
|
+
Options (update):
|
|
39
|
+
--title <title> New title
|
|
40
|
+
--content <text> New content
|
|
41
|
+
--category <cat> New category
|
|
42
|
+
--importance <level> New importance level
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
agentlens lessons list
|
|
46
|
+
agentlens lessons list --category deployment --importance high
|
|
47
|
+
agentlens lessons create --title "Always run tests" --content "Run test suite before deploying" --category deployment
|
|
48
|
+
agentlens lessons get abc123
|
|
49
|
+
agentlens lessons update abc123 --content "updated content"
|
|
50
|
+
agentlens lessons delete abc123
|
|
51
|
+
agentlens lessons search "deployment best practices"`;
|
|
52
|
+
export async function runLessonsCommand(argv) {
|
|
53
|
+
const subcommand = argv[0];
|
|
54
|
+
const rest = argv.slice(1);
|
|
55
|
+
switch (subcommand) {
|
|
56
|
+
case 'list':
|
|
57
|
+
await runLessonsList(rest);
|
|
58
|
+
break;
|
|
59
|
+
case 'create':
|
|
60
|
+
await runLessonsCreate(rest);
|
|
61
|
+
break;
|
|
62
|
+
case 'get':
|
|
63
|
+
await runLessonsGet(rest);
|
|
64
|
+
break;
|
|
65
|
+
case 'update':
|
|
66
|
+
await runLessonsUpdate(rest);
|
|
67
|
+
break;
|
|
68
|
+
case 'delete':
|
|
69
|
+
await runLessonsDelete(rest);
|
|
70
|
+
break;
|
|
71
|
+
case 'search':
|
|
72
|
+
await runLessonsSearch(rest);
|
|
73
|
+
break;
|
|
74
|
+
case '--help':
|
|
75
|
+
case '-h':
|
|
76
|
+
case undefined:
|
|
77
|
+
console.log(HELP);
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
console.error(`Unknown lessons subcommand: ${subcommand}`);
|
|
81
|
+
console.log(HELP);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function parseLessonsArgs(argv) {
|
|
86
|
+
return parseArgs({
|
|
87
|
+
args: argv,
|
|
88
|
+
options: {
|
|
89
|
+
title: { type: 'string' },
|
|
90
|
+
content: { type: 'string' },
|
|
91
|
+
category: { type: 'string' },
|
|
92
|
+
importance: { type: 'string' },
|
|
93
|
+
agent: { type: 'string', short: 'a' },
|
|
94
|
+
limit: { type: 'string', short: 'l' },
|
|
95
|
+
offset: { type: 'string' },
|
|
96
|
+
url: { type: 'string' },
|
|
97
|
+
json: { type: 'boolean', short: 'j', default: false },
|
|
98
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
99
|
+
},
|
|
100
|
+
allowPositionals: true,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* agentlens lessons list
|
|
105
|
+
*/
|
|
106
|
+
async function runLessonsList(argv) {
|
|
107
|
+
const { values } = parseLessonsArgs(argv);
|
|
108
|
+
if (values.help) {
|
|
109
|
+
console.log(`Usage: agentlens lessons list [options]
|
|
110
|
+
|
|
111
|
+
List lessons with optional filters.
|
|
112
|
+
|
|
113
|
+
Options:
|
|
114
|
+
--category <cat> Filter by category
|
|
115
|
+
--importance <level> Filter by importance: low|normal|high|critical
|
|
116
|
+
--agent <id> Filter by agent ID
|
|
117
|
+
--limit <n> Max results (default: 20)
|
|
118
|
+
--offset <n> Pagination offset
|
|
119
|
+
--url <url> Server URL
|
|
120
|
+
-j, --json Output raw JSON
|
|
121
|
+
-h, --help Show help`);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const client = createClientFromConfig(values.url);
|
|
125
|
+
const result = await client.getLessons({
|
|
126
|
+
category: values.category ?? undefined,
|
|
127
|
+
importance: values.importance ?? undefined,
|
|
128
|
+
agentId: values.agent ?? undefined,
|
|
129
|
+
limit: values.limit ? parseInt(values.limit, 10) : 20,
|
|
130
|
+
offset: values.offset ? parseInt(values.offset, 10) : undefined,
|
|
131
|
+
});
|
|
132
|
+
if (values.json) {
|
|
133
|
+
printJson(result);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (result.lessons.length === 0) {
|
|
137
|
+
console.log('No lessons found.');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const headers = ['ID', 'Category', 'Importance', 'Title', 'Created'];
|
|
141
|
+
const rows = result.lessons.map((l) => [
|
|
142
|
+
truncate(l.id, 16),
|
|
143
|
+
l.category,
|
|
144
|
+
l.importance,
|
|
145
|
+
truncate(l.title, 40),
|
|
146
|
+
formatTimestamp(l.createdAt),
|
|
147
|
+
]);
|
|
148
|
+
printTable(headers, rows);
|
|
149
|
+
console.log(`\n${result.lessons.length} of ${result.total} lesson(s).`);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* agentlens lessons create
|
|
153
|
+
*/
|
|
154
|
+
async function runLessonsCreate(argv) {
|
|
155
|
+
const { values } = parseLessonsArgs(argv);
|
|
156
|
+
if (values.help) {
|
|
157
|
+
console.log(`Usage: agentlens lessons create [options]
|
|
158
|
+
|
|
159
|
+
Create a new lesson.
|
|
160
|
+
|
|
161
|
+
Options:
|
|
162
|
+
--title <title> Lesson title (required)
|
|
163
|
+
--content <text> Lesson content (required)
|
|
164
|
+
--category <cat> Category (default: general)
|
|
165
|
+
--importance <level> Importance: low|normal|high|critical (default: normal)
|
|
166
|
+
--agent <id> Agent ID
|
|
167
|
+
--url <url> Server URL
|
|
168
|
+
-j, --json Output raw JSON
|
|
169
|
+
-h, --help Show help`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (!values.title) {
|
|
173
|
+
console.error('Error: --title is required.');
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
if (!values.content) {
|
|
177
|
+
console.error('Error: --content is required.');
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
const client = createClientFromConfig(values.url);
|
|
181
|
+
const lesson = await client.createLesson({
|
|
182
|
+
title: values.title,
|
|
183
|
+
content: values.content,
|
|
184
|
+
category: values.category ?? undefined,
|
|
185
|
+
importance: values.importance ?? undefined,
|
|
186
|
+
agentId: values.agent ?? undefined,
|
|
187
|
+
});
|
|
188
|
+
if (values.json) {
|
|
189
|
+
printJson(lesson);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
console.log(`\nLesson created: ${lesson.id}`);
|
|
193
|
+
console.log(` Title: ${lesson.title}`);
|
|
194
|
+
console.log(` Category: ${lesson.category}`);
|
|
195
|
+
console.log(` Importance: ${lesson.importance}`);
|
|
196
|
+
console.log('');
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* agentlens lessons get <id>
|
|
200
|
+
*/
|
|
201
|
+
async function runLessonsGet(argv) {
|
|
202
|
+
const { values, positionals } = parseLessonsArgs(argv);
|
|
203
|
+
if (values.help) {
|
|
204
|
+
console.log(`Usage: agentlens lessons get <id> [options]
|
|
205
|
+
|
|
206
|
+
Get a lesson by ID with full details.
|
|
207
|
+
|
|
208
|
+
Options:
|
|
209
|
+
--url <url> Server URL
|
|
210
|
+
-j, --json Output raw JSON
|
|
211
|
+
-h, --help Show help`);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const id = positionals[0];
|
|
215
|
+
if (!id) {
|
|
216
|
+
console.error('Error: Lesson ID is required.');
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
const client = createClientFromConfig(values.url);
|
|
220
|
+
const lesson = await client.getLesson(id);
|
|
221
|
+
if (values.json) {
|
|
222
|
+
printJson(lesson);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
console.log('');
|
|
226
|
+
console.log(`Lesson: ${lesson.id}`);
|
|
227
|
+
console.log(` Title: ${lesson.title}`);
|
|
228
|
+
console.log(` Category: ${lesson.category}`);
|
|
229
|
+
console.log(` Importance: ${lesson.importance}`);
|
|
230
|
+
console.log(` Created: ${formatTimestamp(lesson.createdAt)}`);
|
|
231
|
+
console.log(` Updated: ${formatTimestamp(lesson.updatedAt)}`);
|
|
232
|
+
console.log(` Access Count: ${lesson.accessCount}`);
|
|
233
|
+
if (lesson.agentId) {
|
|
234
|
+
console.log(` Agent: ${lesson.agentId}`);
|
|
235
|
+
}
|
|
236
|
+
if (lesson.sourceSessionId) {
|
|
237
|
+
console.log(` Source Session: ${lesson.sourceSessionId}`);
|
|
238
|
+
}
|
|
239
|
+
console.log('');
|
|
240
|
+
console.log('Content:');
|
|
241
|
+
console.log(` ${lesson.content}`);
|
|
242
|
+
console.log('');
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* agentlens lessons update <id>
|
|
246
|
+
*/
|
|
247
|
+
async function runLessonsUpdate(argv) {
|
|
248
|
+
const { values, positionals } = parseLessonsArgs(argv);
|
|
249
|
+
if (values.help) {
|
|
250
|
+
console.log(`Usage: agentlens lessons update <id> [options]
|
|
251
|
+
|
|
252
|
+
Update an existing lesson.
|
|
253
|
+
|
|
254
|
+
Options:
|
|
255
|
+
--title <title> New title
|
|
256
|
+
--content <text> New content
|
|
257
|
+
--category <cat> New category
|
|
258
|
+
--importance <level> New importance level
|
|
259
|
+
--url <url> Server URL
|
|
260
|
+
-j, --json Output raw JSON
|
|
261
|
+
-h, --help Show help`);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const id = positionals[0];
|
|
265
|
+
if (!id) {
|
|
266
|
+
console.error('Error: Lesson ID is required.');
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
const updates = {};
|
|
270
|
+
if (values.title)
|
|
271
|
+
updates.title = values.title;
|
|
272
|
+
if (values.content)
|
|
273
|
+
updates.content = values.content;
|
|
274
|
+
if (values.category)
|
|
275
|
+
updates.category = values.category;
|
|
276
|
+
if (values.importance)
|
|
277
|
+
updates.importance = values.importance;
|
|
278
|
+
if (Object.keys(updates).length === 0) {
|
|
279
|
+
console.error('Error: At least one field to update is required (--title, --content, --category, --importance).');
|
|
280
|
+
process.exit(1);
|
|
281
|
+
}
|
|
282
|
+
const client = createClientFromConfig(values.url);
|
|
283
|
+
const lesson = await client.updateLesson(id, updates);
|
|
284
|
+
if (values.json) {
|
|
285
|
+
printJson(lesson);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
console.log(`\nLesson updated: ${lesson.id}`);
|
|
289
|
+
console.log(` Title: ${lesson.title}`);
|
|
290
|
+
console.log(` Category: ${lesson.category}`);
|
|
291
|
+
console.log(` Importance: ${lesson.importance}`);
|
|
292
|
+
console.log('');
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* agentlens lessons delete <id>
|
|
296
|
+
*/
|
|
297
|
+
async function runLessonsDelete(argv) {
|
|
298
|
+
const { values, positionals } = parseLessonsArgs(argv);
|
|
299
|
+
if (values.help) {
|
|
300
|
+
console.log(`Usage: agentlens lessons delete <id> [options]
|
|
301
|
+
|
|
302
|
+
Delete (archive) a lesson.
|
|
303
|
+
|
|
304
|
+
Options:
|
|
305
|
+
--url <url> Server URL
|
|
306
|
+
-j, --json Output raw JSON
|
|
307
|
+
-h, --help Show help`);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const id = positionals[0];
|
|
311
|
+
if (!id) {
|
|
312
|
+
console.error('Error: Lesson ID is required.');
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
const client = createClientFromConfig(values.url);
|
|
316
|
+
const result = await client.deleteLesson(id);
|
|
317
|
+
if (values.json) {
|
|
318
|
+
printJson(result);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
console.log(`Lesson ${id} archived successfully.`);
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* agentlens lessons search <query>
|
|
325
|
+
*/
|
|
326
|
+
async function runLessonsSearch(argv) {
|
|
327
|
+
const { values, positionals } = parseLessonsArgs(argv);
|
|
328
|
+
if (values.help) {
|
|
329
|
+
console.log(`Usage: agentlens lessons search <query> [options]
|
|
330
|
+
|
|
331
|
+
Search lessons by text.
|
|
332
|
+
|
|
333
|
+
Options:
|
|
334
|
+
--category <cat> Filter by category
|
|
335
|
+
--agent <id> Filter by agent ID
|
|
336
|
+
--limit <n> Max results (default: 20)
|
|
337
|
+
--url <url> Server URL
|
|
338
|
+
-j, --json Output raw JSON
|
|
339
|
+
-h, --help Show help`);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const query = positionals[0];
|
|
343
|
+
if (!query) {
|
|
344
|
+
console.error('Error: Search query is required.');
|
|
345
|
+
process.exit(1);
|
|
346
|
+
}
|
|
347
|
+
const client = createClientFromConfig(values.url);
|
|
348
|
+
const result = await client.getLessons({
|
|
349
|
+
search: query,
|
|
350
|
+
category: values.category ?? undefined,
|
|
351
|
+
agentId: values.agent ?? undefined,
|
|
352
|
+
limit: values.limit ? parseInt(values.limit, 10) : 20,
|
|
353
|
+
});
|
|
354
|
+
if (values.json) {
|
|
355
|
+
printJson(result);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (result.lessons.length === 0) {
|
|
359
|
+
console.log(`No lessons found matching "${query}".`);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const headers = ['ID', 'Category', 'Importance', 'Title', 'Preview'];
|
|
363
|
+
const rows = result.lessons.map((l) => [
|
|
364
|
+
truncate(l.id, 16),
|
|
365
|
+
l.category,
|
|
366
|
+
l.importance,
|
|
367
|
+
truncate(l.title, 30),
|
|
368
|
+
truncate(l.content.replace(/\n/g, ' '), 40),
|
|
369
|
+
]);
|
|
370
|
+
printTable(headers, rows);
|
|
371
|
+
console.log(`\n${result.lessons.length} of ${result.total} lesson(s) matching "${query}".`);
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=lessons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lessons.js","sourceRoot":"","sources":["../../src/commands/lessons.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../../src/commands/optimize.ts"],"names":[],"mappings":"AAuCA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDtE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens optimize — Cost optimization recommendations
|
|
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 optimize [options]
|
|
8
|
+
|
|
9
|
+
Display cost optimization recommendations.
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
--agent <id> Filter recommendations for a specific agent
|
|
13
|
+
--period <days> Analysis period in days (default: 30)
|
|
14
|
+
--limit <n> Maximum recommendations (default: 10)
|
|
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 optimize All recommendations
|
|
21
|
+
agentlens optimize --agent my-agent Agent-specific recommendations
|
|
22
|
+
agentlens optimize --period 7 --limit 5 Last 7 days, top 5
|
|
23
|
+
agentlens optimize --format json Raw JSON output`;
|
|
24
|
+
/** Color-code a confidence level */
|
|
25
|
+
function colorConfidence(confidence) {
|
|
26
|
+
if (confidence === 'high')
|
|
27
|
+
return `\x1b[32m${confidence}\x1b[0m`; // green
|
|
28
|
+
if (confidence === 'medium')
|
|
29
|
+
return `\x1b[33m${confidence}\x1b[0m`; // yellow
|
|
30
|
+
return `\x1b[31m${confidence}\x1b[0m`; // red
|
|
31
|
+
}
|
|
32
|
+
/** Color-code a score: green (≥75), yellow (50-74), red (<50) */
|
|
33
|
+
function colorScore(score) {
|
|
34
|
+
if (score >= 75)
|
|
35
|
+
return `\x1b[32m${score}\x1b[0m`;
|
|
36
|
+
if (score >= 50)
|
|
37
|
+
return `\x1b[33m${score}\x1b[0m`;
|
|
38
|
+
return `\x1b[31m${score}\x1b[0m`;
|
|
39
|
+
}
|
|
40
|
+
export async function runOptimizeCommand(argv) {
|
|
41
|
+
const { values } = parseArgs({
|
|
42
|
+
args: argv,
|
|
43
|
+
options: {
|
|
44
|
+
agent: { type: 'string', short: 'a' },
|
|
45
|
+
period: { type: 'string', short: 'p' },
|
|
46
|
+
limit: { type: 'string', short: 'l' },
|
|
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 isJson = values.format === 'json';
|
|
59
|
+
const result = await client.getOptimizationRecommendations({
|
|
60
|
+
agentId: values.agent ?? undefined,
|
|
61
|
+
period: values.period ? parseInt(values.period, 10) : undefined,
|
|
62
|
+
limit: values.limit ? parseInt(values.limit, 10) : undefined,
|
|
63
|
+
});
|
|
64
|
+
if (isJson) {
|
|
65
|
+
printJson(result);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
console.log('\nOptimization Recommendations\n');
|
|
69
|
+
if (result.recommendations.length === 0) {
|
|
70
|
+
console.log('No recommendations found.');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
console.log(` Period: ${result.period} days`);
|
|
74
|
+
console.log(` Analyzed Calls: ${result.analyzedCalls.toLocaleString()}`);
|
|
75
|
+
console.log(` Potential Savings: $${result.totalPotentialSavings.toFixed(2)}/month`);
|
|
76
|
+
console.log('');
|
|
77
|
+
const headers = ['Agent', 'Current Model', 'Recommended', 'Tier', 'Savings/mo', 'Confidence'];
|
|
78
|
+
const rows = result.recommendations.map((r) => [
|
|
79
|
+
truncate(r.agentId, 20),
|
|
80
|
+
truncate(r.currentModel, 22),
|
|
81
|
+
truncate(r.recommendedModel, 22),
|
|
82
|
+
r.complexityTier,
|
|
83
|
+
`$${r.monthlySavings.toFixed(2)}`,
|
|
84
|
+
colorConfidence(r.confidence),
|
|
85
|
+
]);
|
|
86
|
+
printTable(headers, rows);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=optimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/commands/optimize.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"}
|