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
|
@@ -1,11 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Client
|
|
3
|
+
*
|
|
4
|
+
* Unified database client with backward-compatible API.
|
|
5
|
+
* Automatically detects and uses PostgreSQL or SQLite.
|
|
6
|
+
*/
|
|
1
7
|
import pg from 'pg';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
8
|
+
import type { QueryResult, TransactionClient } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Get PostgreSQL pool (for backward compatibility)
|
|
11
|
+
* Returns null if using SQLite
|
|
12
|
+
*/
|
|
13
|
+
export declare function getPool(): pg.Pool | null;
|
|
14
|
+
/**
|
|
15
|
+
* Execute a database query
|
|
16
|
+
* Compatible with both PostgreSQL and SQLite
|
|
17
|
+
*/
|
|
18
|
+
export declare function query<T extends Record<string, any> = Record<string, any>>(text: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
19
|
+
/**
|
|
20
|
+
* Get a transaction client
|
|
21
|
+
* For PostgreSQL: returns PoolClient
|
|
22
|
+
* For SQLite: returns a wrapper
|
|
23
|
+
*/
|
|
24
|
+
export declare function getClient(): Promise<TransactionClient>;
|
|
25
|
+
/**
|
|
26
|
+
* Execute a transaction
|
|
27
|
+
*/
|
|
28
|
+
export declare function transaction<T>(callback: (client: TransactionClient) => Promise<T>): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Check database health
|
|
31
|
+
*/
|
|
6
32
|
export declare function healthCheck(): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Close the database connection
|
|
35
|
+
*/
|
|
7
36
|
export declare function closePool(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Initialize the database
|
|
39
|
+
* Performs auto-detection, runs migrations, and starts health monitoring
|
|
40
|
+
*/
|
|
8
41
|
export declare function initDatabase(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Get database type
|
|
44
|
+
*/
|
|
45
|
+
export declare function getDatabaseType(): 'postgresql' | 'sqlite' | null;
|
|
46
|
+
/**
|
|
47
|
+
* Check if database is initialized
|
|
48
|
+
*/
|
|
49
|
+
export declare function isDatabaseInitialized(): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Get health status
|
|
52
|
+
*/
|
|
53
|
+
export declare function getHealthStatus(): import("./types.js").DatabaseHealth | null;
|
|
54
|
+
/**
|
|
55
|
+
* Get health summary
|
|
56
|
+
*/
|
|
57
|
+
export declare function getHealthSummary(): {
|
|
58
|
+
healthy: boolean;
|
|
59
|
+
status: string;
|
|
60
|
+
database: string;
|
|
61
|
+
latencyMs: number;
|
|
62
|
+
circuitBreaker: string;
|
|
63
|
+
};
|
|
9
64
|
declare const _default: {
|
|
10
65
|
getPool: typeof getPool;
|
|
11
66
|
query: typeof query;
|
|
@@ -14,6 +69,10 @@ declare const _default: {
|
|
|
14
69
|
healthCheck: typeof healthCheck;
|
|
15
70
|
closePool: typeof closePool;
|
|
16
71
|
initDatabase: typeof initDatabase;
|
|
72
|
+
getDatabaseType: typeof getDatabaseType;
|
|
73
|
+
isDatabaseInitialized: typeof isDatabaseInitialized;
|
|
74
|
+
getHealthStatus: typeof getHealthStatus;
|
|
75
|
+
getHealthSummary: typeof getHealthSummary;
|
|
17
76
|
};
|
|
18
77
|
export default _default;
|
|
19
78
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/database/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/database/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AAKpB,OAAO,KAAK,EAAmB,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgBlF;;;GAGG;AACH,wBAAgB,OAAO,IAAI,EAAE,CAAC,IAAI,GAAG,IAAI,CAYxC;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7E,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAGzB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAU5D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GAClD,OAAO,CAAC,CAAC,CAAC,CAGZ;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAO/C;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDlD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,QAAQ,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED;;GAEG;AACH,wBAAgB,eAAe,+CAE9B;AAED;;GAEG;AACH,wBAAgB,gBAAgB;;;;;;EAQ/B;;;;;;;;;;;;;;AAED,wBAYE"}
|
package/dist/database/client.js
CHANGED
|
@@ -1,88 +1,172 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Database Client
|
|
3
|
+
*
|
|
4
|
+
* Unified database client with backward-compatible API.
|
|
5
|
+
* Automatically detects and uses PostgreSQL or SQLite.
|
|
6
|
+
*/
|
|
7
|
+
import { getAdapter, closeAdapter, isAdapterInitialized, getAdapterType } from './adapters/index.js';
|
|
8
|
+
import { createMigrator } from './migrations/index.js';
|
|
9
|
+
import { createHealthSystem } from './health/index.js';
|
|
10
|
+
import { getDatabaseConfig } from './db-config.js';
|
|
3
11
|
import { createLogger } from '../utils/logger.js';
|
|
4
12
|
import { MemoryError } from '../utils/errors.js';
|
|
5
|
-
const { Pool } = pg;
|
|
6
13
|
const logger = createLogger('Database');
|
|
7
|
-
|
|
14
|
+
// Health system instance
|
|
15
|
+
let healthSystem = null;
|
|
16
|
+
/**
|
|
17
|
+
* Get the current database adapter
|
|
18
|
+
*/
|
|
19
|
+
async function getAdapterInstance() {
|
|
20
|
+
return getAdapter();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get PostgreSQL pool (for backward compatibility)
|
|
24
|
+
* Returns null if using SQLite
|
|
25
|
+
*/
|
|
8
26
|
export function getPool() {
|
|
9
|
-
if (
|
|
10
|
-
pool
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}
|
|
19
|
-
pool.on('connect', () => {
|
|
20
|
-
logger.debug('New client connected to pool');
|
|
21
|
-
});
|
|
27
|
+
if (getAdapterType() === 'postgresql') {
|
|
28
|
+
// Access the raw pool from PostgreSQL adapter
|
|
29
|
+
try {
|
|
30
|
+
const adapter = require('./adapters/postgres-adapter.js').PostgresAdapter;
|
|
31
|
+
// This is a simplified compatibility layer
|
|
32
|
+
return null; // Actual pool access requires async initialization
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
22
37
|
}
|
|
23
|
-
return
|
|
38
|
+
return null;
|
|
24
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Execute a database query
|
|
42
|
+
* Compatible with both PostgreSQL and SQLite
|
|
43
|
+
*/
|
|
25
44
|
export async function query(text, params) {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
const result = await pool.query(text, params);
|
|
30
|
-
const duration = Date.now() - start;
|
|
31
|
-
logger.debug('Query executed', { duration, rows: result.rowCount });
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
36
|
-
logger.error('Query failed', { error: errorMessage, query: text.slice(0, 100) });
|
|
37
|
-
throw new MemoryError(`Database query failed: ${errorMessage}`);
|
|
38
|
-
}
|
|
45
|
+
const adapter = await getAdapterInstance();
|
|
46
|
+
return adapter.query(text, params);
|
|
39
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Get a transaction client
|
|
50
|
+
* For PostgreSQL: returns PoolClient
|
|
51
|
+
* For SQLite: returns a wrapper
|
|
52
|
+
*/
|
|
40
53
|
export async function getClient() {
|
|
41
|
-
const
|
|
42
|
-
return
|
|
54
|
+
const adapter = await getAdapterInstance();
|
|
55
|
+
return {
|
|
56
|
+
query: async (sql, params) => {
|
|
57
|
+
return adapter.query(sql, params);
|
|
58
|
+
},
|
|
59
|
+
};
|
|
43
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Execute a transaction
|
|
63
|
+
*/
|
|
44
64
|
export async function transaction(callback) {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
await client.query('BEGIN');
|
|
48
|
-
const result = await callback(client);
|
|
49
|
-
await client.query('COMMIT');
|
|
50
|
-
return result;
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
await client.query('ROLLBACK');
|
|
54
|
-
throw error;
|
|
55
|
-
}
|
|
56
|
-
finally {
|
|
57
|
-
client.release();
|
|
58
|
-
}
|
|
65
|
+
const adapter = await getAdapterInstance();
|
|
66
|
+
return adapter.transaction(callback);
|
|
59
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Check database health
|
|
70
|
+
*/
|
|
60
71
|
export async function healthCheck() {
|
|
61
72
|
try {
|
|
62
|
-
const
|
|
63
|
-
return
|
|
73
|
+
const adapter = await getAdapterInstance();
|
|
74
|
+
return adapter.healthCheck();
|
|
64
75
|
}
|
|
65
76
|
catch {
|
|
66
77
|
return false;
|
|
67
78
|
}
|
|
68
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Close the database connection
|
|
82
|
+
*/
|
|
69
83
|
export async function closePool() {
|
|
70
|
-
if (
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
logger.info('Database pool closed');
|
|
84
|
+
if (healthSystem) {
|
|
85
|
+
healthSystem.healthMonitor.stop();
|
|
86
|
+
healthSystem = null;
|
|
74
87
|
}
|
|
88
|
+
await closeAdapter();
|
|
89
|
+
logger.info('Database connection closed');
|
|
75
90
|
}
|
|
76
|
-
|
|
91
|
+
/**
|
|
92
|
+
* Initialize the database
|
|
93
|
+
* Performs auto-detection, runs migrations, and starts health monitoring
|
|
94
|
+
*/
|
|
77
95
|
export async function initDatabase() {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
96
|
+
try {
|
|
97
|
+
const adapter = await getAdapterInstance();
|
|
98
|
+
const config = getDatabaseConfig();
|
|
99
|
+
logger.info('Database initialized', {
|
|
100
|
+
type: adapter.type,
|
|
101
|
+
path: adapter.type === 'sqlite' ? config.sqlitePath : undefined,
|
|
102
|
+
});
|
|
103
|
+
// Run migrations
|
|
104
|
+
const migrator = createMigrator(adapter);
|
|
105
|
+
const pending = await migrator.getPendingMigrations();
|
|
106
|
+
if (pending.length > 0) {
|
|
107
|
+
logger.info('Running pending migrations', { count: pending.length });
|
|
108
|
+
const results = await migrator.migrate();
|
|
109
|
+
const failed = results.filter((r) => !r.success);
|
|
110
|
+
if (failed.length > 0) {
|
|
111
|
+
logger.error('Some migrations failed', { failed });
|
|
112
|
+
throw new MemoryError(`Migration failed: ${failed[0]?.error}`);
|
|
113
|
+
}
|
|
114
|
+
logger.info('Migrations completed', { count: results.length });
|
|
115
|
+
}
|
|
116
|
+
// Start health monitoring
|
|
117
|
+
healthSystem = createHealthSystem(adapter, {
|
|
118
|
+
circuitBreaker: {
|
|
119
|
+
failureThreshold: config.circuitBreakerThreshold,
|
|
120
|
+
resetTimeoutMs: config.circuitBreakerTimeoutMs,
|
|
121
|
+
},
|
|
122
|
+
healthMonitor: {
|
|
123
|
+
checkIntervalMs: config.healthCheckIntervalMs,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
healthSystem.healthMonitor.start();
|
|
127
|
+
// Verify connection
|
|
128
|
+
const healthy = await adapter.healthCheck();
|
|
129
|
+
if (!healthy) {
|
|
130
|
+
throw new MemoryError('Database health check failed after initialization');
|
|
131
|
+
}
|
|
132
|
+
logger.info('Database ready', { type: adapter.type });
|
|
81
133
|
}
|
|
82
|
-
|
|
83
|
-
|
|
134
|
+
catch (error) {
|
|
135
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
136
|
+
logger.error('Database initialization failed', { error: message });
|
|
137
|
+
throw new MemoryError(`Failed to initialize database: ${message}`);
|
|
84
138
|
}
|
|
85
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Get database type
|
|
142
|
+
*/
|
|
143
|
+
export function getDatabaseType() {
|
|
144
|
+
return getAdapterType();
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Check if database is initialized
|
|
148
|
+
*/
|
|
149
|
+
export function isDatabaseInitialized() {
|
|
150
|
+
return isAdapterInitialized();
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get health status
|
|
154
|
+
*/
|
|
155
|
+
export function getHealthStatus() {
|
|
156
|
+
return healthSystem?.healthMonitor.getStatus() ?? null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get health summary
|
|
160
|
+
*/
|
|
161
|
+
export function getHealthSummary() {
|
|
162
|
+
return healthSystem?.healthMonitor.getSummary() ?? {
|
|
163
|
+
healthy: false,
|
|
164
|
+
status: 'unknown',
|
|
165
|
+
database: 'unknown',
|
|
166
|
+
latencyMs: -1,
|
|
167
|
+
circuitBreaker: 'unknown',
|
|
168
|
+
};
|
|
169
|
+
}
|
|
86
170
|
export default {
|
|
87
171
|
getPool,
|
|
88
172
|
query,
|
|
@@ -91,5 +175,9 @@ export default {
|
|
|
91
175
|
healthCheck,
|
|
92
176
|
closePool,
|
|
93
177
|
initDatabase,
|
|
178
|
+
getDatabaseType,
|
|
179
|
+
isDatabaseInitialized,
|
|
180
|
+
getHealthStatus,
|
|
181
|
+
getHealthSummary,
|
|
94
182
|
};
|
|
95
183
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/database/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/database/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Configuration
|
|
3
|
+
*
|
|
4
|
+
* Configuration management for the database layer.
|
|
5
|
+
* Supports both PostgreSQL and SQLite with validation.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import type { DatabaseConfig } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Database configuration schema with Zod validation
|
|
11
|
+
*/
|
|
12
|
+
export declare const databaseConfigSchema: z.ZodObject<{
|
|
13
|
+
DATABASE_TYPE: z.ZodDefault<z.ZodEnum<["auto", "postgresql", "sqlite"]>>;
|
|
14
|
+
DATABASE_URL: z.ZodOptional<z.ZodString>;
|
|
15
|
+
DB_HOST: z.ZodDefault<z.ZodString>;
|
|
16
|
+
DB_PORT: z.ZodDefault<z.ZodNumber>;
|
|
17
|
+
DB_USER: z.ZodDefault<z.ZodString>;
|
|
18
|
+
DB_PASSWORD: z.ZodDefault<z.ZodString>;
|
|
19
|
+
DB_NAME: z.ZodDefault<z.ZodString>;
|
|
20
|
+
DB_POOL_MAX: z.ZodDefault<z.ZodNumber>;
|
|
21
|
+
DB_POOL_IDLE_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
DB_POOL_CONNECTION_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
|
|
23
|
+
SQLITE_PATH: z.ZodOptional<z.ZodString>;
|
|
24
|
+
DB_HEALTH_CHECK_INTERVAL_MS: z.ZodDefault<z.ZodNumber>;
|
|
25
|
+
DB_CIRCUIT_BREAKER_THRESHOLD: z.ZodDefault<z.ZodNumber>;
|
|
26
|
+
DB_CIRCUIT_BREAKER_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
|
|
27
|
+
DB_CACHE_MAX_SIZE: z.ZodDefault<z.ZodNumber>;
|
|
28
|
+
DB_CACHE_TTL_MS: z.ZodDefault<z.ZodNumber>;
|
|
29
|
+
VECTOR_DIMENSION: z.ZodDefault<z.ZodNumber>;
|
|
30
|
+
VECTOR_MIN_SIMILARITY: z.ZodDefault<z.ZodNumber>;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
DB_HOST: string;
|
|
33
|
+
DB_PORT: number;
|
|
34
|
+
DB_USER: string;
|
|
35
|
+
DB_PASSWORD: string;
|
|
36
|
+
DB_NAME: string;
|
|
37
|
+
DATABASE_TYPE: "postgresql" | "sqlite" | "auto";
|
|
38
|
+
DB_POOL_MAX: number;
|
|
39
|
+
DB_POOL_IDLE_TIMEOUT_MS: number;
|
|
40
|
+
DB_POOL_CONNECTION_TIMEOUT_MS: number;
|
|
41
|
+
DB_HEALTH_CHECK_INTERVAL_MS: number;
|
|
42
|
+
DB_CIRCUIT_BREAKER_THRESHOLD: number;
|
|
43
|
+
DB_CIRCUIT_BREAKER_TIMEOUT_MS: number;
|
|
44
|
+
DB_CACHE_MAX_SIZE: number;
|
|
45
|
+
DB_CACHE_TTL_MS: number;
|
|
46
|
+
VECTOR_DIMENSION: number;
|
|
47
|
+
VECTOR_MIN_SIMILARITY: number;
|
|
48
|
+
DATABASE_URL?: string | undefined;
|
|
49
|
+
SQLITE_PATH?: string | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
DB_HOST?: string | undefined;
|
|
52
|
+
DB_PORT?: number | undefined;
|
|
53
|
+
DB_USER?: string | undefined;
|
|
54
|
+
DB_PASSWORD?: string | undefined;
|
|
55
|
+
DB_NAME?: string | undefined;
|
|
56
|
+
DATABASE_URL?: string | undefined;
|
|
57
|
+
DATABASE_TYPE?: "postgresql" | "sqlite" | "auto" | undefined;
|
|
58
|
+
DB_POOL_MAX?: number | undefined;
|
|
59
|
+
DB_POOL_IDLE_TIMEOUT_MS?: number | undefined;
|
|
60
|
+
DB_POOL_CONNECTION_TIMEOUT_MS?: number | undefined;
|
|
61
|
+
SQLITE_PATH?: string | undefined;
|
|
62
|
+
DB_HEALTH_CHECK_INTERVAL_MS?: number | undefined;
|
|
63
|
+
DB_CIRCUIT_BREAKER_THRESHOLD?: number | undefined;
|
|
64
|
+
DB_CIRCUIT_BREAKER_TIMEOUT_MS?: number | undefined;
|
|
65
|
+
DB_CACHE_MAX_SIZE?: number | undefined;
|
|
66
|
+
DB_CACHE_TTL_MS?: number | undefined;
|
|
67
|
+
VECTOR_DIMENSION?: number | undefined;
|
|
68
|
+
VECTOR_MIN_SIMILARITY?: number | undefined;
|
|
69
|
+
}>;
|
|
70
|
+
export type RawDatabaseConfig = z.infer<typeof databaseConfigSchema>;
|
|
71
|
+
/**
|
|
72
|
+
* Default SQLite database path
|
|
73
|
+
*/
|
|
74
|
+
export declare function getDefaultSqlitePath(): string;
|
|
75
|
+
/**
|
|
76
|
+
* Build PostgreSQL connection URL from config
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildPostgresUrl(config: RawDatabaseConfig): string;
|
|
79
|
+
/**
|
|
80
|
+
* Load and validate database configuration from environment
|
|
81
|
+
*/
|
|
82
|
+
export declare function loadDatabaseConfig(env?: Record<string, string | undefined>): DatabaseConfig;
|
|
83
|
+
/**
|
|
84
|
+
* Get database configuration
|
|
85
|
+
*/
|
|
86
|
+
export declare function getDatabaseConfig(): DatabaseConfig;
|
|
87
|
+
/**
|
|
88
|
+
* Reset configuration (for testing)
|
|
89
|
+
*/
|
|
90
|
+
export declare function resetDatabaseConfig(): void;
|
|
91
|
+
/**
|
|
92
|
+
* Set custom configuration (for testing)
|
|
93
|
+
*/
|
|
94
|
+
export declare function setDatabaseConfig(config: Partial<DatabaseConfig>): void;
|
|
95
|
+
declare const _default: {
|
|
96
|
+
loadDatabaseConfig: typeof loadDatabaseConfig;
|
|
97
|
+
getDatabaseConfig: typeof getDatabaseConfig;
|
|
98
|
+
resetDatabaseConfig: typeof resetDatabaseConfig;
|
|
99
|
+
setDatabaseConfig: typeof setDatabaseConfig;
|
|
100
|
+
getDefaultSqlitePath: typeof getDefaultSqlitePath;
|
|
101
|
+
buildPostgresUrl: typeof buildPostgresUrl;
|
|
102
|
+
};
|
|
103
|
+
export default _default;
|
|
104
|
+
//# sourceMappingURL=db-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-config.d.ts","sourceRoot":"","sources":["../../src/database/db-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,cAAc,EAAyB,MAAM,YAAY,CAAC;AAExE;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmE/B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAErE;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAKlE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,cAAc,CAUhB;AA2CD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAGvE;;;;;;;;;AAED,wBAOE"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Configuration
|
|
3
|
+
*
|
|
4
|
+
* Configuration management for the database layer.
|
|
5
|
+
* Supports both PostgreSQL and SQLite with validation.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { homedir } from 'os';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Database configuration schema with Zod validation
|
|
12
|
+
*/
|
|
13
|
+
export const databaseConfigSchema = z.object({
|
|
14
|
+
// Detection mode
|
|
15
|
+
DATABASE_TYPE: z
|
|
16
|
+
.enum(['auto', 'postgresql', 'sqlite'])
|
|
17
|
+
.default('auto')
|
|
18
|
+
.describe('Database type selection mode'),
|
|
19
|
+
// PostgreSQL settings
|
|
20
|
+
DATABASE_URL: z
|
|
21
|
+
.string()
|
|
22
|
+
.url()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Full PostgreSQL connection URL'),
|
|
25
|
+
DB_HOST: z.string().default('localhost').describe('PostgreSQL host'),
|
|
26
|
+
DB_PORT: z.coerce.number().default(5432).describe('PostgreSQL port'),
|
|
27
|
+
DB_USER: z.string().default('familyai').describe('PostgreSQL user'),
|
|
28
|
+
DB_PASSWORD: z.string().default('familyai123').describe('PostgreSQL password'),
|
|
29
|
+
DB_NAME: z.string().default('familyai').describe('PostgreSQL database name'),
|
|
30
|
+
DB_POOL_MAX: z.coerce.number().default(20).describe('Maximum pool connections'),
|
|
31
|
+
DB_POOL_IDLE_TIMEOUT_MS: z.coerce
|
|
32
|
+
.number()
|
|
33
|
+
.default(30000)
|
|
34
|
+
.describe('Pool idle timeout'),
|
|
35
|
+
DB_POOL_CONNECTION_TIMEOUT_MS: z.coerce
|
|
36
|
+
.number()
|
|
37
|
+
.default(5000)
|
|
38
|
+
.describe('Connection timeout'),
|
|
39
|
+
// SQLite settings
|
|
40
|
+
SQLITE_PATH: z
|
|
41
|
+
.string()
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('SQLite database file path'),
|
|
44
|
+
// Health monitoring
|
|
45
|
+
DB_HEALTH_CHECK_INTERVAL_MS: z.coerce
|
|
46
|
+
.number()
|
|
47
|
+
.default(30000)
|
|
48
|
+
.describe('Health check interval'),
|
|
49
|
+
DB_CIRCUIT_BREAKER_THRESHOLD: z.coerce
|
|
50
|
+
.number()
|
|
51
|
+
.default(5)
|
|
52
|
+
.describe('Circuit breaker failure threshold'),
|
|
53
|
+
DB_CIRCUIT_BREAKER_TIMEOUT_MS: z.coerce
|
|
54
|
+
.number()
|
|
55
|
+
.default(60000)
|
|
56
|
+
.describe('Circuit breaker reset timeout'),
|
|
57
|
+
// Cache settings
|
|
58
|
+
DB_CACHE_MAX_SIZE: z.coerce
|
|
59
|
+
.number()
|
|
60
|
+
.default(1000)
|
|
61
|
+
.describe('Maximum cache entries'),
|
|
62
|
+
DB_CACHE_TTL_MS: z.coerce
|
|
63
|
+
.number()
|
|
64
|
+
.default(300000)
|
|
65
|
+
.describe('Cache TTL in milliseconds'),
|
|
66
|
+
// Vector settings
|
|
67
|
+
VECTOR_DIMENSION: z.coerce
|
|
68
|
+
.number()
|
|
69
|
+
.default(1536)
|
|
70
|
+
.describe('Embedding vector dimension'),
|
|
71
|
+
VECTOR_MIN_SIMILARITY: z.coerce
|
|
72
|
+
.number()
|
|
73
|
+
.default(0.7)
|
|
74
|
+
.describe('Minimum similarity threshold'),
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Default SQLite database path
|
|
78
|
+
*/
|
|
79
|
+
export function getDefaultSqlitePath() {
|
|
80
|
+
return join(homedir(), '.family-ai-agent', 'data', 'family-ai.db');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Build PostgreSQL connection URL from config
|
|
84
|
+
*/
|
|
85
|
+
export function buildPostgresUrl(config) {
|
|
86
|
+
if (config.DATABASE_URL) {
|
|
87
|
+
return config.DATABASE_URL;
|
|
88
|
+
}
|
|
89
|
+
return `postgresql://${config.DB_USER}:${config.DB_PASSWORD}@${config.DB_HOST}:${config.DB_PORT}/${config.DB_NAME}`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Load and validate database configuration from environment
|
|
93
|
+
*/
|
|
94
|
+
export function loadDatabaseConfig(env = process.env) {
|
|
95
|
+
const parsed = databaseConfigSchema.safeParse(env);
|
|
96
|
+
if (!parsed.success) {
|
|
97
|
+
// Return defaults on validation failure
|
|
98
|
+
const defaults = databaseConfigSchema.parse({});
|
|
99
|
+
return convertToConfig(defaults);
|
|
100
|
+
}
|
|
101
|
+
return convertToConfig(parsed.data);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Convert raw config to DatabaseConfig interface
|
|
105
|
+
*/
|
|
106
|
+
function convertToConfig(raw) {
|
|
107
|
+
return {
|
|
108
|
+
type: raw.DATABASE_TYPE,
|
|
109
|
+
// PostgreSQL
|
|
110
|
+
postgresUrl: raw.DATABASE_URL,
|
|
111
|
+
postgresHost: raw.DB_HOST,
|
|
112
|
+
postgresPort: raw.DB_PORT,
|
|
113
|
+
postgresUser: raw.DB_USER,
|
|
114
|
+
postgresPassword: raw.DB_PASSWORD,
|
|
115
|
+
postgresDatabase: raw.DB_NAME,
|
|
116
|
+
postgresPoolMax: raw.DB_POOL_MAX,
|
|
117
|
+
postgresIdleTimeoutMs: raw.DB_POOL_IDLE_TIMEOUT_MS,
|
|
118
|
+
postgresConnectionTimeoutMs: raw.DB_POOL_CONNECTION_TIMEOUT_MS,
|
|
119
|
+
// SQLite
|
|
120
|
+
sqlitePath: raw.SQLITE_PATH ?? getDefaultSqlitePath(),
|
|
121
|
+
// Health monitoring
|
|
122
|
+
healthCheckIntervalMs: raw.DB_HEALTH_CHECK_INTERVAL_MS,
|
|
123
|
+
circuitBreakerThreshold: raw.DB_CIRCUIT_BREAKER_THRESHOLD,
|
|
124
|
+
circuitBreakerTimeoutMs: raw.DB_CIRCUIT_BREAKER_TIMEOUT_MS,
|
|
125
|
+
// Cache
|
|
126
|
+
cacheMaxSize: raw.DB_CACHE_MAX_SIZE,
|
|
127
|
+
cacheTtlMs: raw.DB_CACHE_TTL_MS,
|
|
128
|
+
// Vector
|
|
129
|
+
vectorDimension: raw.VECTOR_DIMENSION,
|
|
130
|
+
vectorMinSimilarity: raw.VECTOR_MIN_SIMILARITY,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Global database configuration instance
|
|
135
|
+
*/
|
|
136
|
+
let dbConfig = null;
|
|
137
|
+
/**
|
|
138
|
+
* Get database configuration
|
|
139
|
+
*/
|
|
140
|
+
export function getDatabaseConfig() {
|
|
141
|
+
if (!dbConfig) {
|
|
142
|
+
dbConfig = loadDatabaseConfig();
|
|
143
|
+
}
|
|
144
|
+
return dbConfig;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Reset configuration (for testing)
|
|
148
|
+
*/
|
|
149
|
+
export function resetDatabaseConfig() {
|
|
150
|
+
dbConfig = null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Set custom configuration (for testing)
|
|
154
|
+
*/
|
|
155
|
+
export function setDatabaseConfig(config) {
|
|
156
|
+
const defaults = loadDatabaseConfig();
|
|
157
|
+
dbConfig = { ...defaults, ...config };
|
|
158
|
+
}
|
|
159
|
+
export default {
|
|
160
|
+
loadDatabaseConfig,
|
|
161
|
+
getDatabaseConfig,
|
|
162
|
+
resetDatabaseConfig,
|
|
163
|
+
setDatabaseConfig,
|
|
164
|
+
getDefaultSqlitePath,
|
|
165
|
+
buildPostgresUrl,
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=db-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-config.js","sourceRoot":"","sources":["../../src/database/db-config.ts"],"names":[],"mappings":"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"}
|