@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.
Files changed (104) hide show
  1. package/dist/_config.js +99 -0
  2. package/dist/_config.js.map +1 -0
  3. package/dist/_context.js +82 -0
  4. package/dist/_context.js.map +1 -0
  5. package/dist/_idle.js +24 -0
  6. package/dist/_idle.js.map +1 -0
  7. package/dist/_server.js +489 -0
  8. package/dist/_server.js.map +1 -0
  9. package/dist/_services.js +258 -0
  10. package/dist/_services.js.map +1 -0
  11. package/dist/_tokens.js +98 -0
  12. package/dist/_tokens.js.map +1 -0
  13. package/dist/_util.js +54 -0
  14. package/dist/_util.js.map +1 -0
  15. package/dist/_waituntil.js +87 -0
  16. package/dist/_waituntil.js.map +1 -0
  17. package/dist/agent.js +507 -0
  18. package/dist/agent.js.map +1 -0
  19. package/dist/app.d.ts +6 -1
  20. package/dist/app.d.ts.map +1 -1
  21. package/dist/app.js +72 -0
  22. package/dist/app.js.map +1 -0
  23. package/dist/eval.js +2 -0
  24. package/dist/eval.js.map +1 -0
  25. package/dist/index.js +11 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/io/email.js +154 -0
  28. package/dist/io/email.js.map +1 -0
  29. package/dist/logger/console.js +274 -0
  30. package/dist/logger/console.js.map +1 -0
  31. package/dist/logger/index.js +3 -0
  32. package/dist/logger/index.js.map +1 -0
  33. package/dist/logger/internal.js +133 -0
  34. package/dist/logger/internal.js.map +1 -0
  35. package/dist/logger/logger.js +2 -0
  36. package/dist/logger/logger.js.map +1 -0
  37. package/dist/logger/user.js +7 -0
  38. package/dist/logger/user.js.map +1 -0
  39. package/dist/logger/util.js +77 -0
  40. package/dist/logger/util.js.map +1 -0
  41. package/dist/otel/config.js +23 -0
  42. package/dist/otel/config.js.map +1 -0
  43. package/dist/otel/console.js +52 -0
  44. package/dist/otel/console.js.map +1 -0
  45. package/dist/otel/exporters/index.js +4 -0
  46. package/dist/otel/exporters/index.js.map +1 -0
  47. package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
  48. package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
  49. package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
  50. package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
  51. package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
  52. package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
  53. package/dist/otel/fetch.js +81 -0
  54. package/dist/otel/fetch.js.map +1 -0
  55. package/dist/otel/http.js +44 -0
  56. package/dist/otel/http.js.map +1 -0
  57. package/dist/otel/logger.js +278 -0
  58. package/dist/otel/logger.js.map +1 -0
  59. package/dist/otel/otel.js +233 -0
  60. package/dist/otel/otel.js.map +1 -0
  61. package/dist/router.js +350 -0
  62. package/dist/router.js.map +1 -0
  63. package/dist/services/evalrun/composite.js +26 -0
  64. package/dist/services/evalrun/composite.js.map +1 -0
  65. package/dist/services/evalrun/http.js +74 -0
  66. package/dist/services/evalrun/http.js.map +1 -0
  67. package/dist/services/evalrun/index.js +5 -0
  68. package/dist/services/evalrun/index.js.map +1 -0
  69. package/dist/services/evalrun/json.js +38 -0
  70. package/dist/services/evalrun/json.js.map +1 -0
  71. package/dist/services/evalrun/local.js +22 -0
  72. package/dist/services/evalrun/local.js.map +1 -0
  73. package/dist/services/local/_db.js +144 -0
  74. package/dist/services/local/_db.js.map +1 -0
  75. package/dist/services/local/_router.js +60 -0
  76. package/dist/services/local/_router.js.map +1 -0
  77. package/dist/services/local/_util.js +42 -0
  78. package/dist/services/local/_util.js.map +1 -0
  79. package/dist/services/local/index.js +8 -0
  80. package/dist/services/local/index.js.map +1 -0
  81. package/dist/services/local/keyvalue.js +114 -0
  82. package/dist/services/local/keyvalue.js.map +1 -0
  83. package/dist/services/local/objectstore.js +117 -0
  84. package/dist/services/local/objectstore.js.map +1 -0
  85. package/dist/services/local/stream.js +218 -0
  86. package/dist/services/local/stream.js.map +1 -0
  87. package/dist/services/local/vector.js +183 -0
  88. package/dist/services/local/vector.js.map +1 -0
  89. package/dist/services/session/composite.js +26 -0
  90. package/dist/services/session/composite.js.map +1 -0
  91. package/dist/services/session/http.js +42 -0
  92. package/dist/services/session/http.js.map +1 -0
  93. package/dist/services/session/index.js +5 -0
  94. package/dist/services/session/index.js.map +1 -0
  95. package/dist/services/session/json.js +35 -0
  96. package/dist/services/session/json.js.map +1 -0
  97. package/dist/services/session/local.js +22 -0
  98. package/dist/services/session/local.js.map +1 -0
  99. package/dist/session.js +199 -0
  100. package/dist/session.js.map +1 -0
  101. package/dist/workbench.js +38 -0
  102. package/dist/workbench.js.map +1 -0
  103. package/package.json +5 -5
  104. 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":"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"}