@ank1015/llm-sdk-adapters 0.0.1
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/file-keys.d.ts +68 -0
- package/dist/file-keys.d.ts.map +1 -0
- package/dist/file-keys.js +243 -0
- package/dist/file-keys.js.map +1 -0
- package/dist/file-sessions.d.ts +55 -0
- package/dist/file-sessions.d.ts.map +1 -0
- package/dist/file-sessions.js +376 -0
- package/dist/file-sessions.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/keys-ui.d.ts +30 -0
- package/dist/keys-ui.d.ts.map +1 -0
- package/dist/keys-ui.js +603 -0
- package/dist/keys-ui.js.map +1 -0
- package/dist/memory-keys.d.ts +20 -0
- package/dist/memory-keys.d.ts.map +1 -0
- package/dist/memory-keys.js +57 -0
- package/dist/memory-keys.js.map +1 -0
- package/dist/memory-sessions.d.ts +34 -0
- package/dist/memory-sessions.d.ts.map +1 -0
- package/dist/memory-sessions.js +236 -0
- package/dist/memory-sessions.js.map +1 -0
- package/dist/memory-usage.d.ts +18 -0
- package/dist/memory-usage.d.ts.map +1 -0
- package/dist/memory-usage.js +123 -0
- package/dist/memory-usage.js.map +1 -0
- package/dist/sqlite-usage.d.ts +36 -0
- package/dist/sqlite-usage.d.ts.map +1 -0
- package/dist/sqlite-usage.js +344 -0
- package/dist/sqlite-usage.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based Sessions Adapter
|
|
3
|
+
*
|
|
4
|
+
* Stores sessions as JSONL files in ~/.llm/sessions/<projectName>/<path>/<sessionId>.jsonl
|
|
5
|
+
* Sessions are tree structures with branching support.
|
|
6
|
+
*/
|
|
7
|
+
import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { generateUUID } from '@ank1015/llm-core';
|
|
11
|
+
import { InvalidParentError, PathTraversalError, SessionNotFoundError } from '@ank1015/llm-types';
|
|
12
|
+
/** Default base directory for all sessions */
|
|
13
|
+
const DEFAULT_SESSIONS_BASE_DIR = join(homedir(), '.llm', 'sessions');
|
|
14
|
+
/**
|
|
15
|
+
* Validate a path component against directory traversal attacks.
|
|
16
|
+
*/
|
|
17
|
+
function sanitizePath(component) {
|
|
18
|
+
if (component.includes('..') || component.startsWith('/') || component.startsWith('\\')) {
|
|
19
|
+
throw new PathTraversalError(component);
|
|
20
|
+
}
|
|
21
|
+
return component.trim().replace(/\\/g, '/');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate an ISO 8601 timestamp.
|
|
25
|
+
*/
|
|
26
|
+
function timestamp() {
|
|
27
|
+
return new Date().toISOString();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse a JSONL file into an array of nodes.
|
|
31
|
+
*/
|
|
32
|
+
function parseJsonl(filePath) {
|
|
33
|
+
if (!existsSync(filePath)) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const content = readFileSync(filePath, 'utf8');
|
|
37
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
38
|
+
return lines.map((line, index) => {
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(line);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new Error(`Failed to parse line ${index + 1} in ${filePath}`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Serialize nodes to JSONL format.
|
|
49
|
+
*/
|
|
50
|
+
function toJsonl(nodes) {
|
|
51
|
+
return nodes.map((node) => JSON.stringify(node)).join('\n') + '\n';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Append a single node to a session file.
|
|
55
|
+
*/
|
|
56
|
+
function appendNode(filePath, node) {
|
|
57
|
+
appendFileSync(filePath, JSON.stringify(node) + '\n', 'utf8');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* File-based implementation of SessionsAdapter.
|
|
61
|
+
*/
|
|
62
|
+
export class FileSessionsAdapter {
|
|
63
|
+
baseDir;
|
|
64
|
+
constructor(baseDir = DEFAULT_SESSIONS_BASE_DIR) {
|
|
65
|
+
this.baseDir = baseDir;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the full directory path for a project/path combination.
|
|
69
|
+
*/
|
|
70
|
+
getSessionDir(projectName, path = '') {
|
|
71
|
+
sanitizePath(projectName);
|
|
72
|
+
if (path)
|
|
73
|
+
sanitizePath(path);
|
|
74
|
+
return join(this.baseDir, projectName, path);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the full file path for a session.
|
|
78
|
+
*/
|
|
79
|
+
getSessionFilePath(projectName, path = '', sessionId) {
|
|
80
|
+
sanitizePath(sessionId);
|
|
81
|
+
return join(this.getSessionDir(projectName, path), `${sessionId}.jsonl`);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Ensure a directory exists.
|
|
85
|
+
*/
|
|
86
|
+
ensureDir(dirPath) {
|
|
87
|
+
if (!existsSync(dirPath)) {
|
|
88
|
+
mkdirSync(dirPath, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async createSession(input) {
|
|
92
|
+
const { projectName, path = '', sessionName } = input;
|
|
93
|
+
const sessionId = generateUUID();
|
|
94
|
+
const dirPath = this.getSessionDir(projectName, path);
|
|
95
|
+
const filePath = this.getSessionFilePath(projectName, path, sessionId);
|
|
96
|
+
this.ensureDir(dirPath);
|
|
97
|
+
const header = {
|
|
98
|
+
type: 'session',
|
|
99
|
+
id: sessionId,
|
|
100
|
+
parentId: null,
|
|
101
|
+
branch: 'main',
|
|
102
|
+
timestamp: timestamp(),
|
|
103
|
+
sessionName: sessionName ?? `Session ${new Date().toLocaleDateString()}`,
|
|
104
|
+
};
|
|
105
|
+
writeFileSync(filePath, JSON.stringify(header) + '\n', 'utf8');
|
|
106
|
+
return { sessionId, header };
|
|
107
|
+
}
|
|
108
|
+
async getSession(location) {
|
|
109
|
+
const { projectName, path = '', sessionId } = location;
|
|
110
|
+
const filePath = this.getSessionFilePath(projectName, path, sessionId);
|
|
111
|
+
if (!existsSync(filePath)) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
const nodes = parseJsonl(filePath);
|
|
115
|
+
if (nodes.length === 0) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
const header = nodes[0];
|
|
119
|
+
if (header?.type !== 'session') {
|
|
120
|
+
throw new Error(`Invalid session file: first node is not a session header`);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
location: { projectName, path, sessionId },
|
|
124
|
+
header: header,
|
|
125
|
+
nodes,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async deleteSession(location) {
|
|
129
|
+
const { projectName, path = '', sessionId } = location;
|
|
130
|
+
const filePath = this.getSessionFilePath(projectName, path, sessionId);
|
|
131
|
+
if (!existsSync(filePath)) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
unlinkSync(filePath);
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
async updateSessionName(location, sessionName) {
|
|
138
|
+
const { projectName, path = '', sessionId } = location;
|
|
139
|
+
const filePath = this.getSessionFilePath(projectName, path, sessionId);
|
|
140
|
+
if (!existsSync(filePath)) {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
const nodes = parseJsonl(filePath);
|
|
144
|
+
if (nodes.length === 0 || nodes[0]?.type !== 'session') {
|
|
145
|
+
throw new Error(`Invalid session file: first node is not a session header`);
|
|
146
|
+
}
|
|
147
|
+
const header = nodes[0];
|
|
148
|
+
const updatedHeader = {
|
|
149
|
+
...header,
|
|
150
|
+
sessionName,
|
|
151
|
+
};
|
|
152
|
+
nodes[0] = updatedHeader;
|
|
153
|
+
// Rewrite the entire file with updated header
|
|
154
|
+
writeFileSync(filePath, toJsonl(nodes), 'utf8');
|
|
155
|
+
return updatedHeader;
|
|
156
|
+
}
|
|
157
|
+
async listSessions(projectName, path = '') {
|
|
158
|
+
const dirPath = this.getSessionDir(projectName, path);
|
|
159
|
+
if (!existsSync(dirPath)) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
const files = readdirSync(dirPath).filter((f) => f.endsWith('.jsonl'));
|
|
163
|
+
const summaries = [];
|
|
164
|
+
for (const file of files) {
|
|
165
|
+
const filePath = join(dirPath, file);
|
|
166
|
+
const sessionId = file.replace('.jsonl', '');
|
|
167
|
+
try {
|
|
168
|
+
const nodes = parseJsonl(filePath);
|
|
169
|
+
if (nodes.length === 0 || nodes[0]?.type !== 'session') {
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const header = nodes[0];
|
|
173
|
+
const stat = statSync(filePath);
|
|
174
|
+
// Collect unique branch names
|
|
175
|
+
const branches = [...new Set(nodes.map((n) => n.branch))];
|
|
176
|
+
summaries.push({
|
|
177
|
+
sessionId,
|
|
178
|
+
sessionName: header.sessionName,
|
|
179
|
+
filePath,
|
|
180
|
+
createdAt: header.timestamp,
|
|
181
|
+
updatedAt: stat.mtime.toISOString(),
|
|
182
|
+
nodeCount: nodes.length,
|
|
183
|
+
branches,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Skip invalid files
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Sort by updatedAt descending (most recent first)
|
|
192
|
+
summaries.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
|
|
193
|
+
return summaries;
|
|
194
|
+
}
|
|
195
|
+
async listProjects() {
|
|
196
|
+
if (!existsSync(this.baseDir)) {
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
return readdirSync(this.baseDir, { withFileTypes: true })
|
|
200
|
+
.filter((d) => d.isDirectory())
|
|
201
|
+
.map((d) => d.name);
|
|
202
|
+
}
|
|
203
|
+
async appendMessage(input) {
|
|
204
|
+
const { projectName, path = '', sessionId, parentId: inputParentId, branch, message, api, modelId, providerOptions = {}, } = input;
|
|
205
|
+
let actualSessionId = sessionId;
|
|
206
|
+
let parentId = inputParentId;
|
|
207
|
+
let filePath;
|
|
208
|
+
if (!actualSessionId) {
|
|
209
|
+
// No sessionId provided — auto-create, use header as parent
|
|
210
|
+
const { sessionId: newId, header } = await this.createSession({ projectName, path });
|
|
211
|
+
actualSessionId = newId;
|
|
212
|
+
parentId = header.id;
|
|
213
|
+
filePath = this.getSessionFilePath(projectName, path, actualSessionId);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
filePath = this.getSessionFilePath(projectName, path, actualSessionId);
|
|
217
|
+
if (!existsSync(filePath)) {
|
|
218
|
+
throw new SessionNotFoundError(actualSessionId);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Validate parentId exists in the session
|
|
222
|
+
const nodes = parseJsonl(filePath);
|
|
223
|
+
if (!nodes.some((n) => n.id === parentId)) {
|
|
224
|
+
throw new InvalidParentError(parentId, actualSessionId);
|
|
225
|
+
}
|
|
226
|
+
const node = {
|
|
227
|
+
type: 'message',
|
|
228
|
+
id: generateUUID(),
|
|
229
|
+
parentId,
|
|
230
|
+
branch,
|
|
231
|
+
timestamp: timestamp(),
|
|
232
|
+
message,
|
|
233
|
+
api,
|
|
234
|
+
modelId,
|
|
235
|
+
providerOptions,
|
|
236
|
+
};
|
|
237
|
+
appendNode(filePath, node);
|
|
238
|
+
return { sessionId: actualSessionId, node };
|
|
239
|
+
}
|
|
240
|
+
async appendCustom(input) {
|
|
241
|
+
const { projectName, path = '', sessionId, parentId, branch, payload } = input;
|
|
242
|
+
const filePath = this.getSessionFilePath(projectName, path, sessionId);
|
|
243
|
+
if (!existsSync(filePath)) {
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
// Validate parentId exists in the session
|
|
247
|
+
const nodes = parseJsonl(filePath);
|
|
248
|
+
if (!nodes.some((n) => n.id === parentId)) {
|
|
249
|
+
throw new InvalidParentError(parentId, sessionId);
|
|
250
|
+
}
|
|
251
|
+
const node = {
|
|
252
|
+
type: 'custom',
|
|
253
|
+
id: generateUUID(),
|
|
254
|
+
parentId,
|
|
255
|
+
branch,
|
|
256
|
+
timestamp: timestamp(),
|
|
257
|
+
payload,
|
|
258
|
+
};
|
|
259
|
+
appendNode(filePath, node);
|
|
260
|
+
return node;
|
|
261
|
+
}
|
|
262
|
+
async getBranches(location) {
|
|
263
|
+
const session = await this.getSession(location);
|
|
264
|
+
if (!session) {
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
const branchMap = new Map();
|
|
268
|
+
// Group nodes by branch
|
|
269
|
+
for (const node of session.nodes) {
|
|
270
|
+
if (!branchMap.has(node.branch)) {
|
|
271
|
+
branchMap.set(node.branch, { nodes: [], branchPointId: null });
|
|
272
|
+
}
|
|
273
|
+
branchMap.get(node.branch).nodes.push(node);
|
|
274
|
+
}
|
|
275
|
+
// Find branch points
|
|
276
|
+
for (const [branchName, data] of branchMap) {
|
|
277
|
+
if (branchName === 'main') {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const firstNode = data.nodes[0];
|
|
281
|
+
if (firstNode && firstNode.parentId) {
|
|
282
|
+
const parent = session.nodes.find((n) => n.id === firstNode.parentId);
|
|
283
|
+
if (parent && parent.branch !== branchName) {
|
|
284
|
+
data.branchPointId = firstNode.parentId;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const branches = [];
|
|
289
|
+
for (const [name, data] of branchMap) {
|
|
290
|
+
const latestNode = data.nodes[data.nodes.length - 1];
|
|
291
|
+
branches.push({
|
|
292
|
+
name,
|
|
293
|
+
branchPointId: data.branchPointId,
|
|
294
|
+
nodeCount: data.nodes.length,
|
|
295
|
+
latestNodeId: latestNode?.id ?? '',
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
return branches;
|
|
299
|
+
}
|
|
300
|
+
async getBranchHistory(location, branch) {
|
|
301
|
+
const session = await this.getSession(location);
|
|
302
|
+
if (!session) {
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
305
|
+
// Build parent-child map
|
|
306
|
+
const childMap = new Map();
|
|
307
|
+
for (const node of session.nodes) {
|
|
308
|
+
const children = childMap.get(node.parentId) ?? [];
|
|
309
|
+
children.push(node);
|
|
310
|
+
childMap.set(node.parentId, children);
|
|
311
|
+
}
|
|
312
|
+
// Traverse from header following the specified branch
|
|
313
|
+
const history = [];
|
|
314
|
+
let currentId = null;
|
|
315
|
+
while (true) {
|
|
316
|
+
const children = childMap.get(currentId) ?? [];
|
|
317
|
+
let next = children.find((c) => c.branch === branch);
|
|
318
|
+
if (!next && currentId === null) {
|
|
319
|
+
next = children[0];
|
|
320
|
+
}
|
|
321
|
+
if (!next) {
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
history.push(next);
|
|
325
|
+
currentId = next.id;
|
|
326
|
+
}
|
|
327
|
+
return history;
|
|
328
|
+
}
|
|
329
|
+
async getNode(location, nodeId) {
|
|
330
|
+
const session = await this.getSession(location);
|
|
331
|
+
if (!session) {
|
|
332
|
+
return undefined;
|
|
333
|
+
}
|
|
334
|
+
return session.nodes.find((n) => n.id === nodeId);
|
|
335
|
+
}
|
|
336
|
+
async getLatestNode(location, branch) {
|
|
337
|
+
const session = await this.getSession(location);
|
|
338
|
+
if (!session || session.nodes.length === 0) {
|
|
339
|
+
return undefined;
|
|
340
|
+
}
|
|
341
|
+
if (branch) {
|
|
342
|
+
const branchNodes = session.nodes.filter((n) => n.branch === branch);
|
|
343
|
+
return branchNodes[branchNodes.length - 1];
|
|
344
|
+
}
|
|
345
|
+
return session.nodes[session.nodes.length - 1];
|
|
346
|
+
}
|
|
347
|
+
async getMessages(location, branch) {
|
|
348
|
+
const session = await this.getSession(location);
|
|
349
|
+
if (!session) {
|
|
350
|
+
return undefined;
|
|
351
|
+
}
|
|
352
|
+
let nodes = session.nodes.filter((n) => n.type === 'message');
|
|
353
|
+
if (branch) {
|
|
354
|
+
nodes = nodes.filter((n) => n.branch === branch);
|
|
355
|
+
}
|
|
356
|
+
return nodes;
|
|
357
|
+
}
|
|
358
|
+
async searchSessions(projectName, query, path = '') {
|
|
359
|
+
const sessions = await this.listSessions(projectName, path);
|
|
360
|
+
const lowerQuery = query.toLowerCase();
|
|
361
|
+
return sessions.filter((s) => s.sessionName.toLowerCase().includes(lowerQuery));
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Get the base directory for sessions.
|
|
365
|
+
*/
|
|
366
|
+
getSessionsBaseDir() {
|
|
367
|
+
return this.baseDir;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Create a FileSessionsAdapter with the default base directory.
|
|
372
|
+
*/
|
|
373
|
+
export function createFileSessionsAdapter(baseDir) {
|
|
374
|
+
return new FileSessionsAdapter(baseDir);
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=file-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-sessions.js","sourceRoot":"","sources":["../src/file-sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAiBlG,8CAA8C;AAC9C,MAAM,yBAAyB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAEtE;;GAEG;AACH,SAAS,YAAY,CAAC,SAAiB;IACrC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxF,MAAM,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAgB;IAClC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,GAAG,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,OAAO,CAAC,KAAoB;IACnC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAgB,EAAE,IAAiB;IACrD,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACtB,OAAO,CAAS;IAExB,YAAY,UAAkB,yBAAyB;QACrD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,WAAmB,EAAE,OAAe,EAAE;QAC1D,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1B,IAAI,IAAI;YAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,WAAmB,EAAE,OAAe,EAAE,EAAE,SAAiB;QAClF,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,OAAe;QAC/B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAAyB;QAEzB,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;QACtD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAEvE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAExB,MAAM,MAAM,GAAkB;YAC5B,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,SAAS;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS,EAAE;YACtB,WAAW,EAAE,WAAW,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,EAAE;SACzE,CAAC;QAEF,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;QAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAyB;QACxC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAEvE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;YAC1C,MAAM,EAAE,MAAuB;YAC/B,KAAK;SACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAyB;QAC3C,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAEvE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,QAAyB,EACzB,WAAmB;QAEnB,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAEvE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAkB,CAAC;QACzC,MAAM,aAAa,GAAkB;YACnC,GAAG,MAAM;YACT,WAAW;SACZ,CAAC;QAEF,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QAEzB,8CAA8C;QAC9C,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QAEhD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,OAAe,EAAE;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEtD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvE,MAAM,SAAS,GAAqB,EAAE,CAAC;QAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAE7C,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvD,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAkB,CAAC;gBACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAEhC,8BAA8B;gBAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAE1D,SAAS,CAAC,IAAI,CAAC;oBACb,SAAS;oBACT,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,QAAQ;oBACR,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;oBACnC,SAAS,EAAE,KAAK,CAAC,MAAM;oBACvB,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;gBACrB,SAAS;YACX,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAE5F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACtD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAAyB;QAEzB,MAAM,EACJ,WAAW,EACX,IAAI,GAAG,EAAE,EACT,SAAS,EACT,QAAQ,EAAE,aAAa,EACvB,MAAM,EACN,OAAO,EACP,GAAG,EACH,OAAO,EACP,eAAe,GAAG,EAAE,GACrB,GAAG,KAAK,CAAC;QAEV,IAAI,eAAe,GAAG,SAAS,CAAC;QAChC,IAAI,QAAQ,GAAG,aAAa,CAAC;QAC7B,IAAI,QAAgB,CAAC;QAErB,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,4DAA4D;YAC5D,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACrF,eAAe,GAAG,KAAK,CAAC;YACxB,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;YACrB,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;YAEvE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,oBAAoB,CAAC,eAAe,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,IAAI,GAAgB;YACxB,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,YAAY,EAAE;YAClB,QAAQ;YACR,MAAM;YACN,SAAS,EAAE,SAAS,EAAE;YACtB,OAAO;YACP,GAAG;YACH,OAAO;YACP,eAAe;SAChB,CAAC;QAEF,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE3B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAwB;QACzC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAEvE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,0CAA0C;QAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,GAAe;YACvB,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,YAAY,EAAE;YAClB,QAAQ;YACR,MAAM;YACN,SAAS,EAAE,SAAS,EAAE;YACtB,OAAO;SACR,CAAC;QAEF,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAyB;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkE,CAAC;QAE5F,wBAAwB;QACxB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;YAC3C,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACtE,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC3C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAElC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI;gBACJ,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;gBAC5B,YAAY,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE;aACnC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,QAAyB,EACzB,MAAc;QAEd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,yBAAyB;QACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;QACzD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,sDAAsD;QACtD,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAkB,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAE9D,IAAI,IAAI,GAA4B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YAE3F,IAAI,CAAC,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBAChC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM;YACR,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;QACtB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAyB,EAAE,MAAc;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,QAAyB,EACzB,MAAe;QAEf,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YACrE,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,WAAW,CACf,QAAyB,EACzB,MAAe;QAEf,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QAEhF,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,WAAmB,EACnB,KAAa,EACb,OAAe,EAAE;QAEjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ank1015/llm-sdk-adapters
|
|
3
|
+
*
|
|
4
|
+
* Node.js adapter implementations for @ank1015/llm-sdk.
|
|
5
|
+
*
|
|
6
|
+
* This package provides:
|
|
7
|
+
* - File-based encrypted API key storage (FileKeysAdapter)
|
|
8
|
+
* - SQLite-based usage tracking (SqliteUsageAdapter)
|
|
9
|
+
* - JSONL file-based session storage (FileSessionsAdapter)
|
|
10
|
+
* - In-memory adapters for testing (InMemoryKeysAdapter, InMemoryUsageAdapter, InMemorySessionsAdapter)
|
|
11
|
+
*/
|
|
12
|
+
export { FileKeysAdapter, createFileKeysAdapter } from './file-keys.js';
|
|
13
|
+
export { SqliteUsageAdapter, createSqliteUsageAdapter } from './sqlite-usage.js';
|
|
14
|
+
export { FileSessionsAdapter, createFileSessionsAdapter } from './file-sessions.js';
|
|
15
|
+
export { InMemoryKeysAdapter } from './memory-keys.js';
|
|
16
|
+
export { InMemoryUsageAdapter } from './memory-usage.js';
|
|
17
|
+
export { InMemorySessionsAdapter } from './memory-sessions.js';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAGpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ank1015/llm-sdk-adapters
|
|
3
|
+
*
|
|
4
|
+
* Node.js adapter implementations for @ank1015/llm-sdk.
|
|
5
|
+
*
|
|
6
|
+
* This package provides:
|
|
7
|
+
* - File-based encrypted API key storage (FileKeysAdapter)
|
|
8
|
+
* - SQLite-based usage tracking (SqliteUsageAdapter)
|
|
9
|
+
* - JSONL file-based session storage (FileSessionsAdapter)
|
|
10
|
+
* - In-memory adapters for testing (InMemoryKeysAdapter, InMemoryUsageAdapter, InMemorySessionsAdapter)
|
|
11
|
+
*/
|
|
12
|
+
// File-based adapters (Node.js specific)
|
|
13
|
+
export { FileKeysAdapter, createFileKeysAdapter } from './file-keys.js';
|
|
14
|
+
export { SqliteUsageAdapter, createSqliteUsageAdapter } from './sqlite-usage.js';
|
|
15
|
+
export { FileSessionsAdapter, createFileSessionsAdapter } from './file-sessions.js';
|
|
16
|
+
// In-memory adapters (zero deps, for testing)
|
|
17
|
+
export { InMemoryKeysAdapter } from './memory-keys.js';
|
|
18
|
+
export { InMemoryUsageAdapter } from './memory-usage.js';
|
|
19
|
+
export { InMemorySessionsAdapter } from './memory-sessions.js';
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,yCAAyC;AACzC,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAEpF,8CAA8C;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keys UI — A basic HTML interface for managing API keys.
|
|
3
|
+
*
|
|
4
|
+
* Starts a local HTTP server that serves a single-page UI and exposes
|
|
5
|
+
* a small REST API backed by FileKeysAdapter.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { startKeysUI } from './keys-ui.js';
|
|
9
|
+
* startKeysUI({ port: 7700 });
|
|
10
|
+
*
|
|
11
|
+
* Or run directly:
|
|
12
|
+
* node dist/keys-ui.js
|
|
13
|
+
*/
|
|
14
|
+
import { createServer } from 'node:http';
|
|
15
|
+
export interface KeysUIOptions {
|
|
16
|
+
/** Port to listen on (default: 7700) */
|
|
17
|
+
port?: number | undefined;
|
|
18
|
+
/** Custom keys directory (default: ~/.llm/global/keys/) */
|
|
19
|
+
keysDir?: string | undefined;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start the Keys UI server.
|
|
23
|
+
*
|
|
24
|
+
* @returns A handle with the HTTP server and URL.
|
|
25
|
+
*/
|
|
26
|
+
export declare function startKeysUI(options?: KeysUIOptions): {
|
|
27
|
+
server: ReturnType<typeof createServer>;
|
|
28
|
+
url: string;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=keys-ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys-ui.d.ts","sourceRoot":"","sources":["../src/keys-ui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AAonBpF,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG;IACxD,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC;CACb,CAiBA"}
|