@agentuity/runtime 0.0.51 → 0.0.53
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/_config.js +99 -0
- package/dist/_config.js.map +1 -0
- package/dist/_context.d.ts +11 -11
- package/dist/_context.d.ts.map +1 -1
- package/dist/_context.js +84 -0
- package/dist/_context.js.map +1 -0
- package/dist/_idle.js +24 -0
- package/dist/_idle.js.map +1 -0
- package/dist/_server.js +489 -0
- package/dist/_server.js.map +1 -0
- package/dist/_services.js +258 -0
- package/dist/_services.js.map +1 -0
- package/dist/_tokens.js +98 -0
- package/dist/_tokens.js.map +1 -0
- package/dist/_util.js +54 -0
- package/dist/_util.js.map +1 -0
- package/dist/_waituntil.js +87 -0
- package/dist/_waituntil.js.map +1 -0
- package/dist/agent.d.ts +24 -15
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +507 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +6 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +72 -0
- package/dist/app.js.map +1 -0
- package/dist/eval.d.ts +1 -1
- package/dist/eval.d.ts.map +1 -1
- package/dist/eval.js +2 -0
- package/dist/eval.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/io/email.js +154 -0
- package/dist/io/email.js.map +1 -0
- package/dist/logger/console.js +274 -0
- package/dist/logger/console.js.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/internal.js +133 -0
- package/dist/logger/internal.js.map +1 -0
- package/dist/logger/logger.js +2 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/user.js +7 -0
- package/dist/logger/user.js.map +1 -0
- package/dist/logger/util.js +77 -0
- package/dist/logger/util.js.map +1 -0
- package/dist/otel/config.js +23 -0
- package/dist/otel/config.js.map +1 -0
- package/dist/otel/console.js +52 -0
- package/dist/otel/console.js.map +1 -0
- package/dist/otel/exporters/index.js +4 -0
- package/dist/otel/exporters/index.js.map +1 -0
- package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
- package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
- package/dist/otel/fetch.js +81 -0
- package/dist/otel/fetch.js.map +1 -0
- package/dist/otel/http.js +44 -0
- package/dist/otel/http.js.map +1 -0
- package/dist/otel/logger.js +278 -0
- package/dist/otel/logger.js.map +1 -0
- package/dist/otel/otel.js +233 -0
- package/dist/otel/otel.js.map +1 -0
- package/dist/router.js +350 -0
- package/dist/router.js.map +1 -0
- package/dist/services/evalrun/composite.js +26 -0
- package/dist/services/evalrun/composite.js.map +1 -0
- package/dist/services/evalrun/http.js +74 -0
- package/dist/services/evalrun/http.js.map +1 -0
- package/dist/services/evalrun/index.js +5 -0
- package/dist/services/evalrun/index.js.map +1 -0
- package/dist/services/evalrun/json.js +38 -0
- package/dist/services/evalrun/json.js.map +1 -0
- package/dist/services/evalrun/local.js +22 -0
- package/dist/services/evalrun/local.js.map +1 -0
- package/dist/services/local/_db.js +144 -0
- package/dist/services/local/_db.js.map +1 -0
- package/dist/services/local/_router.js +60 -0
- package/dist/services/local/_router.js.map +1 -0
- package/dist/services/local/_util.js +42 -0
- package/dist/services/local/_util.js.map +1 -0
- package/dist/services/local/index.js +8 -0
- package/dist/services/local/index.js.map +1 -0
- package/dist/services/local/keyvalue.js +114 -0
- package/dist/services/local/keyvalue.js.map +1 -0
- package/dist/services/local/objectstore.js +117 -0
- package/dist/services/local/objectstore.js.map +1 -0
- package/dist/services/local/stream.js +218 -0
- package/dist/services/local/stream.js.map +1 -0
- package/dist/services/local/vector.js +183 -0
- package/dist/services/local/vector.js.map +1 -0
- package/dist/services/session/composite.js +26 -0
- package/dist/services/session/composite.js.map +1 -0
- package/dist/services/session/http.js +42 -0
- package/dist/services/session/http.js.map +1 -0
- package/dist/services/session/index.js +5 -0
- package/dist/services/session/index.js.map +1 -0
- package/dist/services/session/json.js +35 -0
- package/dist/services/session/json.js.map +1 -0
- package/dist/services/session/local.js +22 -0
- package/dist/services/session/local.js.map +1 -0
- package/dist/session.js +199 -0
- package/dist/session.js.map +1 -0
- package/dist/workbench.js +38 -0
- package/dist/workbench.js.map +1 -0
- package/package.json +5 -5
- package/src/_context.ts +34 -13
- package/src/agent.ts +76 -40
- package/src/app.ts +6 -1
- package/src/eval.ts +1 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { now } from './_util';
|
|
2
|
+
export class LocalObjectStorage {
|
|
3
|
+
#db;
|
|
4
|
+
#projectPath;
|
|
5
|
+
#serverUrl;
|
|
6
|
+
constructor(db, projectPath, serverUrl) {
|
|
7
|
+
this.#db = db;
|
|
8
|
+
this.#projectPath = projectPath;
|
|
9
|
+
this.#serverUrl = serverUrl;
|
|
10
|
+
}
|
|
11
|
+
async get(bucket, key) {
|
|
12
|
+
if (!bucket?.trim() || !key?.trim()) {
|
|
13
|
+
throw new Error('bucket and key are required');
|
|
14
|
+
}
|
|
15
|
+
const query = this.#db.query(`
|
|
16
|
+
SELECT data, content_type
|
|
17
|
+
FROM object_storage
|
|
18
|
+
WHERE project_path = ? AND bucket = ? AND key = ?
|
|
19
|
+
`);
|
|
20
|
+
const row = query.get(this.#projectPath, bucket, key);
|
|
21
|
+
if (!row) {
|
|
22
|
+
return { exists: false };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
exists: true,
|
|
26
|
+
data: new Uint8Array(row.data),
|
|
27
|
+
contentType: row.content_type,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async put(bucket, key, data, params) {
|
|
31
|
+
if (!bucket?.trim() || !key?.trim()) {
|
|
32
|
+
throw new Error('bucket and key are required');
|
|
33
|
+
}
|
|
34
|
+
// Convert data to Buffer
|
|
35
|
+
let buffer;
|
|
36
|
+
if (data instanceof ReadableStream) {
|
|
37
|
+
// Read entire stream into buffer
|
|
38
|
+
const reader = data.getReader();
|
|
39
|
+
const chunks = [];
|
|
40
|
+
while (true) {
|
|
41
|
+
const { done, value } = await reader.read();
|
|
42
|
+
if (done)
|
|
43
|
+
break;
|
|
44
|
+
chunks.push(value);
|
|
45
|
+
}
|
|
46
|
+
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
47
|
+
buffer = Buffer.concat(chunks.map((c) => Buffer.from(c)), totalLength);
|
|
48
|
+
}
|
|
49
|
+
else if (data instanceof ArrayBuffer) {
|
|
50
|
+
buffer = Buffer.from(data);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
buffer = Buffer.from(data);
|
|
54
|
+
}
|
|
55
|
+
const timestamp = now();
|
|
56
|
+
const metadata = params?.metadata ? JSON.stringify(params.metadata) : null;
|
|
57
|
+
const stmt = this.#db.prepare(`
|
|
58
|
+
INSERT INTO object_storage (
|
|
59
|
+
project_path, bucket, key, data, content_type,
|
|
60
|
+
content_encoding, cache_control, content_disposition,
|
|
61
|
+
content_language, metadata, created_at, updated_at
|
|
62
|
+
)
|
|
63
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
64
|
+
ON CONFLICT(project_path, bucket, key)
|
|
65
|
+
DO UPDATE SET
|
|
66
|
+
data = excluded.data,
|
|
67
|
+
content_type = excluded.content_type,
|
|
68
|
+
content_encoding = excluded.content_encoding,
|
|
69
|
+
cache_control = excluded.cache_control,
|
|
70
|
+
content_disposition = excluded.content_disposition,
|
|
71
|
+
content_language = excluded.content_language,
|
|
72
|
+
metadata = excluded.metadata,
|
|
73
|
+
updated_at = excluded.updated_at
|
|
74
|
+
`);
|
|
75
|
+
stmt.run(this.#projectPath, bucket, key, buffer, params?.contentType || 'application/octet-stream', params?.contentEncoding || null, params?.cacheControl || null, params?.contentDisposition || null, params?.contentLanguage || null, metadata, timestamp, timestamp);
|
|
76
|
+
}
|
|
77
|
+
async delete(bucket, key) {
|
|
78
|
+
if (!bucket?.trim() || !key?.trim()) {
|
|
79
|
+
throw new Error('bucket and key are required');
|
|
80
|
+
}
|
|
81
|
+
const stmt = this.#db.prepare(`
|
|
82
|
+
DELETE FROM object_storage
|
|
83
|
+
WHERE project_path = ? AND bucket = ? AND key = ?
|
|
84
|
+
`);
|
|
85
|
+
const result = stmt.run(this.#projectPath, bucket, key);
|
|
86
|
+
return result.changes > 0;
|
|
87
|
+
}
|
|
88
|
+
async createPublicURL(bucket, key, _params) {
|
|
89
|
+
if (!bucket?.trim() || !key?.trim()) {
|
|
90
|
+
throw new Error('bucket and key are required');
|
|
91
|
+
}
|
|
92
|
+
// Verify object exists
|
|
93
|
+
const result = await this.get(bucket, key);
|
|
94
|
+
if (!result.exists) {
|
|
95
|
+
throw new Error('Object not found');
|
|
96
|
+
}
|
|
97
|
+
// Return local HTTP URL
|
|
98
|
+
// Note: params.expiresDuration is ignored for local implementation
|
|
99
|
+
return `${this.#serverUrl}/_agentuity/local/object/${encodeURIComponent(bucket)}/${encodeURIComponent(key)}`;
|
|
100
|
+
}
|
|
101
|
+
async listBuckets() {
|
|
102
|
+
throw new Error('listBuckets not implemented for local storage');
|
|
103
|
+
}
|
|
104
|
+
async listKeys(_bucket) {
|
|
105
|
+
throw new Error('listKeys not implemented for local storage');
|
|
106
|
+
}
|
|
107
|
+
async listObjects(_bucket, _options) {
|
|
108
|
+
throw new Error('listObjects not implemented for local storage');
|
|
109
|
+
}
|
|
110
|
+
async headObject(_bucket, _key) {
|
|
111
|
+
throw new Error('headObject not implemented for local storage');
|
|
112
|
+
}
|
|
113
|
+
async deleteBucket(_bucket) {
|
|
114
|
+
throw new Error('deleteBucket not implemented for local storage');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=objectstore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectstore.js","sourceRoot":"","sources":["../../../src/services/local/objectstore.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,OAAO,kBAAkB;IAC9B,GAAG,CAAW;IACd,YAAY,CAAS;IACrB,UAAU,CAAS;IAEnB,YAAY,EAAY,EAAE,WAAmB,EAAE,SAAiB;QAC/D,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,GAAW;QACpC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;;;GAI5B,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAG5C,CAAC;QAET,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,EAAE,MAAM,EAAE,KAAK,EAA0B,CAAC;QAClD,CAAC;QAED,OAAO;YACN,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B,WAAW,EAAE,GAAG,CAAC,YAAY;SAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACR,MAAc,EACd,GAAW,EACX,IAA+C,EAC/C,MAA6B;QAE7B,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAChD,CAAC;QAED,yBAAyB;QACzB,IAAI,MAAc,CAAC;QACnB,IAAI,IAAI,YAAY,cAAc,EAAE,CAAC;YACpC,iCAAiC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,MAAM,GAAiB,EAAE,CAAC;YAChC,OAAO,IAAI,EAAE,CAAC;gBACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,GAAG,MAAM,CAAC,MAAM,CACrB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EACjC,WAAW,CACX,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;YACxC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACP,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;GAiB7B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACP,IAAI,CAAC,YAAY,EACjB,MAAM,EACN,GAAG,EACH,MAAM,EACN,MAAM,EAAE,WAAW,IAAI,0BAA0B,EACjD,MAAM,EAAE,eAAe,IAAI,IAAI,EAC/B,MAAM,EAAE,YAAY,IAAI,IAAI,EAC5B,MAAM,EAAE,kBAAkB,IAAI,IAAI,EAClC,MAAM,EAAE,eAAe,IAAI,IAAI,EAC/B,QAAQ,EACR,SAAS,EACT,SAAS,CACT,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,GAAW;QACvC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;;;GAG7B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,eAAe,CACpB,MAAc,EACd,GAAW,EACX,OAA+B;QAE/B,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAChD,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACrC,CAAC;QAED,wBAAwB;QACxB,mEAAmE;QACnE,OAAO,GAAG,IAAI,CAAC,UAAU,4BAA4B,kBAAkB,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9G,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,WAAW,CAChB,OAAe,EACf,QAA8C;QAE9C,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,IAAY;QAC7C,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QACjC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACnE,CAAC;CACD"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { now } from './_util';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { mkdirSync, existsSync, unlinkSync } from 'node:fs';
|
|
6
|
+
import { openSync, writeSync, closeSync, readFileSync } from 'node:fs';
|
|
7
|
+
export class LocalStreamStorage {
|
|
8
|
+
#db;
|
|
9
|
+
#projectPath;
|
|
10
|
+
#serverUrl;
|
|
11
|
+
#tempDir;
|
|
12
|
+
constructor(db, projectPath, serverUrl) {
|
|
13
|
+
this.#db = db;
|
|
14
|
+
this.#projectPath = projectPath;
|
|
15
|
+
this.#serverUrl = serverUrl;
|
|
16
|
+
// Create temp directory for stream buffering
|
|
17
|
+
this.#tempDir = join(homedir(), '.config', 'agentuity', 'streams');
|
|
18
|
+
if (!existsSync(this.#tempDir)) {
|
|
19
|
+
mkdirSync(this.#tempDir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async create(name, props) {
|
|
23
|
+
if (!name || name.length < 1 || name.length > 254) {
|
|
24
|
+
throw new Error('Stream name must be between 1 and 254 characters');
|
|
25
|
+
}
|
|
26
|
+
const id = randomUUID();
|
|
27
|
+
const timestamp = now();
|
|
28
|
+
const metadata = props?.metadata ? JSON.stringify(props.metadata) : null;
|
|
29
|
+
// Insert stream record with NULL data
|
|
30
|
+
const stmt = this.#db.prepare(`
|
|
31
|
+
INSERT INTO stream_storage (
|
|
32
|
+
project_path, id, name, metadata, content_type, created_at
|
|
33
|
+
)
|
|
34
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
35
|
+
`);
|
|
36
|
+
stmt.run(this.#projectPath, id, name, metadata, props?.contentType || 'application/octet-stream', timestamp);
|
|
37
|
+
const url = `${this.#serverUrl}/_agentuity/local/stream/${id}`;
|
|
38
|
+
return new LocalStream(id, url, this.#db, this.#projectPath, this.#tempDir, props?.compress ?? false);
|
|
39
|
+
}
|
|
40
|
+
async list(params) {
|
|
41
|
+
if (params?.limit && (params.limit <= 0 || params.limit > 1000)) {
|
|
42
|
+
throw new Error('limit must be between 1 and 1000');
|
|
43
|
+
}
|
|
44
|
+
let query = `
|
|
45
|
+
SELECT id, name, metadata, size_bytes
|
|
46
|
+
FROM stream_storage
|
|
47
|
+
WHERE project_path = ?
|
|
48
|
+
`;
|
|
49
|
+
const queryParams = [this.#projectPath];
|
|
50
|
+
// Add filters
|
|
51
|
+
if (params?.name) {
|
|
52
|
+
query += ` AND name = ?`;
|
|
53
|
+
queryParams.push(params.name);
|
|
54
|
+
}
|
|
55
|
+
if (params?.metadata) {
|
|
56
|
+
// Simple JSON matching - check if metadata contains all key-value pairs
|
|
57
|
+
for (const [key, value] of Object.entries(params.metadata)) {
|
|
58
|
+
query += ` AND metadata LIKE ?`;
|
|
59
|
+
queryParams.push(`%"${key}":"${value}"%`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Get total count
|
|
63
|
+
const countQuery = this.#db.query(query.replace('SELECT id, name, metadata, size_bytes', 'SELECT COUNT(*) as count'));
|
|
64
|
+
const { count } = countQuery.get(...queryParams);
|
|
65
|
+
// Add pagination
|
|
66
|
+
query += ` ORDER BY created_at DESC`;
|
|
67
|
+
if (params?.limit) {
|
|
68
|
+
query += ` LIMIT ${params.limit}`;
|
|
69
|
+
}
|
|
70
|
+
if (params?.offset) {
|
|
71
|
+
query += ` OFFSET ${params.offset}`;
|
|
72
|
+
}
|
|
73
|
+
const stmt = this.#db.query(query);
|
|
74
|
+
const rows = stmt.all(...queryParams);
|
|
75
|
+
const streams = rows.map((row) => ({
|
|
76
|
+
id: row.id,
|
|
77
|
+
name: row.name,
|
|
78
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : {},
|
|
79
|
+
url: `${this.#serverUrl}/_agentuity/local/stream/${row.id}`,
|
|
80
|
+
sizeBytes: row.size_bytes,
|
|
81
|
+
}));
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
streams,
|
|
85
|
+
total: count,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async delete(id) {
|
|
89
|
+
if (!id?.trim()) {
|
|
90
|
+
throw new Error('Stream id is required');
|
|
91
|
+
}
|
|
92
|
+
const stmt = this.#db.prepare(`
|
|
93
|
+
DELETE FROM stream_storage
|
|
94
|
+
WHERE project_path = ? AND id = ?
|
|
95
|
+
`);
|
|
96
|
+
stmt.run(this.#projectPath, id);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
class LocalStream extends WritableStream {
|
|
100
|
+
id;
|
|
101
|
+
url;
|
|
102
|
+
#db;
|
|
103
|
+
#projectPath;
|
|
104
|
+
#compressed;
|
|
105
|
+
#tempFilePath;
|
|
106
|
+
#fileHandle = null;
|
|
107
|
+
#bytesWritten = 0;
|
|
108
|
+
#closed = false;
|
|
109
|
+
constructor(id, url, db, projectPath, tempDir, compressed) {
|
|
110
|
+
super({
|
|
111
|
+
write: async (chunk) => {
|
|
112
|
+
await this.#writeToFile(chunk);
|
|
113
|
+
},
|
|
114
|
+
close: async () => {
|
|
115
|
+
await this.#persist();
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
this.id = id;
|
|
119
|
+
this.url = url;
|
|
120
|
+
this.#db = db;
|
|
121
|
+
this.#projectPath = projectPath;
|
|
122
|
+
this.#compressed = compressed;
|
|
123
|
+
this.#tempFilePath = join(tempDir, `${id}.tmp`);
|
|
124
|
+
// Open file for writing
|
|
125
|
+
this.#fileHandle = openSync(this.#tempFilePath, 'w');
|
|
126
|
+
}
|
|
127
|
+
get bytesWritten() {
|
|
128
|
+
return this.#bytesWritten;
|
|
129
|
+
}
|
|
130
|
+
get compressed() {
|
|
131
|
+
return this.#compressed;
|
|
132
|
+
}
|
|
133
|
+
async write(chunk) {
|
|
134
|
+
if (this.#closed) {
|
|
135
|
+
throw new Error('Stream is closed');
|
|
136
|
+
}
|
|
137
|
+
let binary;
|
|
138
|
+
if (chunk instanceof Uint8Array) {
|
|
139
|
+
binary = chunk;
|
|
140
|
+
}
|
|
141
|
+
else if (typeof chunk === 'string') {
|
|
142
|
+
binary = new TextEncoder().encode(chunk);
|
|
143
|
+
}
|
|
144
|
+
else if (chunk instanceof ArrayBuffer) {
|
|
145
|
+
binary = new Uint8Array(chunk);
|
|
146
|
+
}
|
|
147
|
+
else if (typeof chunk === 'object') {
|
|
148
|
+
binary = new TextEncoder().encode(JSON.stringify(chunk));
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
binary = new TextEncoder().encode(String(chunk));
|
|
152
|
+
}
|
|
153
|
+
await this.#writeToFile(binary);
|
|
154
|
+
}
|
|
155
|
+
async close() {
|
|
156
|
+
if (this.#closed) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
this.#closed = true;
|
|
160
|
+
// Close file handle if open
|
|
161
|
+
if (this.#fileHandle !== null) {
|
|
162
|
+
closeSync(this.#fileHandle);
|
|
163
|
+
this.#fileHandle = null;
|
|
164
|
+
}
|
|
165
|
+
await this.#persist();
|
|
166
|
+
}
|
|
167
|
+
getReader() {
|
|
168
|
+
const db = this.#db;
|
|
169
|
+
const projectPath = this.#projectPath;
|
|
170
|
+
const id = this.id;
|
|
171
|
+
return new ReadableStream({
|
|
172
|
+
start(controller) {
|
|
173
|
+
const query = db.query(`
|
|
174
|
+
SELECT data FROM stream_storage
|
|
175
|
+
WHERE project_path = ? AND id = ?
|
|
176
|
+
`);
|
|
177
|
+
const row = query.get(projectPath, id);
|
|
178
|
+
if (!row || !row.data) {
|
|
179
|
+
controller.error(new Error('Stream not found or not finalized'));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
controller.enqueue(new Uint8Array(row.data));
|
|
183
|
+
controller.close();
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async #writeToFile(chunk) {
|
|
188
|
+
if (this.#fileHandle === null) {
|
|
189
|
+
throw new Error('File handle is closed');
|
|
190
|
+
}
|
|
191
|
+
const written = writeSync(this.#fileHandle, chunk);
|
|
192
|
+
this.#bytesWritten += written;
|
|
193
|
+
}
|
|
194
|
+
async #persist() {
|
|
195
|
+
// Read buffered file
|
|
196
|
+
let data = readFileSync(this.#tempFilePath);
|
|
197
|
+
// Optional: Apply compression if enabled
|
|
198
|
+
if (this.#compressed) {
|
|
199
|
+
const { gzipSync } = await import('node:zlib');
|
|
200
|
+
data = gzipSync(data);
|
|
201
|
+
}
|
|
202
|
+
// Update DB with finalized data
|
|
203
|
+
const stmt = this.#db.prepare(`
|
|
204
|
+
UPDATE stream_storage
|
|
205
|
+
SET data = ?, size_bytes = ?
|
|
206
|
+
WHERE project_path = ? AND id = ?
|
|
207
|
+
`);
|
|
208
|
+
stmt.run(data, this.#bytesWritten, this.#projectPath, this.id);
|
|
209
|
+
// Clean up temp file
|
|
210
|
+
try {
|
|
211
|
+
unlinkSync(this.#tempFilePath);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Ignore cleanup errors
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/services/local/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { simpleEmbedding, cosineSimilarity, now } from './_util';
|
|
3
|
+
export class LocalVectorStorage {
|
|
4
|
+
#db;
|
|
5
|
+
#projectPath;
|
|
6
|
+
constructor(db, projectPath) {
|
|
7
|
+
this.#db = db;
|
|
8
|
+
this.#projectPath = projectPath;
|
|
9
|
+
}
|
|
10
|
+
async upsert(name, ...documents) {
|
|
11
|
+
if (!name?.trim()) {
|
|
12
|
+
throw new Error('Vector storage name is required');
|
|
13
|
+
}
|
|
14
|
+
if (documents.length === 0) {
|
|
15
|
+
throw new Error('At least one document is required');
|
|
16
|
+
}
|
|
17
|
+
const results = [];
|
|
18
|
+
const stmt = this.#db.prepare(`
|
|
19
|
+
INSERT INTO vector_storage (
|
|
20
|
+
project_path, name, id, key, embedding, document, metadata, created_at, updated_at
|
|
21
|
+
)
|
|
22
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
23
|
+
ON CONFLICT(project_path, name, key)
|
|
24
|
+
DO UPDATE SET
|
|
25
|
+
embedding = excluded.embedding,
|
|
26
|
+
document = excluded.document,
|
|
27
|
+
metadata = excluded.metadata,
|
|
28
|
+
updated_at = excluded.updated_at
|
|
29
|
+
`);
|
|
30
|
+
for (const doc of documents) {
|
|
31
|
+
if (!doc.key?.trim()) {
|
|
32
|
+
throw new Error('Each document must have a non-empty key');
|
|
33
|
+
}
|
|
34
|
+
// Generate or use provided embeddings
|
|
35
|
+
let embedding;
|
|
36
|
+
if ('embeddings' in doc && doc.embeddings) {
|
|
37
|
+
if (!Array.isArray(doc.embeddings) || doc.embeddings.length === 0) {
|
|
38
|
+
throw new Error('Embeddings must be a non-empty array');
|
|
39
|
+
}
|
|
40
|
+
embedding = doc.embeddings;
|
|
41
|
+
}
|
|
42
|
+
else if ('document' in doc && doc.document) {
|
|
43
|
+
if (!doc.document?.trim()) {
|
|
44
|
+
throw new Error('Document text must be non-empty');
|
|
45
|
+
}
|
|
46
|
+
embedding = simpleEmbedding(doc.document);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw new Error('Each document must have either embeddings or document text');
|
|
50
|
+
}
|
|
51
|
+
const id = randomUUID();
|
|
52
|
+
const timestamp = now();
|
|
53
|
+
const embeddingJson = JSON.stringify(embedding);
|
|
54
|
+
const documentText = 'document' in doc ? doc.document : null;
|
|
55
|
+
const metadata = doc.metadata ? JSON.stringify(doc.metadata) : null;
|
|
56
|
+
stmt.run(this.#projectPath, name, id, doc.key, embeddingJson, documentText ?? null, metadata ?? null, timestamp, timestamp);
|
|
57
|
+
const row = this.#db
|
|
58
|
+
.prepare('SELECT id FROM vector_storage WHERE project_path = ? AND name = ? AND key = ?')
|
|
59
|
+
.get(this.#projectPath, name, doc.key);
|
|
60
|
+
const actualId = row?.id ?? id;
|
|
61
|
+
results.push({ key: doc.key, id: actualId });
|
|
62
|
+
}
|
|
63
|
+
return results;
|
|
64
|
+
}
|
|
65
|
+
async get(name, key) {
|
|
66
|
+
if (!name?.trim() || !key?.trim()) {
|
|
67
|
+
throw new Error('Vector storage name and key are required');
|
|
68
|
+
}
|
|
69
|
+
const query = this.#db.query(`
|
|
70
|
+
SELECT id, key, embedding, document, metadata
|
|
71
|
+
FROM vector_storage
|
|
72
|
+
WHERE project_path = ? AND name = ? AND key = ?
|
|
73
|
+
`);
|
|
74
|
+
const row = query.get(this.#projectPath, name, key);
|
|
75
|
+
if (!row) {
|
|
76
|
+
return { exists: false };
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
exists: true,
|
|
80
|
+
data: {
|
|
81
|
+
id: row.id,
|
|
82
|
+
key: row.key,
|
|
83
|
+
embeddings: JSON.parse(row.embedding),
|
|
84
|
+
document: row.document || undefined,
|
|
85
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
86
|
+
similarity: 1.0, // Perfect match for direct get
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
async getMany(name, ...keys) {
|
|
91
|
+
if (!name?.trim()) {
|
|
92
|
+
throw new Error('Vector storage name is required');
|
|
93
|
+
}
|
|
94
|
+
if (keys.length === 0) {
|
|
95
|
+
return new Map();
|
|
96
|
+
}
|
|
97
|
+
const results = await Promise.all(keys.map(async (key) => {
|
|
98
|
+
const result = await this.get(name, key);
|
|
99
|
+
return { key, result };
|
|
100
|
+
}));
|
|
101
|
+
const map = new Map();
|
|
102
|
+
for (const { key, result } of results) {
|
|
103
|
+
if (result.exists) {
|
|
104
|
+
map.set(key, result.data);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return map;
|
|
108
|
+
}
|
|
109
|
+
async search(name, params) {
|
|
110
|
+
if (!name?.trim()) {
|
|
111
|
+
throw new Error('Vector storage name is required');
|
|
112
|
+
}
|
|
113
|
+
if (!params.query?.trim()) {
|
|
114
|
+
throw new Error('Query is required');
|
|
115
|
+
}
|
|
116
|
+
// Generate query embedding
|
|
117
|
+
const queryEmbedding = simpleEmbedding(params.query);
|
|
118
|
+
// Fetch all vectors for this name
|
|
119
|
+
const query = this.#db.query(`
|
|
120
|
+
SELECT id, key, embedding, metadata
|
|
121
|
+
FROM vector_storage
|
|
122
|
+
WHERE project_path = ? AND name = ?
|
|
123
|
+
`);
|
|
124
|
+
const rows = query.all(this.#projectPath, name);
|
|
125
|
+
// Calculate similarities
|
|
126
|
+
const results = [];
|
|
127
|
+
for (const row of rows) {
|
|
128
|
+
const embedding = JSON.parse(row.embedding);
|
|
129
|
+
const similarity = cosineSimilarity(queryEmbedding, embedding);
|
|
130
|
+
// Apply similarity threshold
|
|
131
|
+
if (params.similarity !== undefined && similarity < params.similarity) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
// Apply metadata filter
|
|
135
|
+
if (params.metadata) {
|
|
136
|
+
const rowMetadata = row.metadata ? JSON.parse(row.metadata) : {};
|
|
137
|
+
const matches = Object.entries(params.metadata).every(([key, value]) => rowMetadata[key] === value);
|
|
138
|
+
if (!matches) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
results.push({
|
|
143
|
+
id: row.id,
|
|
144
|
+
key: row.key,
|
|
145
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
146
|
+
similarity,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// Sort by similarity descending
|
|
150
|
+
results.sort((a, b) => b.similarity - a.similarity);
|
|
151
|
+
// Apply limit
|
|
152
|
+
const limit = params.limit || 10;
|
|
153
|
+
return results.slice(0, limit);
|
|
154
|
+
}
|
|
155
|
+
async delete(name, ...keys) {
|
|
156
|
+
if (!name?.trim()) {
|
|
157
|
+
throw new Error('Vector storage name is required');
|
|
158
|
+
}
|
|
159
|
+
if (keys.length === 0) {
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
const placeholders = keys.map(() => '?').join(', ');
|
|
163
|
+
const stmt = this.#db.prepare(`
|
|
164
|
+
DELETE FROM vector_storage
|
|
165
|
+
WHERE project_path = ? AND name = ? AND key IN (${placeholders})
|
|
166
|
+
`);
|
|
167
|
+
const result = stmt.run(this.#projectPath, name, ...keys);
|
|
168
|
+
return result.changes;
|
|
169
|
+
}
|
|
170
|
+
async exists(name) {
|
|
171
|
+
if (!name?.trim()) {
|
|
172
|
+
throw new Error('Vector storage name is required');
|
|
173
|
+
}
|
|
174
|
+
const query = this.#db.query(`
|
|
175
|
+
SELECT COUNT(*) as count
|
|
176
|
+
FROM vector_storage
|
|
177
|
+
WHERE project_path = ? AND name = ?
|
|
178
|
+
`);
|
|
179
|
+
const { count } = query.get(this.#projectPath, name);
|
|
180
|
+
return count > 0;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=vector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector.js","sourceRoot":"","sources":["../../../src/services/local/vector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A composite implementation of SessionEventProvider that forwards events to multiple providers
|
|
3
|
+
*/
|
|
4
|
+
export class CompositeSessionEventProvider {
|
|
5
|
+
providers;
|
|
6
|
+
constructor(...providers) {
|
|
7
|
+
this.providers = providers;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* called when the session starts
|
|
11
|
+
*
|
|
12
|
+
* @param event SessionStartEvent
|
|
13
|
+
*/
|
|
14
|
+
async start(event) {
|
|
15
|
+
await Promise.all(this.providers.map((p) => p.start(event)));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* called when the session completes
|
|
19
|
+
*
|
|
20
|
+
* @param event SessionCompleteEvent
|
|
21
|
+
*/
|
|
22
|
+
async complete(event) {
|
|
23
|
+
await Promise.all(this.providers.map((p) => p.complete(event)));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=composite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite.js","sourceRoot":"","sources":["../../../src/services/session/composite.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,OAAO,6BAA6B;IACjC,SAAS,CAAyB;IAE1C,YAAY,GAAG,SAAiC;QAC/C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5B,CAAC;IACD;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAwB;QACnC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAA2B;QACzC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;CACD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { APIResponseSchemaNoData } from '@agentuity/server';
|
|
2
|
+
import { SessionStartEventDelayedSchema, SessionCompleteEventDelayedSchema, } from '@agentuity/core';
|
|
3
|
+
/**
|
|
4
|
+
* An implementation of the SessionEventProvider which uses HTTP for delivery
|
|
5
|
+
*/
|
|
6
|
+
export class HTTPSessionEventProvider {
|
|
7
|
+
apiClient;
|
|
8
|
+
logger;
|
|
9
|
+
constructor(client, logger) {
|
|
10
|
+
this.apiClient = client;
|
|
11
|
+
this.logger = logger;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* called when the session starts
|
|
15
|
+
*
|
|
16
|
+
* @param event SessionStartEvent
|
|
17
|
+
*/
|
|
18
|
+
async start(event) {
|
|
19
|
+
this.logger.debug('Sending session start event: %s', event.id);
|
|
20
|
+
const resp = await this.apiClient.request('POST', '/session/2025-03-17', APIResponseSchemaNoData(), { ...event, timestamp: Date.now() }, SessionStartEventDelayedSchema);
|
|
21
|
+
if (resp.success) {
|
|
22
|
+
this.logger.debug('Session start event sent successfully: %s', event.id);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
throw new Error(resp.message);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* called when the session completes
|
|
29
|
+
*
|
|
30
|
+
* @param event SessionCompleteEvent
|
|
31
|
+
*/
|
|
32
|
+
async complete(event) {
|
|
33
|
+
this.logger.debug('Sending session complete event: %s', event.id);
|
|
34
|
+
const resp = await this.apiClient.request('PUT', '/session/2025-03-17', APIResponseSchemaNoData(), { ...event, timestamp: Date.now() }, SessionCompleteEventDelayedSchema);
|
|
35
|
+
if (resp.success) {
|
|
36
|
+
this.logger.debug('Session complete event sent successfully: %s', event.id);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
throw new Error(resp.message);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/services/session/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAGN,8BAA8B,EAC9B,iCAAiC,GAGjC,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC5B,SAAS,CAAY;IACrB,MAAM,CAAS;IAEvB,YAAY,MAAiB,EAAE,MAAc;QAC5C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,KAAwB;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CACxC,MAAM,EACN,qBAAqB,EACrB,uBAAuB,EAAE,EACzB,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EACnC,8BAA8B,CAC9B,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YACzE,OAAO;QACR,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,KAA2B;QACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CACxC,KAAK,EACL,qBAAqB,EACrB,uBAAuB,EAAE,EACzB,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EACnC,iCAAiC,CACjC,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO;QACR,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/session/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC"}
|