family-ai-agent 1.0.6 → 1.0.8
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/.letta/settings.local.json +3 -0
- package/dist/cli/index.js +1 -1
- package/dist/database/adapters/base-adapter.d.ts +81 -0
- package/dist/database/adapters/base-adapter.d.ts.map +1 -0
- package/dist/database/adapters/base-adapter.js +105 -0
- package/dist/database/adapters/base-adapter.js.map +1 -0
- package/dist/database/adapters/index.d.ts +49 -0
- package/dist/database/adapters/index.d.ts.map +1 -0
- package/dist/database/adapters/index.js +200 -0
- package/dist/database/adapters/index.js.map +1 -0
- package/dist/database/adapters/postgres-adapter.d.ts +75 -0
- package/dist/database/adapters/postgres-adapter.d.ts.map +1 -0
- package/dist/database/adapters/postgres-adapter.js +225 -0
- package/dist/database/adapters/postgres-adapter.js.map +1 -0
- package/dist/database/adapters/sqlite-adapter.d.ts +72 -0
- package/dist/database/adapters/sqlite-adapter.d.ts.map +1 -0
- package/dist/database/adapters/sqlite-adapter.js +368 -0
- package/dist/database/adapters/sqlite-adapter.js.map +1 -0
- package/dist/database/cache/cache-keys.d.ts +180 -0
- package/dist/database/cache/cache-keys.d.ts.map +1 -0
- package/dist/database/cache/cache-keys.js +107 -0
- package/dist/database/cache/cache-keys.js.map +1 -0
- package/dist/database/cache/index.d.ts +24 -0
- package/dist/database/cache/index.d.ts.map +1 -0
- package/dist/database/cache/index.js +34 -0
- package/dist/database/cache/index.js.map +1 -0
- package/dist/database/cache/query-cache.d.ts +67 -0
- package/dist/database/cache/query-cache.d.ts.map +1 -0
- package/dist/database/cache/query-cache.js +177 -0
- package/dist/database/cache/query-cache.js.map +1 -0
- package/dist/database/client.d.ts +63 -4
- package/dist/database/client.d.ts.map +1 -1
- package/dist/database/client.js +147 -59
- package/dist/database/client.js.map +1 -1
- package/dist/database/db-config.d.ts +104 -0
- package/dist/database/db-config.d.ts.map +1 -0
- package/dist/database/db-config.js +167 -0
- package/dist/database/db-config.js.map +1 -0
- package/dist/database/drizzle/index.d.ts +42 -0
- package/dist/database/drizzle/index.d.ts.map +1 -0
- package/dist/database/drizzle/index.js +48 -0
- package/dist/database/drizzle/index.js.map +1 -0
- package/dist/database/drizzle/schema/audit.d.ts +533 -0
- package/dist/database/drizzle/schema/audit.d.ts.map +1 -0
- package/dist/database/drizzle/schema/audit.js +71 -0
- package/dist/database/drizzle/schema/audit.js.map +1 -0
- package/dist/database/drizzle/schema/checkpoints.d.ts +665 -0
- package/dist/database/drizzle/schema/checkpoints.d.ts.map +1 -0
- package/dist/database/drizzle/schema/checkpoints.js +110 -0
- package/dist/database/drizzle/schema/checkpoints.js.map +1 -0
- package/dist/database/drizzle/schema/conversations.d.ts +449 -0
- package/dist/database/drizzle/schema/conversations.d.ts.map +1 -0
- package/dist/database/drizzle/schema/conversations.js +91 -0
- package/dist/database/drizzle/schema/conversations.js.map +1 -0
- package/dist/database/drizzle/schema/documents.d.ts +600 -0
- package/dist/database/drizzle/schema/documents.d.ts.map +1 -0
- package/dist/database/drizzle/schema/documents.js +100 -0
- package/dist/database/drizzle/schema/documents.js.map +1 -0
- package/dist/database/drizzle/schema/index.d.ts +3084 -0
- package/dist/database/drizzle/schema/index.d.ts.map +1 -0
- package/dist/database/drizzle/schema/index.js +46 -0
- package/dist/database/drizzle/schema/index.js.map +1 -0
- package/dist/database/drizzle/schema/memories.d.ts +435 -0
- package/dist/database/drizzle/schema/memories.d.ts.map +1 -0
- package/dist/database/drizzle/schema/memories.js +73 -0
- package/dist/database/drizzle/schema/memories.js.map +1 -0
- package/dist/database/drizzle/schema/tasks.d.ts +565 -0
- package/dist/database/drizzle/schema/tasks.d.ts.map +1 -0
- package/dist/database/drizzle/schema/tasks.js +84 -0
- package/dist/database/drizzle/schema/tasks.js.map +1 -0
- package/dist/database/health/circuit-breaker.d.ts +81 -0
- package/dist/database/health/circuit-breaker.d.ts.map +1 -0
- package/dist/database/health/circuit-breaker.js +184 -0
- package/dist/database/health/circuit-breaker.js.map +1 -0
- package/dist/database/health/health-monitor.d.ts +69 -0
- package/dist/database/health/health-monitor.d.ts.map +1 -0
- package/dist/database/health/health-monitor.js +174 -0
- package/dist/database/health/health-monitor.js.map +1 -0
- package/dist/database/health/index.d.ts +27 -0
- package/dist/database/health/index.d.ts.map +1 -0
- package/dist/database/health/index.js +23 -0
- package/dist/database/health/index.js.map +1 -0
- package/dist/database/index.d.ts +16 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +41 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/migrations/index.d.ts +34 -0
- package/dist/database/migrations/index.d.ts.map +1 -0
- package/dist/database/migrations/index.js +45 -0
- package/dist/database/migrations/index.js.map +1 -0
- package/dist/database/migrations/migrator.d.ts +77 -0
- package/dist/database/migrations/migrator.d.ts.map +1 -0
- package/dist/database/migrations/migrator.js +258 -0
- package/dist/database/migrations/migrator.js.map +1 -0
- package/dist/database/migrations/versions/001_initial.d.ts +9 -0
- package/dist/database/migrations/versions/001_initial.d.ts.map +1 -0
- package/dist/database/migrations/versions/001_initial.js +183 -0
- package/dist/database/migrations/versions/001_initial.js.map +1 -0
- package/dist/database/types.d.ts +255 -0
- package/dist/database/types.d.ts.map +1 -0
- package/dist/database/types.js +8 -0
- package/dist/database/types.js.map +1 -0
- package/dist/database/vector/embedding-cache.d.ts +92 -0
- package/dist/database/vector/embedding-cache.d.ts.map +1 -0
- package/dist/database/vector/embedding-cache.js +185 -0
- package/dist/database/vector/embedding-cache.js.map +1 -0
- package/dist/database/vector/hnsw-index.d.ts +111 -0
- package/dist/database/vector/hnsw-index.d.ts.map +1 -0
- package/dist/database/vector/hnsw-index.js +337 -0
- package/dist/database/vector/hnsw-index.js.map +1 -0
- package/dist/database/vector/index.d.ts +75 -0
- package/dist/database/vector/index.d.ts.map +1 -0
- package/dist/database/vector/index.js +213 -0
- package/dist/database/vector/index.js.map +1 -0
- package/dist/database/vector/similarity.d.ts +67 -0
- package/dist/database/vector/similarity.d.ts.map +1 -0
- package/dist/database/vector/similarity.js +176 -0
- package/dist/database/vector/similarity.js.map +1 -0
- package/package.json +6 -3
- package/src/cli/index.ts +1 -1
- package/src/database/adapters/base-adapter.ts +171 -0
- package/src/database/adapters/index.ts +224 -0
- package/src/database/adapters/postgres-adapter.ts +285 -0
- package/src/database/adapters/sqlite-adapter.ts +420 -0
- package/src/database/cache/cache-keys.ts +150 -0
- package/src/database/cache/index.ts +44 -0
- package/src/database/cache/query-cache.ts +213 -0
- package/src/database/client.ts +166 -64
- package/src/database/db-config.ts +194 -0
- package/src/database/drizzle/index.ts +66 -0
- package/src/database/drizzle/schema/audit.ts +127 -0
- package/src/database/drizzle/schema/checkpoints.ts +164 -0
- package/src/database/drizzle/schema/conversations.ts +138 -0
- package/src/database/drizzle/schema/documents.ts +157 -0
- package/src/database/drizzle/schema/index.ts +139 -0
- package/src/database/drizzle/schema/memories.ts +127 -0
- package/src/database/drizzle/schema/tasks.ts +129 -0
- package/src/database/health/circuit-breaker.ts +214 -0
- package/src/database/health/health-monitor.ts +224 -0
- package/src/database/health/index.ts +41 -0
- package/src/database/index.ts +157 -0
- package/src/database/migrations/index.ts +52 -0
- package/src/database/migrations/migrator.ts +325 -0
- package/src/database/migrations/versions/001_initial.ts +198 -0
- package/src/database/types.ts +324 -0
- package/src/database/vector/embedding-cache.ts +234 -0
- package/src/database/vector/hnsw-index.ts +452 -0
- package/src/database/vector/index.ts +292 -0
- package/src/database/vector/similarity.ts +198 -0
package/dist/cli/index.js
CHANGED
|
@@ -260,7 +260,7 @@ async function runQuery(query) {
|
|
|
260
260
|
program
|
|
261
261
|
.name('family-ai-agent')
|
|
262
262
|
.description('Family AI Agent - Your AI Family for All Tasks')
|
|
263
|
-
.version('1.0.
|
|
263
|
+
.version('1.0.8');
|
|
264
264
|
// Add config command group
|
|
265
265
|
program.addCommand(createConfigCommand());
|
|
266
266
|
program
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Database Adapter
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for database adapters.
|
|
5
|
+
* Provides common functionality and interface contract.
|
|
6
|
+
*/
|
|
7
|
+
import type { DatabaseAdapter, DatabaseType, QueryResult, TransactionClient, PoolStats } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Abstract base adapter class
|
|
10
|
+
*/
|
|
11
|
+
export declare abstract class BaseAdapter implements DatabaseAdapter {
|
|
12
|
+
abstract readonly type: DatabaseType;
|
|
13
|
+
protected _isInitialized: boolean;
|
|
14
|
+
get isInitialized(): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the database connection
|
|
17
|
+
*/
|
|
18
|
+
abstract initialize(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Execute a raw SQL query
|
|
21
|
+
*/
|
|
22
|
+
abstract query<T extends Record<string, any> = Record<string, any>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
23
|
+
/**
|
|
24
|
+
* Execute a transaction
|
|
25
|
+
*/
|
|
26
|
+
abstract transaction<T>(callback: (client: TransactionClient) => Promise<T>): Promise<T>;
|
|
27
|
+
/**
|
|
28
|
+
* Check database health
|
|
29
|
+
*/
|
|
30
|
+
abstract healthCheck(): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Get connection pool statistics
|
|
33
|
+
*/
|
|
34
|
+
getPoolStats?(): PoolStats;
|
|
35
|
+
/**
|
|
36
|
+
* Close all connections
|
|
37
|
+
*/
|
|
38
|
+
abstract close(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Ensure adapter is initialized before operations
|
|
41
|
+
*/
|
|
42
|
+
protected ensureInitialized(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Log query execution
|
|
45
|
+
*/
|
|
46
|
+
protected logQuery(sql: string, durationMs: number, rowCount: number | null): void;
|
|
47
|
+
/**
|
|
48
|
+
* Log query error
|
|
49
|
+
*/
|
|
50
|
+
protected logError(sql: string, error: unknown): void;
|
|
51
|
+
/**
|
|
52
|
+
* Convert PostgreSQL parameter placeholders ($1, $2) to SQLite (?)
|
|
53
|
+
*/
|
|
54
|
+
protected convertPlaceholders(sql: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Convert PostgreSQL-specific syntax to SQLite
|
|
57
|
+
*/
|
|
58
|
+
protected convertToSqlite(sql: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Extract RETURNING clause from SQL
|
|
61
|
+
*/
|
|
62
|
+
protected extractReturning(sql: string): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* Extract table name from INSERT/UPDATE/DELETE
|
|
65
|
+
*/
|
|
66
|
+
protected extractTableName(sql: string): string | null;
|
|
67
|
+
/**
|
|
68
|
+
* Check if SQL is a SELECT query
|
|
69
|
+
*/
|
|
70
|
+
protected isSelectQuery(sql: string): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Check if SQL has RETURNING clause
|
|
73
|
+
*/
|
|
74
|
+
protected hasReturning(sql: string): boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Adapter factory function type
|
|
78
|
+
*/
|
|
79
|
+
export type AdapterFactory = () => Promise<DatabaseAdapter>;
|
|
80
|
+
export default BaseAdapter;
|
|
81
|
+
//# sourceMappingURL=base-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/base-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,SAAS,EACV,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,8BAAsB,WAAY,YAAW,eAAe;IAC1D,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IACrC,SAAS,CAAC,cAAc,UAAS;IAEjC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAEpC;;OAEG;IACH,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChE,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,CAAC,EACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GAClD,OAAO,CAAC,CAAC,CAAC;IAEb;;OAEG;IACH,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAExC;;OAEG;IACH,YAAY,CAAC,IAAI,SAAS;IAE1B;;OAEG;IACH,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,iBAAiB,IAAI,IAAI;IAMnC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASlF;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IASrD;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIlD;;OAEG;IACH,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAkB9C;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKtD;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAatD;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAG7C;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;AAE5D,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Database Adapter
|
|
3
|
+
*
|
|
4
|
+
* Abstract base class for database adapters.
|
|
5
|
+
* Provides common functionality and interface contract.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '../../utils/logger.js';
|
|
8
|
+
import { MemoryError } from '../../utils/errors.js';
|
|
9
|
+
const logger = createLogger('DatabaseAdapter');
|
|
10
|
+
/**
|
|
11
|
+
* Abstract base adapter class
|
|
12
|
+
*/
|
|
13
|
+
export class BaseAdapter {
|
|
14
|
+
_isInitialized = false;
|
|
15
|
+
get isInitialized() {
|
|
16
|
+
return this._isInitialized;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Ensure adapter is initialized before operations
|
|
20
|
+
*/
|
|
21
|
+
ensureInitialized() {
|
|
22
|
+
if (!this._isInitialized) {
|
|
23
|
+
throw new MemoryError('Database adapter not initialized. Call initialize() first.');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Log query execution
|
|
28
|
+
*/
|
|
29
|
+
logQuery(sql, durationMs, rowCount) {
|
|
30
|
+
logger.debug('Query executed', {
|
|
31
|
+
database: this.type,
|
|
32
|
+
duration: durationMs,
|
|
33
|
+
rows: rowCount,
|
|
34
|
+
query: sql.slice(0, 100),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Log query error
|
|
39
|
+
*/
|
|
40
|
+
logError(sql, error) {
|
|
41
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
42
|
+
logger.error('Query failed', {
|
|
43
|
+
database: this.type,
|
|
44
|
+
error: errorMessage,
|
|
45
|
+
query: sql.slice(0, 100),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert PostgreSQL parameter placeholders ($1, $2) to SQLite (?)
|
|
50
|
+
*/
|
|
51
|
+
convertPlaceholders(sql) {
|
|
52
|
+
return sql.replace(/\$\d+/g, '?');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Convert PostgreSQL-specific syntax to SQLite
|
|
56
|
+
*/
|
|
57
|
+
convertToSqlite(sql) {
|
|
58
|
+
let converted = this.convertPlaceholders(sql);
|
|
59
|
+
// Replace NOW() with CURRENT_TIMESTAMP
|
|
60
|
+
converted = converted.replace(/NOW\(\)/gi, 'CURRENT_TIMESTAMP');
|
|
61
|
+
// Remove ::type casts
|
|
62
|
+
converted = converted.replace(/::[a-zA-Z_]+(\[\])?/g, '');
|
|
63
|
+
// Replace JSONB with JSON (SQLite uses text)
|
|
64
|
+
converted = converted.replace(/JSONB/gi, 'JSON');
|
|
65
|
+
// Replace gen_random_uuid() with a placeholder (handled in code)
|
|
66
|
+
converted = converted.replace(/gen_random_uuid\(\)/gi, "lower(hex(randomblob(16)))");
|
|
67
|
+
return converted;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract RETURNING clause from SQL
|
|
71
|
+
*/
|
|
72
|
+
extractReturning(sql) {
|
|
73
|
+
const match = sql.match(/RETURNING\s+(.+?)$/i);
|
|
74
|
+
return match ? match[1].trim() : null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Extract table name from INSERT/UPDATE/DELETE
|
|
78
|
+
*/
|
|
79
|
+
extractTableName(sql) {
|
|
80
|
+
const insertMatch = sql.match(/INSERT\s+INTO\s+["']?(\w+)["']?/i);
|
|
81
|
+
if (insertMatch)
|
|
82
|
+
return insertMatch[1];
|
|
83
|
+
const updateMatch = sql.match(/UPDATE\s+["']?(\w+)["']?/i);
|
|
84
|
+
if (updateMatch)
|
|
85
|
+
return updateMatch[1];
|
|
86
|
+
const deleteMatch = sql.match(/DELETE\s+FROM\s+["']?(\w+)["']?/i);
|
|
87
|
+
if (deleteMatch)
|
|
88
|
+
return deleteMatch[1];
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if SQL is a SELECT query
|
|
93
|
+
*/
|
|
94
|
+
isSelectQuery(sql) {
|
|
95
|
+
return sql.trim().toUpperCase().startsWith('SELECT');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if SQL has RETURNING clause
|
|
99
|
+
*/
|
|
100
|
+
hasReturning(sql) {
|
|
101
|
+
return /RETURNING\s+/i.test(sql);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export default BaseAdapter;
|
|
105
|
+
//# sourceMappingURL=base-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../../../src/database/adapters/base-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Adapter Factory
|
|
3
|
+
*
|
|
4
|
+
* Factory for creating database adapters with auto-detection support.
|
|
5
|
+
* Tries PostgreSQL first, falls back to SQLite automatically.
|
|
6
|
+
*/
|
|
7
|
+
import type { DatabaseAdapter, DetectionResult, DatabaseConfig } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Detect which database to use
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectDatabase(config: DatabaseConfig): Promise<DetectionResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Create database adapter based on detection result
|
|
14
|
+
*/
|
|
15
|
+
export declare function createAdapter(detection: DetectionResult, config: DatabaseConfig): Promise<DatabaseAdapter>;
|
|
16
|
+
/**
|
|
17
|
+
* Get or create the database adapter singleton
|
|
18
|
+
*/
|
|
19
|
+
export declare function getAdapter(): Promise<DatabaseAdapter>;
|
|
20
|
+
/**
|
|
21
|
+
* Close the database adapter
|
|
22
|
+
*/
|
|
23
|
+
export declare function closeAdapter(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Reset adapter (for testing)
|
|
26
|
+
*/
|
|
27
|
+
export declare function resetAdapter(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Check if adapter is initialized
|
|
30
|
+
*/
|
|
31
|
+
export declare function isAdapterInitialized(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get current adapter type
|
|
34
|
+
*/
|
|
35
|
+
export declare function getAdapterType(): 'postgresql' | 'sqlite' | null;
|
|
36
|
+
export { PostgresAdapter } from './postgres-adapter.js';
|
|
37
|
+
export { SQLiteAdapter } from './sqlite-adapter.js';
|
|
38
|
+
export { BaseAdapter } from './base-adapter.js';
|
|
39
|
+
declare const _default: {
|
|
40
|
+
getAdapter: typeof getAdapter;
|
|
41
|
+
closeAdapter: typeof closeAdapter;
|
|
42
|
+
resetAdapter: typeof resetAdapter;
|
|
43
|
+
detectDatabase: typeof detectDatabase;
|
|
44
|
+
createAdapter: typeof createAdapter;
|
|
45
|
+
isAdapterInitialized: typeof isAdapterInitialized;
|
|
46
|
+
getAdapterType: typeof getAdapterType;
|
|
47
|
+
};
|
|
48
|
+
export default _default;
|
|
49
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUpF;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAoGrF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAWhH;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC,CAU3D;AAmBD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,YAAY,GAAG,QAAQ,GAAG,IAAI,CAE/D;AAGD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;;;;;;;;;;AAEhD,wBAQE"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Adapter Factory
|
|
3
|
+
*
|
|
4
|
+
* Factory for creating database adapters with auto-detection support.
|
|
5
|
+
* Tries PostgreSQL first, falls back to SQLite automatically.
|
|
6
|
+
*/
|
|
7
|
+
import pg from 'pg';
|
|
8
|
+
import { PostgresAdapter } from './postgres-adapter.js';
|
|
9
|
+
import { SQLiteAdapter } from './sqlite-adapter.js';
|
|
10
|
+
import { getDatabaseConfig, buildPostgresUrl, getDefaultSqlitePath } from '../db-config.js';
|
|
11
|
+
import { createLogger } from '../../utils/logger.js';
|
|
12
|
+
const { Pool } = pg;
|
|
13
|
+
const logger = createLogger('AdapterFactory');
|
|
14
|
+
// Singleton adapter instance
|
|
15
|
+
let adapterInstance = null;
|
|
16
|
+
let initPromise = null;
|
|
17
|
+
/**
|
|
18
|
+
* Detect which database to use
|
|
19
|
+
*/
|
|
20
|
+
export async function detectDatabase(config) {
|
|
21
|
+
// 1. Check for explicit configuration
|
|
22
|
+
if (config.type !== 'auto') {
|
|
23
|
+
if (config.type === 'postgresql') {
|
|
24
|
+
return {
|
|
25
|
+
type: 'postgresql',
|
|
26
|
+
connectionString: config.postgresUrl ?? buildPostgresUrl({
|
|
27
|
+
DATABASE_URL: config.postgresUrl,
|
|
28
|
+
DB_HOST: config.postgresHost,
|
|
29
|
+
DB_PORT: config.postgresPort,
|
|
30
|
+
DB_USER: config.postgresUser,
|
|
31
|
+
DB_PASSWORD: config.postgresPassword,
|
|
32
|
+
DB_NAME: config.postgresDatabase,
|
|
33
|
+
DB_POOL_MAX: config.postgresPoolMax,
|
|
34
|
+
DB_POOL_IDLE_TIMEOUT_MS: config.postgresIdleTimeoutMs,
|
|
35
|
+
DB_POOL_CONNECTION_TIMEOUT_MS: config.postgresConnectionTimeoutMs,
|
|
36
|
+
DATABASE_TYPE: 'postgresql',
|
|
37
|
+
SQLITE_PATH: config.sqlitePath,
|
|
38
|
+
DB_HEALTH_CHECK_INTERVAL_MS: config.healthCheckIntervalMs,
|
|
39
|
+
DB_CIRCUIT_BREAKER_THRESHOLD: config.circuitBreakerThreshold,
|
|
40
|
+
DB_CIRCUIT_BREAKER_TIMEOUT_MS: config.circuitBreakerTimeoutMs,
|
|
41
|
+
DB_CACHE_MAX_SIZE: config.cacheMaxSize,
|
|
42
|
+
DB_CACHE_TTL_MS: config.cacheTtlMs,
|
|
43
|
+
VECTOR_DIMENSION: config.vectorDimension,
|
|
44
|
+
VECTOR_MIN_SIMILARITY: config.vectorMinSimilarity,
|
|
45
|
+
}),
|
|
46
|
+
reason: 'Explicit PostgreSQL configuration',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
type: 'sqlite',
|
|
51
|
+
sqlitePath: config.sqlitePath ?? getDefaultSqlitePath(),
|
|
52
|
+
reason: 'Explicit SQLite configuration',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// 2. Check for DATABASE_URL (usually means PostgreSQL is intended)
|
|
56
|
+
if (config.postgresUrl) {
|
|
57
|
+
return {
|
|
58
|
+
type: 'postgresql',
|
|
59
|
+
connectionString: config.postgresUrl,
|
|
60
|
+
reason: 'DATABASE_URL environment variable set',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// 3. Try PostgreSQL connection
|
|
64
|
+
try {
|
|
65
|
+
const connectionString = buildPostgresUrl({
|
|
66
|
+
DATABASE_URL: config.postgresUrl,
|
|
67
|
+
DB_HOST: config.postgresHost,
|
|
68
|
+
DB_PORT: config.postgresPort,
|
|
69
|
+
DB_USER: config.postgresUser,
|
|
70
|
+
DB_PASSWORD: config.postgresPassword,
|
|
71
|
+
DB_NAME: config.postgresDatabase,
|
|
72
|
+
DB_POOL_MAX: config.postgresPoolMax,
|
|
73
|
+
DB_POOL_IDLE_TIMEOUT_MS: config.postgresIdleTimeoutMs,
|
|
74
|
+
DB_POOL_CONNECTION_TIMEOUT_MS: config.postgresConnectionTimeoutMs,
|
|
75
|
+
DATABASE_TYPE: 'auto',
|
|
76
|
+
SQLITE_PATH: config.sqlitePath,
|
|
77
|
+
DB_HEALTH_CHECK_INTERVAL_MS: config.healthCheckIntervalMs,
|
|
78
|
+
DB_CIRCUIT_BREAKER_THRESHOLD: config.circuitBreakerThreshold,
|
|
79
|
+
DB_CIRCUIT_BREAKER_TIMEOUT_MS: config.circuitBreakerTimeoutMs,
|
|
80
|
+
DB_CACHE_MAX_SIZE: config.cacheMaxSize,
|
|
81
|
+
DB_CACHE_TTL_MS: config.cacheTtlMs,
|
|
82
|
+
VECTOR_DIMENSION: config.vectorDimension,
|
|
83
|
+
VECTOR_MIN_SIMILARITY: config.vectorMinSimilarity,
|
|
84
|
+
});
|
|
85
|
+
const pool = new Pool({
|
|
86
|
+
connectionString,
|
|
87
|
+
connectionTimeoutMillis: 3000, // Quick timeout for detection
|
|
88
|
+
});
|
|
89
|
+
try {
|
|
90
|
+
const client = await pool.connect();
|
|
91
|
+
await client.query('SELECT 1');
|
|
92
|
+
client.release();
|
|
93
|
+
await pool.end();
|
|
94
|
+
logger.info('PostgreSQL connection successful');
|
|
95
|
+
return {
|
|
96
|
+
type: 'postgresql',
|
|
97
|
+
connectionString,
|
|
98
|
+
reason: 'PostgreSQL connection successful',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
await pool.end().catch(() => { });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
107
|
+
logger.debug('PostgreSQL not available, falling back to SQLite', { error: message });
|
|
108
|
+
}
|
|
109
|
+
// 4. Fall back to SQLite
|
|
110
|
+
const sqlitePath = config.sqlitePath ?? getDefaultSqlitePath();
|
|
111
|
+
return {
|
|
112
|
+
type: 'sqlite',
|
|
113
|
+
sqlitePath,
|
|
114
|
+
reason: 'PostgreSQL unavailable, using SQLite fallback',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create database adapter based on detection result
|
|
119
|
+
*/
|
|
120
|
+
export async function createAdapter(detection, config) {
|
|
121
|
+
let adapter;
|
|
122
|
+
if (detection.type === 'postgresql') {
|
|
123
|
+
adapter = new PostgresAdapter(detection.connectionString, config);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
adapter = new SQLiteAdapter(detection.sqlitePath, config);
|
|
127
|
+
}
|
|
128
|
+
await adapter.initialize();
|
|
129
|
+
return adapter;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get or create the database adapter singleton
|
|
133
|
+
*/
|
|
134
|
+
export async function getAdapter() {
|
|
135
|
+
if (adapterInstance?.isInitialized) {
|
|
136
|
+
return adapterInstance;
|
|
137
|
+
}
|
|
138
|
+
if (!initPromise) {
|
|
139
|
+
initPromise = initializeAdapter();
|
|
140
|
+
}
|
|
141
|
+
return initPromise;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Initialize the database adapter
|
|
145
|
+
*/
|
|
146
|
+
async function initializeAdapter() {
|
|
147
|
+
const config = getDatabaseConfig();
|
|
148
|
+
const detection = await detectDatabase(config);
|
|
149
|
+
logger.info('Database detected', {
|
|
150
|
+
type: detection.type,
|
|
151
|
+
reason: detection.reason,
|
|
152
|
+
path: detection.sqlitePath,
|
|
153
|
+
});
|
|
154
|
+
adapterInstance = await createAdapter(detection, config);
|
|
155
|
+
return adapterInstance;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Close the database adapter
|
|
159
|
+
*/
|
|
160
|
+
export async function closeAdapter() {
|
|
161
|
+
if (adapterInstance) {
|
|
162
|
+
await adapterInstance.close();
|
|
163
|
+
adapterInstance = null;
|
|
164
|
+
initPromise = null;
|
|
165
|
+
logger.info('Database adapter closed');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Reset adapter (for testing)
|
|
170
|
+
*/
|
|
171
|
+
export function resetAdapter() {
|
|
172
|
+
adapterInstance = null;
|
|
173
|
+
initPromise = null;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Check if adapter is initialized
|
|
177
|
+
*/
|
|
178
|
+
export function isAdapterInitialized() {
|
|
179
|
+
return adapterInstance?.isInitialized ?? false;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get current adapter type
|
|
183
|
+
*/
|
|
184
|
+
export function getAdapterType() {
|
|
185
|
+
return adapterInstance?.type ?? null;
|
|
186
|
+
}
|
|
187
|
+
// Re-export adapter classes
|
|
188
|
+
export { PostgresAdapter } from './postgres-adapter.js';
|
|
189
|
+
export { SQLiteAdapter } from './sqlite-adapter.js';
|
|
190
|
+
export { BaseAdapter } from './base-adapter.js';
|
|
191
|
+
export default {
|
|
192
|
+
getAdapter,
|
|
193
|
+
closeAdapter,
|
|
194
|
+
resetAdapter,
|
|
195
|
+
detectDatabase,
|
|
196
|
+
createAdapter,
|
|
197
|
+
isAdapterInitialized,
|
|
198
|
+
getAdapterType,
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/database/adapters/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Database Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapter for PostgreSQL with connection pooling and pgvector support.
|
|
5
|
+
*/
|
|
6
|
+
import pg from 'pg';
|
|
7
|
+
import type { QueryResultRow } from 'pg';
|
|
8
|
+
import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
|
|
9
|
+
import { BaseAdapter } from './base-adapter.js';
|
|
10
|
+
import type { QueryResult, TransactionClient, PoolStats, DatabaseConfig } from '../types.js';
|
|
11
|
+
import * as schema from '../drizzle/schema/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* PostgreSQL database adapter with Drizzle ORM
|
|
14
|
+
*/
|
|
15
|
+
export declare class PostgresAdapter extends BaseAdapter {
|
|
16
|
+
readonly type: "postgresql";
|
|
17
|
+
private pool;
|
|
18
|
+
private drizzleInstance;
|
|
19
|
+
private connectionString;
|
|
20
|
+
private config;
|
|
21
|
+
constructor(connectionString: string, config: DatabaseConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Get Drizzle ORM instance
|
|
24
|
+
*/
|
|
25
|
+
get drizzle(): NodePgDatabase<typeof schema>;
|
|
26
|
+
/**
|
|
27
|
+
* Get raw pool (for advanced operations)
|
|
28
|
+
*/
|
|
29
|
+
get rawPool(): pg.Pool;
|
|
30
|
+
/**
|
|
31
|
+
* Initialize PostgreSQL connection pool
|
|
32
|
+
*/
|
|
33
|
+
initialize(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Test database connection
|
|
36
|
+
*/
|
|
37
|
+
private testConnection;
|
|
38
|
+
/**
|
|
39
|
+
* Enable pgvector extension if not already enabled
|
|
40
|
+
*/
|
|
41
|
+
private enablePgVector;
|
|
42
|
+
/**
|
|
43
|
+
* Execute a raw SQL query
|
|
44
|
+
*/
|
|
45
|
+
query<T extends QueryResultRow = Record<string, any>>(sqlText: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
46
|
+
/**
|
|
47
|
+
* Execute a transaction
|
|
48
|
+
*/
|
|
49
|
+
transaction<T>(callback: (client: TransactionClient) => Promise<T>): Promise<T>;
|
|
50
|
+
/**
|
|
51
|
+
* Check database health
|
|
52
|
+
*/
|
|
53
|
+
healthCheck(): Promise<boolean>;
|
|
54
|
+
/**
|
|
55
|
+
* Get connection pool statistics
|
|
56
|
+
*/
|
|
57
|
+
getPoolStats(): PoolStats;
|
|
58
|
+
/**
|
|
59
|
+
* Close all connections
|
|
60
|
+
*/
|
|
61
|
+
close(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Execute vector similarity search
|
|
64
|
+
*/
|
|
65
|
+
vectorSearch<T = Record<string, unknown>>(table: string, embeddingColumn: string, queryEmbedding: number[], options?: {
|
|
66
|
+
limit?: number;
|
|
67
|
+
minSimilarity?: number;
|
|
68
|
+
filters?: Record<string, unknown>;
|
|
69
|
+
selectColumns?: string[];
|
|
70
|
+
}): Promise<Array<T & {
|
|
71
|
+
similarity: number;
|
|
72
|
+
}>>;
|
|
73
|
+
}
|
|
74
|
+
export default PostgresAdapter;
|
|
75
|
+
//# sourceMappingURL=postgres-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/postgres-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,cAAc,EACf,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC;AAKrD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IAEtC,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAAiB;gBAEnB,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAM5D;;OAEG;IACH,IAAI,OAAO,IAAI,cAAc,CAAC,OAAO,MAAM,CAAC,CAG3C;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,EAAE,CAAC,IAAI,CAGrB;IAED;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0CjC;;OAEG;YACW,cAAc;IAS5B;;OAEG;YACW,cAAc;IAY5B;;OAEG;IACG,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxD,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAoB1B;;OAEG;IACG,WAAW,CAAC,CAAC,EACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GAClD,OAAO,CAAC,CAAC,CAAC;IA+Bb;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC;;OAEG;IACH,YAAY,IAAI,SAAS;IAYzB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B;;OAEG;IACG,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,GACL,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAmC9C;AAED,eAAe,eAAe,CAAC"}
|