@ariaflowagents/postgres-store 0.7.0 → 0.9.0

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.
@@ -0,0 +1,44 @@
1
+ import type { QueryResult } from 'pg';
2
+ import type { VectorStore, VectorEntry, VectorQueryParams, VectorQueryResult, CreateIndexParams, IndexStats, VectorFilter } from '@ariaflowagents/rag';
3
+ type PostgresClient = {
4
+ query: (text: string, params?: unknown[]) => Promise<QueryResult>;
5
+ };
6
+ export type PgVectorStoreOptions = {
7
+ /** PostgreSQL client (pg.Pool or pg.Client). Must have pgvector extension installed. */
8
+ client: PostgresClient;
9
+ /** Table name prefix. Each index creates a table named {prefix}_{indexName}. Default: 'ariaflow_vectors'. */
10
+ tablePrefix?: string;
11
+ };
12
+ /**
13
+ * VectorStore implementation backed by PostgreSQL with pgvector extension.
14
+ *
15
+ * Each index is a separate table with schema:
16
+ * id TEXT PRIMARY KEY
17
+ * vector vector(N)
18
+ * metadata JSONB
19
+ * document TEXT
20
+ * created_at TIMESTAMPTZ DEFAULT NOW()
21
+ *
22
+ * Requires: PostgreSQL 15+ with pgvector extension.
23
+ * CREATE EXTENSION IF NOT EXISTS vector;
24
+ */
25
+ export declare class PgVectorStore implements VectorStore {
26
+ private readonly client;
27
+ private readonly prefix;
28
+ private initialized;
29
+ constructor(options: PgVectorStoreOptions);
30
+ private tableName;
31
+ private ensureExtension;
32
+ createIndex(params: CreateIndexParams): Promise<void>;
33
+ upsert(indexName: string, entries: VectorEntry[]): Promise<void>;
34
+ query(indexName: string, params: VectorQueryParams): Promise<VectorQueryResult[]>;
35
+ listIndexes(): Promise<string[]>;
36
+ deleteIndex(indexName: string): Promise<void>;
37
+ deleteVectors(indexName: string, params: {
38
+ ids?: string[];
39
+ filter?: VectorFilter;
40
+ }): Promise<void>;
41
+ describeIndex(indexName: string): Promise<IndexStats>;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=PgVectorStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PgVectorStore.d.ts","sourceRoot":"","sources":["../src/PgVectorStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,wFAAwF;IACxF,MAAM,EAAE,cAAc,CAAC;IACvB,6GAA6G;IAC7G,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAKF;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,YAAW,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,oBAAoB;IAQzC,OAAO,CAAC,SAAS;YAOH,eAAe;IAMvB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4CrD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBhE,KAAK,CACT,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAkDzB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAWhC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7C,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,CAAA;KAAE,GAChD,OAAO,CAAC,IAAI,CAAC;IAsBV,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAkB5D"}
@@ -0,0 +1,279 @@
1
+ const DEFAULT_PREFIX = 'ariaflow_vectors';
2
+ const TABLE_NAME_RE = /^[a-zA-Z0-9_]+$/;
3
+ /**
4
+ * VectorStore implementation backed by PostgreSQL with pgvector extension.
5
+ *
6
+ * Each index is a separate table with schema:
7
+ * id TEXT PRIMARY KEY
8
+ * vector vector(N)
9
+ * metadata JSONB
10
+ * document TEXT
11
+ * created_at TIMESTAMPTZ DEFAULT NOW()
12
+ *
13
+ * Requires: PostgreSQL 15+ with pgvector extension.
14
+ * CREATE EXTENSION IF NOT EXISTS vector;
15
+ */
16
+ export class PgVectorStore {
17
+ client;
18
+ prefix;
19
+ initialized = false;
20
+ constructor(options) {
21
+ this.client = options.client;
22
+ this.prefix = options.tablePrefix ?? DEFAULT_PREFIX;
23
+ if (!TABLE_NAME_RE.test(this.prefix)) {
24
+ throw new Error(`Invalid table prefix: "${this.prefix}". Must match ${TABLE_NAME_RE}`);
25
+ }
26
+ }
27
+ tableName(indexName) {
28
+ if (!TABLE_NAME_RE.test(indexName)) {
29
+ throw new Error(`Invalid index name: "${indexName}". Must match ${TABLE_NAME_RE}`);
30
+ }
31
+ return `${this.prefix}_${indexName}`;
32
+ }
33
+ async ensureExtension() {
34
+ if (this.initialized)
35
+ return;
36
+ await this.client.query('CREATE EXTENSION IF NOT EXISTS vector');
37
+ this.initialized = true;
38
+ }
39
+ async createIndex(params) {
40
+ await this.ensureExtension();
41
+ const table = this.tableName(params.indexName);
42
+ const metric = params.metric ?? 'cosine';
43
+ await this.client.query(`
44
+ CREATE TABLE IF NOT EXISTS ${table} (
45
+ id TEXT PRIMARY KEY,
46
+ vector vector(${params.dimension}),
47
+ metadata JSONB,
48
+ document TEXT,
49
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
50
+ )
51
+ `);
52
+ // Create HNSW index for fast ANN search
53
+ const opsClass = metric === 'cosine'
54
+ ? 'vector_cosine_ops'
55
+ : metric === 'dotproduct'
56
+ ? 'vector_ip_ops'
57
+ : 'vector_l2_ops';
58
+ await this.client.query(`
59
+ CREATE INDEX IF NOT EXISTS ${table}_vector_idx
60
+ ON ${table} USING hnsw (vector ${opsClass})
61
+ `);
62
+ // Store index metadata in a registry table
63
+ await this.client.query(`
64
+ CREATE TABLE IF NOT EXISTS ${this.prefix}_registry (
65
+ index_name TEXT PRIMARY KEY,
66
+ dimension INTEGER NOT NULL,
67
+ metric TEXT NOT NULL,
68
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
69
+ )
70
+ `);
71
+ await this.client.query(`
72
+ INSERT INTO ${this.prefix}_registry (index_name, dimension, metric)
73
+ VALUES ($1, $2, $3)
74
+ ON CONFLICT (index_name) DO NOTHING
75
+ `, [params.indexName, params.dimension, metric]);
76
+ }
77
+ async upsert(indexName, entries) {
78
+ const table = this.tableName(indexName);
79
+ for (const entry of entries) {
80
+ const vectorStr = `[${Array.from(entry.vector).join(',')}]`;
81
+ await this.client.query(`
82
+ INSERT INTO ${table} (id, vector, metadata, document)
83
+ VALUES ($1, $2::vector, $3, $4)
84
+ ON CONFLICT (id) DO UPDATE SET
85
+ vector = EXCLUDED.vector,
86
+ metadata = EXCLUDED.metadata,
87
+ document = EXCLUDED.document
88
+ `, [
89
+ entry.id,
90
+ vectorStr,
91
+ entry.metadata ? JSON.stringify(entry.metadata) : null,
92
+ entry.document ?? null,
93
+ ]);
94
+ }
95
+ }
96
+ async query(indexName, params) {
97
+ const table = this.tableName(indexName);
98
+ const topK = params.topK ?? 10;
99
+ const vectorStr = `[${Array.from(params.queryVector).join(',')}]`;
100
+ // Determine distance operator based on index metric
101
+ const registry = await this.client.query(`SELECT metric FROM ${this.prefix}_registry WHERE index_name = $1`, [indexName]);
102
+ const metric = registry.rows[0]?.metric ?? 'cosine';
103
+ // pgvector operators: <=> cosine distance, <-> L2 distance, <#> negative inner product
104
+ const distOp = metric === 'cosine' ? '<=>' : metric === 'dotproduct' ? '<#>' : '<->';
105
+ // Build WHERE clause from filter
106
+ const { whereClause, filterParams } = buildWhereClause(params.filter);
107
+ const paramOffset = filterParams.length + 1;
108
+ const selectCols = [
109
+ 'id',
110
+ `1 - (vector ${distOp} $${paramOffset}::vector) AS score`,
111
+ 'metadata',
112
+ params.includeDocuments !== false ? 'document' : 'NULL AS document',
113
+ params.includeVectors ? `vector::text` : 'NULL AS vector_text',
114
+ ].join(', ');
115
+ const sql = `
116
+ SELECT ${selectCols}
117
+ FROM ${table}
118
+ ${whereClause ? `WHERE ${whereClause}` : ''}
119
+ ORDER BY vector ${distOp} $${paramOffset}::vector
120
+ LIMIT $${paramOffset + 1}
121
+ `;
122
+ const result = await this.client.query(sql, [
123
+ ...filterParams,
124
+ vectorStr,
125
+ topK,
126
+ ]);
127
+ return result.rows.map(row => ({
128
+ id: row.id,
129
+ score: parseFloat(row.score),
130
+ metadata: row.metadata ?? undefined,
131
+ document: row.document ?? undefined,
132
+ vector: row.vector_text ? parseVector(row.vector_text) : undefined,
133
+ }));
134
+ }
135
+ async listIndexes() {
136
+ try {
137
+ const result = await this.client.query(`SELECT index_name FROM ${this.prefix}_registry ORDER BY index_name`);
138
+ return result.rows.map(r => r.index_name);
139
+ }
140
+ catch {
141
+ return [];
142
+ }
143
+ }
144
+ async deleteIndex(indexName) {
145
+ const table = this.tableName(indexName);
146
+ await this.client.query(`DROP TABLE IF EXISTS ${table}`);
147
+ try {
148
+ await this.client.query(`DELETE FROM ${this.prefix}_registry WHERE index_name = $1`, [indexName]);
149
+ }
150
+ catch {
151
+ // Registry table might not exist
152
+ }
153
+ }
154
+ async deleteVectors(indexName, params) {
155
+ const table = this.tableName(indexName);
156
+ if (params.ids?.length) {
157
+ const placeholders = params.ids.map((_, i) => `$${i + 1}`).join(', ');
158
+ await this.client.query(`DELETE FROM ${table} WHERE id IN (${placeholders})`, params.ids);
159
+ }
160
+ if (params.filter) {
161
+ const { whereClause, filterParams } = buildWhereClause(params.filter);
162
+ if (whereClause) {
163
+ await this.client.query(`DELETE FROM ${table} WHERE ${whereClause}`, filterParams);
164
+ }
165
+ }
166
+ }
167
+ async describeIndex(indexName) {
168
+ const table = this.tableName(indexName);
169
+ const registry = await this.client.query(`SELECT dimension, metric FROM ${this.prefix}_registry WHERE index_name = $1`, [indexName]);
170
+ const countResult = await this.client.query(`SELECT COUNT(*) as count FROM ${table}`);
171
+ return {
172
+ dimension: parseInt(registry.rows[0]?.dimension ?? '0'),
173
+ count: parseInt(countResult.rows[0]?.count ?? '0'),
174
+ metric: (registry.rows[0]?.metric ?? 'cosine'),
175
+ };
176
+ }
177
+ }
178
+ // -- Filter translation: VectorFilter -> SQL WHERE --
179
+ let paramCounter = 0;
180
+ function buildWhereClause(filter) {
181
+ if (!filter)
182
+ return { whereClause: '', filterParams: [] };
183
+ paramCounter = 0;
184
+ const params = [];
185
+ const clause = translateFilter(filter, params);
186
+ return { whereClause: clause, filterParams: params };
187
+ }
188
+ function translateFilter(filter, params) {
189
+ if ('$and' in filter) {
190
+ const clauses = filter.$and.map(f => translateFilter(f, params));
191
+ return `(${clauses.join(' AND ')})`;
192
+ }
193
+ if ('$or' in filter) {
194
+ const clauses = filter.$or.map(f => translateFilter(f, params));
195
+ return `(${clauses.join(' OR ')})`;
196
+ }
197
+ if ('$not' in filter) {
198
+ const clause = translateFilter(filter.$not, params);
199
+ return `NOT (${clause})`;
200
+ }
201
+ const conditions = [];
202
+ for (const [field, condition] of Object.entries(filter)) {
203
+ if (condition === null || condition === undefined) {
204
+ conditions.push(`metadata->>'${escapeField(field)}' IS NULL`);
205
+ }
206
+ else if (typeof condition === 'object' && !Array.isArray(condition)) {
207
+ const ops = condition;
208
+ for (const [op, value] of Object.entries(ops)) {
209
+ const idx = ++paramCounter;
210
+ params.push(value);
211
+ switch (op) {
212
+ case '$eq':
213
+ conditions.push(`metadata->>'${escapeField(field)}' = $${idx}::text`);
214
+ break;
215
+ case '$ne':
216
+ conditions.push(`metadata->>'${escapeField(field)}' != $${idx}::text`);
217
+ break;
218
+ case '$gt':
219
+ conditions.push(`(metadata->>'${escapeField(field)}')::numeric > $${idx}::numeric`);
220
+ break;
221
+ case '$gte':
222
+ conditions.push(`(metadata->>'${escapeField(field)}')::numeric >= $${idx}::numeric`);
223
+ break;
224
+ case '$lt':
225
+ conditions.push(`(metadata->>'${escapeField(field)}')::numeric < $${idx}::numeric`);
226
+ break;
227
+ case '$lte':
228
+ conditions.push(`(metadata->>'${escapeField(field)}')::numeric <= $${idx}::numeric`);
229
+ break;
230
+ case '$in': {
231
+ const arr = value;
232
+ const placeholders = arr.map((_, i) => {
233
+ const pi = ++paramCounter;
234
+ params.push(arr[i]);
235
+ return `$${pi}::text`;
236
+ });
237
+ conditions.push(`metadata->>'${escapeField(field)}' IN (${placeholders.join(', ')})`);
238
+ break;
239
+ }
240
+ case '$nin': {
241
+ const arr = value;
242
+ const placeholders = arr.map((_, i) => {
243
+ const pi = ++paramCounter;
244
+ params.push(arr[i]);
245
+ return `$${pi}::text`;
246
+ });
247
+ conditions.push(`metadata->>'${escapeField(field)}' NOT IN (${placeholders.join(', ')})`);
248
+ break;
249
+ }
250
+ case '$exists':
251
+ if (value) {
252
+ conditions.push(`metadata ? '${escapeField(field)}'`);
253
+ }
254
+ else {
255
+ conditions.push(`NOT (metadata ? '${escapeField(field)}')`);
256
+ }
257
+ // Remove the param we just pushed since $exists doesn't use it in the SQL
258
+ params.pop();
259
+ paramCounter--;
260
+ break;
261
+ }
262
+ }
263
+ }
264
+ else {
265
+ // Direct equality
266
+ const idx = ++paramCounter;
267
+ params.push(condition);
268
+ conditions.push(`metadata->>'${escapeField(field)}' = $${idx}::text`);
269
+ }
270
+ }
271
+ return conditions.length > 0 ? conditions.join(' AND ') : 'TRUE';
272
+ }
273
+ function escapeField(field) {
274
+ return field.replace(/'/g, "''");
275
+ }
276
+ function parseVector(vectorStr) {
277
+ return vectorStr.replace(/[\[\]]/g, '').split(',').map(Number);
278
+ }
279
+ //# sourceMappingURL=PgVectorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PgVectorStore.js","sourceRoot":"","sources":["../src/PgVectorStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { MemoryService, MemoryIngestionOptions, SearchMemoryRequest, SearchMemoryResponse, Session } from '@ariaflowagents/core';
2
+ import type { QueryResult } from 'pg';
3
+ type PostgresClient = {
4
+ query: (text: string, params?: unknown[]) => Promise<QueryResult>;
5
+ };
6
+ export type PostgresMemoryStoreOptions = {
7
+ client: PostgresClient;
8
+ memoryTableName?: string;
9
+ autoMigrate?: boolean;
10
+ };
11
+ export declare class PostgresMemoryService implements MemoryService {
12
+ private client;
13
+ private table;
14
+ private ready;
15
+ constructor(options: PostgresMemoryStoreOptions);
16
+ private init;
17
+ addSessionToMemory(session: Session, options?: MemoryIngestionOptions): Promise<void>;
18
+ searchMemory(request: SearchMemoryRequest): Promise<SearchMemoryResponse>;
19
+ deleteMemories(userId: string): Promise<void>;
20
+ /**
21
+ * Extracts MemoryEntry objects from session messages.
22
+ * Identical logic to InMemoryMemoryService and RedisMemoryService.
23
+ * This duplication is intentional -- each store package must be independently
24
+ * importable without cross-package dependencies beyond @ariaflowagents/core.
25
+ */
26
+ private extractMemories;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=PostgresMemoryService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresMemoryService.d.ts","sourceRoot":"","sources":["../src/PostgresMemoryService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEb,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,OAAO,EACR,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAEtC,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAYF,qBAAa,qBAAsB,YAAW,aAAa;IACzD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAgB;gBAEjB,OAAO,EAAE,0BAA0B;YAOjC,IAAI;IAsBZ,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC;IA6BV,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAoDzE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD;;;;;OAKG;IACH,OAAO,CAAC,eAAe;CAkCxB"}
@@ -0,0 +1,131 @@
1
+ const defaultMemoryTable = 'ariaflow_memories';
2
+ const normalizeTableName = (tableName) => {
3
+ const table = tableName ?? defaultMemoryTable;
4
+ if (!/^[a-zA-Z0-9_.]+$/.test(table)) {
5
+ throw new Error(`Invalid table name: ${table}`);
6
+ }
7
+ return table;
8
+ };
9
+ export class PostgresMemoryService {
10
+ client;
11
+ table;
12
+ ready;
13
+ constructor(options) {
14
+ this.client = options.client;
15
+ this.table = normalizeTableName(options.memoryTableName);
16
+ const autoMigrate = options.autoMigrate ?? true;
17
+ this.ready = autoMigrate ? this.init() : Promise.resolve();
18
+ }
19
+ async init() {
20
+ await this.client.query(`CREATE TABLE IF NOT EXISTS ${this.table} (
21
+ id TEXT PRIMARY KEY,
22
+ session_id TEXT NOT NULL,
23
+ user_id TEXT NOT NULL,
24
+ content TEXT NOT NULL,
25
+ author TEXT,
26
+ metadata JSONB,
27
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
28
+ )`);
29
+ await this.client.query(`CREATE INDEX IF NOT EXISTS idx_${this.table}_user_id
30
+ ON ${this.table} (user_id)`);
31
+ await this.client.query(`CREATE INDEX IF NOT EXISTS idx_${this.table}_session_id
32
+ ON ${this.table} (session_id)`);
33
+ }
34
+ async addSessionToMemory(session, options) {
35
+ await this.ready;
36
+ if (!session.userId)
37
+ return;
38
+ // Idempotency: delete previous memories from this session.
39
+ await this.client.query(`DELETE FROM ${this.table} WHERE session_id = $1`, [session.id]);
40
+ const memories = this.extractMemories(session, options);
41
+ for (const memory of memories) {
42
+ await this.client.query(`INSERT INTO ${this.table} (id, session_id, user_id, content, author, metadata, created_at)
43
+ VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7)`, [
44
+ memory.id,
45
+ memory.sessionId,
46
+ memory.userId,
47
+ memory.content,
48
+ memory.author ?? null,
49
+ memory.metadata ? JSON.stringify(memory.metadata) : null,
50
+ memory.createdAt,
51
+ ]);
52
+ }
53
+ }
54
+ async searchMemory(request) {
55
+ await this.ready;
56
+ const { userId, query, limit = 10 } = request;
57
+ // Keyword search using ILIKE. Each query term is matched independently.
58
+ // Score is the count of matched terms divided by total terms.
59
+ const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
60
+ if (terms.length === 0) {
61
+ return { memories: [] };
62
+ }
63
+ // Build a scoring expression: SUM of CASE WHEN content ILIKE '%term%' THEN 1 ELSE 0 END
64
+ const scoreParts = [];
65
+ const params = [userId];
66
+ let paramIndex = 2;
67
+ for (const term of terms) {
68
+ scoreParts.push(`CASE WHEN content ILIKE $${paramIndex} THEN 1 ELSE 0 END`);
69
+ params.push(`%${term}%`);
70
+ paramIndex++;
71
+ }
72
+ const scoreExpr = `(${scoreParts.join(' + ')})::float / ${terms.length}`;
73
+ params.push(limit);
74
+ const result = await this.client.query(`SELECT id, session_id, user_id, content, author, metadata, created_at,
75
+ ${scoreExpr} AS score
76
+ FROM ${this.table}
77
+ WHERE user_id = $1 AND (${scoreParts.map((_, i) => `content ILIKE $${i + 2}`).join(' OR ')})
78
+ ORDER BY score DESC, created_at DESC
79
+ LIMIT $${paramIndex}`, params);
80
+ const memories = result.rows.map((row) => ({
81
+ id: row.id,
82
+ sessionId: row.session_id,
83
+ userId: row.user_id,
84
+ content: row.content,
85
+ author: row.author,
86
+ metadata: row.metadata,
87
+ createdAt: new Date(row.created_at),
88
+ score: parseFloat(row.score),
89
+ }));
90
+ return { memories };
91
+ }
92
+ async deleteMemories(userId) {
93
+ await this.ready;
94
+ await this.client.query(`DELETE FROM ${this.table} WHERE user_id = $1`, [userId]);
95
+ }
96
+ /**
97
+ * Extracts MemoryEntry objects from session messages.
98
+ * Identical logic to InMemoryMemoryService and RedisMemoryService.
99
+ * This duplication is intentional -- each store package must be independently
100
+ * importable without cross-package dependencies beyond @ariaflowagents/core.
101
+ */
102
+ extractMemories(session, options) {
103
+ const memories = [];
104
+ const now = new Date();
105
+ for (const message of session.messages) {
106
+ if (message.role !== 'user' && message.role !== 'assistant')
107
+ continue;
108
+ const content = typeof message.content === 'string'
109
+ ? message.content
110
+ : Array.isArray(message.content)
111
+ ? message.content
112
+ .filter((p) => p.type === 'text')
113
+ .map((p) => p.text)
114
+ .join('\n')
115
+ : '';
116
+ if (!content.trim())
117
+ continue;
118
+ memories.push({
119
+ id: `${session.id}:${memories.length}`,
120
+ sessionId: session.id,
121
+ userId: session.userId,
122
+ content,
123
+ author: message.role,
124
+ metadata: options?.metadata,
125
+ createdAt: now,
126
+ });
127
+ }
128
+ return memories;
129
+ }
130
+ }
131
+ //# sourceMappingURL=PostgresMemoryService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostgresMemoryService.js","sourceRoot":"","sources":["../src/PostgresMemoryService.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,7 @@
1
1
  export { PostgresSessionStore } from './PostgresSessionStore.js';
2
2
  export type { PostgresStoreOptions } from './PostgresSessionStore.js';
3
+ export { PostgresMemoryService } from './PostgresMemoryService.js';
4
+ export type { PostgresMemoryStoreOptions } from './PostgresMemoryService.js';
5
+ export { PgVectorStore } from './PgVectorStore.js';
6
+ export type { PgVectorStoreOptions } from './PgVectorStore.js';
3
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,4 @@
1
1
  export { PostgresSessionStore } from './PostgresSessionStore.js';
2
+ export { PostgresMemoryService } from './PostgresMemoryService.js';
3
+ export { PgVectorStore } from './PgVectorStore.js';
2
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ariaflowagents/postgres-store",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "PostgreSQL-backed SessionStore for AriaFlow",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,14 +12,16 @@
12
12
  }
13
13
  },
14
14
  "dependencies": {
15
- "@ariaflowagents/core": "^0.7.0"
15
+ "@ariaflowagents/core": "^0.8.0"
16
16
  },
17
17
  "peerDependencies": {
18
- "@ariaflowagents/core": "^0.7.0",
18
+ "@ariaflowagents/core": "^0.8.0",
19
+ "@ariaflowagents/rag": "^0.8.0",
19
20
  "pg": "^8.0.0"
20
21
  },
21
22
  "devDependencies": {
22
- "@ariaflowagents/core": "^0.7.0",
23
+ "@ariaflowagents/core": "workspace:*",
24
+ "@ariaflowagents/rag": "workspace:*",
23
25
  "@types/node": "^20.11.0",
24
26
  "@types/pg": "^8.11.0",
25
27
  "pg": "^8.11.0",