@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/dist/commands/lessons.js
CHANGED
|
@@ -1,373 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* agentlens lessons —
|
|
2
|
+
* agentlens lessons — DEPRECATED
|
|
3
|
+
*
|
|
4
|
+
* Lesson methods have been removed from AgentLens SDK.
|
|
5
|
+
* Use lore-sdk directly: https://github.com/amitpaz1/lore
|
|
3
6
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { printTable, printJson, truncate, formatTimestamp } from '../lib/output.js';
|
|
7
|
-
const HELP = `Usage: agentlens lessons <subcommand> [options]
|
|
7
|
+
const DEPRECATION_NOTICE = `
|
|
8
|
+
⚠️ The "agentlens lessons" command is deprecated.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
Lesson management has moved to the standalone Lore SDK.
|
|
11
|
+
See: https://github.com/amitpaz1/lore
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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}".`);
|
|
13
|
+
Install: npm install lore-sdk
|
|
14
|
+
`;
|
|
15
|
+
export async function lessonsCommand(_args) {
|
|
16
|
+
console.log(DEPRECATION_NOTICE);
|
|
17
|
+
process.exit(0);
|
|
372
18
|
}
|
|
373
19
|
//# sourceMappingURL=lessons.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lessons.js","sourceRoot":"","sources":["../../src/commands/lessons.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lessons.js","sourceRoot":"","sources":["../../src/commands/lessons.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,kBAAkB,GAAG;;;;;;;CAO1B,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAe;IAClD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentlens migrate — Self-Hosted ↔ Cloud Migration (S-8.4)
|
|
3
|
+
*
|
|
4
|
+
* Reads from local SQLite, transforms to cloud NDJSON format,
|
|
5
|
+
* and uploads via cloud API. Supports resume on failure and
|
|
6
|
+
* reverse migration (cloud → self-hosted export → SQLite import).
|
|
7
|
+
*/
|
|
8
|
+
export interface MigrateOptions {
|
|
9
|
+
direction: 'up' | 'down';
|
|
10
|
+
sqlitePath?: string;
|
|
11
|
+
cloudUrl?: string;
|
|
12
|
+
apiKey?: string;
|
|
13
|
+
batchSize?: number;
|
|
14
|
+
resumeFile?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface MigrateState {
|
|
17
|
+
direction: string;
|
|
18
|
+
phase: 'export' | 'upload' | 'verify' | 'done';
|
|
19
|
+
exportFile?: string;
|
|
20
|
+
lastUploadedLine: number;
|
|
21
|
+
totalLines: number;
|
|
22
|
+
counts: Record<string, number>;
|
|
23
|
+
}
|
|
24
|
+
export declare function runMigrateCommand(args: string[]): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Read from local SQLite and produce NDJSON lines.
|
|
27
|
+
* Uses dynamic import for better-sqlite3 so it's optional.
|
|
28
|
+
*/
|
|
29
|
+
export declare function exportFromSqlite(dbPath: string): Promise<string[]>;
|
|
30
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,IAAI,GAAG,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAYD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BrE;AAuKD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsExE"}
|