@agentuity/runtime 0.0.51 → 0.0.52
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.js +82 -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.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.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/app.ts +6 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Database } from 'bun:sqlite';
|
|
2
|
+
import { mkdirSync, existsSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
let dbInstance = null;
|
|
6
|
+
export function getLocalDB() {
|
|
7
|
+
if (dbInstance) {
|
|
8
|
+
return dbInstance;
|
|
9
|
+
}
|
|
10
|
+
const configDir = join(homedir(), '.config', 'agentuity');
|
|
11
|
+
if (!existsSync(configDir)) {
|
|
12
|
+
mkdirSync(configDir, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
const dbPath = join(configDir, 'local.db');
|
|
15
|
+
dbInstance = new Database(dbPath);
|
|
16
|
+
initializeTables(dbInstance);
|
|
17
|
+
cleanupOrphanedProjects(dbInstance);
|
|
18
|
+
return dbInstance;
|
|
19
|
+
}
|
|
20
|
+
function initializeTables(db) {
|
|
21
|
+
// KeyValue Storage table
|
|
22
|
+
db.run(`
|
|
23
|
+
CREATE TABLE IF NOT EXISTS kv_storage (
|
|
24
|
+
project_path TEXT NOT NULL,
|
|
25
|
+
name TEXT NOT NULL,
|
|
26
|
+
key TEXT NOT NULL,
|
|
27
|
+
value BLOB NOT NULL,
|
|
28
|
+
content_type TEXT NOT NULL DEFAULT 'application/octet-stream',
|
|
29
|
+
expires_at INTEGER,
|
|
30
|
+
created_at INTEGER NOT NULL,
|
|
31
|
+
updated_at INTEGER NOT NULL,
|
|
32
|
+
PRIMARY KEY (project_path, name, key)
|
|
33
|
+
)
|
|
34
|
+
`);
|
|
35
|
+
db.run(`
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_kv_expires
|
|
37
|
+
ON kv_storage(expires_at)
|
|
38
|
+
WHERE expires_at IS NOT NULL
|
|
39
|
+
`);
|
|
40
|
+
// Object Storage table
|
|
41
|
+
db.run(`
|
|
42
|
+
CREATE TABLE IF NOT EXISTS object_storage (
|
|
43
|
+
project_path TEXT NOT NULL,
|
|
44
|
+
bucket TEXT NOT NULL,
|
|
45
|
+
key TEXT NOT NULL,
|
|
46
|
+
data BLOB NOT NULL,
|
|
47
|
+
content_type TEXT NOT NULL DEFAULT 'application/octet-stream',
|
|
48
|
+
content_encoding TEXT,
|
|
49
|
+
cache_control TEXT,
|
|
50
|
+
content_disposition TEXT,
|
|
51
|
+
content_language TEXT,
|
|
52
|
+
metadata TEXT,
|
|
53
|
+
created_at INTEGER NOT NULL,
|
|
54
|
+
updated_at INTEGER NOT NULL,
|
|
55
|
+
PRIMARY KEY (project_path, bucket, key)
|
|
56
|
+
)
|
|
57
|
+
`);
|
|
58
|
+
// Stream Storage table
|
|
59
|
+
db.run(`
|
|
60
|
+
CREATE TABLE IF NOT EXISTS stream_storage (
|
|
61
|
+
project_path TEXT NOT NULL,
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
name TEXT NOT NULL,
|
|
64
|
+
metadata TEXT,
|
|
65
|
+
content_type TEXT NOT NULL DEFAULT 'application/octet-stream',
|
|
66
|
+
data BLOB,
|
|
67
|
+
size_bytes INTEGER NOT NULL DEFAULT 0,
|
|
68
|
+
created_at INTEGER NOT NULL
|
|
69
|
+
)
|
|
70
|
+
`);
|
|
71
|
+
db.run(`
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_stream_name
|
|
73
|
+
ON stream_storage(project_path, name)
|
|
74
|
+
`);
|
|
75
|
+
db.run(`
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_stream_metadata
|
|
77
|
+
ON stream_storage(metadata)
|
|
78
|
+
`);
|
|
79
|
+
// Vector Storage table
|
|
80
|
+
db.run(`
|
|
81
|
+
CREATE TABLE IF NOT EXISTS vector_storage (
|
|
82
|
+
project_path TEXT NOT NULL,
|
|
83
|
+
name TEXT NOT NULL,
|
|
84
|
+
id TEXT PRIMARY KEY,
|
|
85
|
+
key TEXT NOT NULL,
|
|
86
|
+
embedding TEXT NOT NULL,
|
|
87
|
+
document TEXT,
|
|
88
|
+
metadata TEXT,
|
|
89
|
+
created_at INTEGER NOT NULL,
|
|
90
|
+
updated_at INTEGER NOT NULL,
|
|
91
|
+
UNIQUE (project_path, name, key)
|
|
92
|
+
)
|
|
93
|
+
`);
|
|
94
|
+
db.run(`
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_vector_lookup
|
|
96
|
+
ON vector_storage(project_path, name, key)
|
|
97
|
+
`);
|
|
98
|
+
db.run(`
|
|
99
|
+
CREATE INDEX IF NOT EXISTS idx_vector_name
|
|
100
|
+
ON vector_storage(project_path, name)
|
|
101
|
+
`);
|
|
102
|
+
}
|
|
103
|
+
function cleanupOrphanedProjects(db) {
|
|
104
|
+
// Get the current project path to exclude from cleanup
|
|
105
|
+
const currentProjectPath = process.cwd();
|
|
106
|
+
// Query all tables for unique project paths
|
|
107
|
+
const kvPaths = db.query('SELECT DISTINCT project_path FROM kv_storage').all();
|
|
108
|
+
const objectPaths = db.query('SELECT DISTINCT project_path FROM object_storage').all();
|
|
109
|
+
const streamPaths = db.query('SELECT DISTINCT project_path FROM stream_storage').all();
|
|
110
|
+
const vectorPaths = db.query('SELECT DISTINCT project_path FROM vector_storage').all();
|
|
111
|
+
// Combine and deduplicate all project paths
|
|
112
|
+
const allPaths = new Set();
|
|
113
|
+
[...kvPaths, ...objectPaths, ...streamPaths, ...vectorPaths].forEach((row) => {
|
|
114
|
+
allPaths.add(row.project_path);
|
|
115
|
+
});
|
|
116
|
+
// Check which paths no longer exist and are not the current project
|
|
117
|
+
const pathsToDelete = [];
|
|
118
|
+
for (const path of allPaths) {
|
|
119
|
+
if (path !== currentProjectPath && !existsSync(path)) {
|
|
120
|
+
pathsToDelete.push(path);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Delete data for removed projects
|
|
124
|
+
if (pathsToDelete.length > 0) {
|
|
125
|
+
const placeholders = pathsToDelete.map(() => '?').join(', ');
|
|
126
|
+
// Delete from all tables
|
|
127
|
+
const deleteKv = db.prepare(`DELETE FROM kv_storage WHERE project_path IN (${placeholders})`);
|
|
128
|
+
const deleteObject = db.prepare(`DELETE FROM object_storage WHERE project_path IN (${placeholders})`);
|
|
129
|
+
const deleteStream = db.prepare(`DELETE FROM stream_storage WHERE project_path IN (${placeholders})`);
|
|
130
|
+
const deleteVector = db.prepare(`DELETE FROM vector_storage WHERE project_path IN (${placeholders})`);
|
|
131
|
+
deleteKv.run(...pathsToDelete);
|
|
132
|
+
deleteObject.run(...pathsToDelete);
|
|
133
|
+
deleteStream.run(...pathsToDelete);
|
|
134
|
+
deleteVector.run(...pathsToDelete);
|
|
135
|
+
console.log(`[LocalDB] Cleaned up data for ${pathsToDelete.length} orphaned project(s)`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export function closeLocalDB() {
|
|
139
|
+
if (dbInstance) {
|
|
140
|
+
dbInstance.close();
|
|
141
|
+
dbInstance = null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=_db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_db.js","sourceRoot":"","sources":["../../../src/services/local/_db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createRouter } from '../../router';
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
3
|
+
export function createLocalStorageRouter(db, projectPath) {
|
|
4
|
+
const router = createRouter();
|
|
5
|
+
// so we can detect if we're running in local mode easily
|
|
6
|
+
router.get('/_agentuity/local/health', (c) => c.text('OK'));
|
|
7
|
+
// Serve objects: GET /_agentuity/local/object/:bucket/:key
|
|
8
|
+
router.get('/_agentuity/local/object/:bucket/:key', async (c) => {
|
|
9
|
+
const bucket = c.req.param('bucket');
|
|
10
|
+
const key = c.req.param('key');
|
|
11
|
+
const query = db.query(`
|
|
12
|
+
SELECT data, content_type, content_encoding, cache_control,
|
|
13
|
+
content_disposition, content_language
|
|
14
|
+
FROM object_storage
|
|
15
|
+
WHERE project_path = ? AND bucket = ? AND key = ?
|
|
16
|
+
`);
|
|
17
|
+
const row = query.get(projectPath, bucket, key);
|
|
18
|
+
if (!row) {
|
|
19
|
+
return c.notFound();
|
|
20
|
+
}
|
|
21
|
+
// Set headers
|
|
22
|
+
const headers = {
|
|
23
|
+
'Content-Type': row.content_type,
|
|
24
|
+
};
|
|
25
|
+
if (row.content_encoding) {
|
|
26
|
+
headers['Content-Encoding'] = row.content_encoding;
|
|
27
|
+
}
|
|
28
|
+
if (row.cache_control) {
|
|
29
|
+
headers['Cache-Control'] = row.cache_control;
|
|
30
|
+
}
|
|
31
|
+
if (row.content_disposition) {
|
|
32
|
+
headers['Content-Disposition'] = row.content_disposition;
|
|
33
|
+
}
|
|
34
|
+
if (row.content_language) {
|
|
35
|
+
headers['Content-Language'] = row.content_language;
|
|
36
|
+
}
|
|
37
|
+
return c.body(new Uint8Array(row.data), 200, headers);
|
|
38
|
+
});
|
|
39
|
+
// Serve streams: GET /_agentuity/local/stream/:id
|
|
40
|
+
router.get('/_agentuity/local/stream/:id', async (c) => {
|
|
41
|
+
const id = c.req.param('id');
|
|
42
|
+
const query = db.query(`
|
|
43
|
+
SELECT data, content_type
|
|
44
|
+
FROM stream_storage
|
|
45
|
+
WHERE project_path = ? AND id = ?
|
|
46
|
+
`);
|
|
47
|
+
const row = query.get(projectPath, id);
|
|
48
|
+
if (!row) {
|
|
49
|
+
return c.notFound();
|
|
50
|
+
}
|
|
51
|
+
if (!row.data) {
|
|
52
|
+
return c.json({ error: 'Stream not finalized' }, 400);
|
|
53
|
+
}
|
|
54
|
+
return c.body(new Uint8Array(row.data), 200, {
|
|
55
|
+
'Content-Type': row.content_type,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
return router;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=_router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_router.js","sourceRoot":"","sources":["../../../src/services/local/_router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,8DAA8D;AAC9D,MAAM,UAAU,wBAAwB,CAAC,EAAY,EAAE,WAAmB;IACzE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAE9B,yDAAyD;IACzD,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5D,2DAA2D;IAC3D,MAAM,CAAC,GAAG,CAAC,uCAAuC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;;;;;GAKtB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAOtC,CAAC;QAET,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QACrB,CAAC;QAED,cAAc;QACd,MAAM,OAAO,GAA2B;YACvC,cAAc,EAAE,GAAG,CAAC,YAAY;SAChC,CAAC;QAEF,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,CAAC,kBAAkB,CAAC,GAAG,GAAG,CAAC,gBAAgB,CAAC;QACpD,CAAC;QACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC;QAC9C,CAAC;QACD,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO,CAAC,qBAAqB,CAAC,GAAG,GAAG,CAAC,mBAAmB,CAAC;QAC1D,CAAC;QACD,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,CAAC,kBAAkB,CAAC,GAAG,GAAG,CAAC,gBAAgB,CAAC;QACpD,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,CAAC,GAAG,CAAC,8BAA8B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACtD,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;;;;GAItB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAG7B,CAAC;QAET,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE;YAC5C,cAAc,EAAE,GAAG,CAAC,YAAY;SAChC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Normalize a project path to an absolute path for consistent DB keys
|
|
4
|
+
*/
|
|
5
|
+
export function normalizeProjectPath(cwd = process.cwd()) {
|
|
6
|
+
return resolve(cwd);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Simple character-based embedding for local vector search
|
|
10
|
+
* Not production-quality, but good enough for local dev/testing
|
|
11
|
+
*/
|
|
12
|
+
export function simpleEmbedding(text, dimensions = 128) {
|
|
13
|
+
const vec = new Array(dimensions).fill(0);
|
|
14
|
+
const normalized = text.toLowerCase();
|
|
15
|
+
for (let i = 0; i < normalized.length; i++) {
|
|
16
|
+
const charCode = normalized.charCodeAt(i);
|
|
17
|
+
vec[i % dimensions] += Math.sin(charCode * (i + 1));
|
|
18
|
+
vec[(i * 2) % dimensions] += Math.cos(charCode);
|
|
19
|
+
}
|
|
20
|
+
// Normalize vector
|
|
21
|
+
const magnitude = Math.sqrt(vec.reduce((sum, v) => sum + v * v, 0));
|
|
22
|
+
return magnitude > 0 ? vec.map((v) => v / magnitude) : vec;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Calculate cosine similarity between two vectors
|
|
26
|
+
*/
|
|
27
|
+
export function cosineSimilarity(a, b) {
|
|
28
|
+
if (a.length !== b.length) {
|
|
29
|
+
throw new Error('Vectors must have the same dimension');
|
|
30
|
+
}
|
|
31
|
+
const dot = a.reduce((sum, ai, i) => sum + ai * (b[i] ?? 0), 0);
|
|
32
|
+
const normA = Math.sqrt(a.reduce((sum, ai) => sum + ai * ai, 0));
|
|
33
|
+
const normB = Math.sqrt(b.reduce((sum, bi) => sum + bi * bi, 0));
|
|
34
|
+
return normA > 0 && normB > 0 ? dot / (normA * normB) : 0;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get current timestamp in milliseconds
|
|
38
|
+
*/
|
|
39
|
+
export function now() {
|
|
40
|
+
return Date.now();
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=_util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_util.js","sourceRoot":"","sources":["../../../src/services/local/_util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC/D,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,UAAU,GAAG,GAAG;IAC7D,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACxD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjE,OAAO,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG;IAClB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { getLocalDB, closeLocalDB } from './_db';
|
|
2
|
+
export { normalizeProjectPath, simpleEmbedding, cosineSimilarity } from './_util';
|
|
3
|
+
export { createLocalStorageRouter } from './_router';
|
|
4
|
+
export { LocalKeyValueStorage } from './keyvalue';
|
|
5
|
+
export { LocalObjectStorage } from './objectstore';
|
|
6
|
+
export { LocalStreamStorage } from './stream';
|
|
7
|
+
export { LocalVectorStorage } from './vector';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/local/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { now } from './_util';
|
|
2
|
+
export class LocalKeyValueStorage {
|
|
3
|
+
#db;
|
|
4
|
+
#projectPath;
|
|
5
|
+
constructor(db, projectPath) {
|
|
6
|
+
this.#db = db;
|
|
7
|
+
this.#projectPath = projectPath;
|
|
8
|
+
}
|
|
9
|
+
async get(name, key) {
|
|
10
|
+
const query = this.#db.query(`
|
|
11
|
+
SELECT value, content_type, expires_at
|
|
12
|
+
FROM kv_storage
|
|
13
|
+
WHERE project_path = ? AND name = ? AND key = ?
|
|
14
|
+
`);
|
|
15
|
+
const row = query.get(this.#projectPath, name, key);
|
|
16
|
+
if (!row) {
|
|
17
|
+
return { exists: false };
|
|
18
|
+
}
|
|
19
|
+
// Check expiration
|
|
20
|
+
if (row.expires_at && row.expires_at < now()) {
|
|
21
|
+
// Delete expired row
|
|
22
|
+
await this.delete(name, key);
|
|
23
|
+
return { exists: false };
|
|
24
|
+
}
|
|
25
|
+
// Deserialize based on content type
|
|
26
|
+
let data;
|
|
27
|
+
if (row.content_type === 'application/json') {
|
|
28
|
+
data = JSON.parse(row.value.toString('utf-8'));
|
|
29
|
+
}
|
|
30
|
+
else if (row.content_type.startsWith('text/')) {
|
|
31
|
+
data = row.value.toString('utf-8');
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
data = new Uint8Array(row.value);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
data,
|
|
38
|
+
contentType: row.content_type,
|
|
39
|
+
exists: true,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async set(name, key, value, params) {
|
|
43
|
+
// Validate TTL
|
|
44
|
+
if (params?.ttl && params.ttl < 60) {
|
|
45
|
+
throw new Error(`ttl must be at least 60 seconds, got ${params.ttl}`);
|
|
46
|
+
}
|
|
47
|
+
// Serialize value
|
|
48
|
+
let buffer;
|
|
49
|
+
let contentType = params?.contentType || 'application/octet-stream';
|
|
50
|
+
if (typeof value === 'string') {
|
|
51
|
+
buffer = Buffer.from(value, 'utf-8');
|
|
52
|
+
if (!params?.contentType) {
|
|
53
|
+
contentType = 'text/plain';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else if (value instanceof Uint8Array) {
|
|
57
|
+
buffer = Buffer.from(value);
|
|
58
|
+
}
|
|
59
|
+
else if (value instanceof ArrayBuffer) {
|
|
60
|
+
buffer = Buffer.from(new Uint8Array(value));
|
|
61
|
+
}
|
|
62
|
+
else if (typeof value === 'object') {
|
|
63
|
+
buffer = Buffer.from(JSON.stringify(value), 'utf-8');
|
|
64
|
+
contentType = 'application/json';
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
buffer = Buffer.from(String(value), 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
// Calculate expiration
|
|
70
|
+
const expiresAt = params?.ttl ? now() + params.ttl * 1000 : null;
|
|
71
|
+
const timestamp = now();
|
|
72
|
+
// UPSERT
|
|
73
|
+
const stmt = this.#db.prepare(`
|
|
74
|
+
INSERT INTO kv_storage (project_path, name, key, value, content_type, expires_at, created_at, updated_at)
|
|
75
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
76
|
+
ON CONFLICT(project_path, name, key)
|
|
77
|
+
DO UPDATE SET
|
|
78
|
+
value = excluded.value,
|
|
79
|
+
content_type = excluded.content_type,
|
|
80
|
+
expires_at = excluded.expires_at,
|
|
81
|
+
updated_at = excluded.updated_at
|
|
82
|
+
`);
|
|
83
|
+
stmt.run(this.#projectPath, name, key, buffer, contentType, expiresAt, timestamp, timestamp);
|
|
84
|
+
}
|
|
85
|
+
async delete(name, key) {
|
|
86
|
+
const stmt = this.#db.prepare(`
|
|
87
|
+
DELETE FROM kv_storage
|
|
88
|
+
WHERE project_path = ? AND name = ? AND key = ?
|
|
89
|
+
`);
|
|
90
|
+
stmt.run(this.#projectPath, name, key);
|
|
91
|
+
}
|
|
92
|
+
async getStats(_name) {
|
|
93
|
+
throw new Error('getStats not implemented for local storage');
|
|
94
|
+
}
|
|
95
|
+
async getAllStats() {
|
|
96
|
+
throw new Error('getAllStats not implemented for local storage');
|
|
97
|
+
}
|
|
98
|
+
async getNamespaces() {
|
|
99
|
+
throw new Error('getNamespaces not implemented for local storage');
|
|
100
|
+
}
|
|
101
|
+
async search(_name, _keyword) {
|
|
102
|
+
throw new Error('search not implemented for local storage');
|
|
103
|
+
}
|
|
104
|
+
async getKeys(_name) {
|
|
105
|
+
throw new Error('getKeys not implemented for local storage');
|
|
106
|
+
}
|
|
107
|
+
async deleteNamespace(_name) {
|
|
108
|
+
throw new Error('deleteNamespace not implemented for local storage');
|
|
109
|
+
}
|
|
110
|
+
async createNamespace(_name) {
|
|
111
|
+
throw new Error('createNamespace not implemented for local storage');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=keyvalue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyvalue.js","sourceRoot":"","sources":["../../../src/services/local/keyvalue.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|