@mnemonic-ai/core 0.1.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.
Files changed (47) hide show
  1. package/dist/chunk-5Z46NSNR.js +228 -0
  2. package/dist/chunk-5Z46NSNR.js.map +1 -0
  3. package/dist/chunk-CZDK53NR.js +24 -0
  4. package/dist/chunk-CZDK53NR.js.map +1 -0
  5. package/dist/chunk-L7SCUMC3.js +53 -0
  6. package/dist/chunk-L7SCUMC3.js.map +1 -0
  7. package/dist/chunk-M3IZJTMM.js +474 -0
  8. package/dist/chunk-M3IZJTMM.js.map +1 -0
  9. package/dist/chunk-NA7L5FQN.js +1581 -0
  10. package/dist/chunk-NA7L5FQN.js.map +1 -0
  11. package/dist/chunk-OEEEWS2M.js +375 -0
  12. package/dist/chunk-OEEEWS2M.js.map +1 -0
  13. package/dist/chunk-YZW6DYUY.js +46 -0
  14. package/dist/chunk-YZW6DYUY.js.map +1 -0
  15. package/dist/cli/main.cjs +1827 -0
  16. package/dist/cli/main.cjs.map +1 -0
  17. package/dist/cli/main.d.cts +1 -0
  18. package/dist/cli/main.d.ts +1 -0
  19. package/dist/cli/main.js +84 -0
  20. package/dist/cli/main.js.map +1 -0
  21. package/dist/client-b2Xhkqdl.d.cts +409 -0
  22. package/dist/client-b2Xhkqdl.d.ts +409 -0
  23. package/dist/index.cjs +2547 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +309 -0
  26. package/dist/index.d.ts +309 -0
  27. package/dist/index.js +160 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/local-MYLINANE.js +7 -0
  30. package/dist/local-MYLINANE.js.map +1 -0
  31. package/dist/mcp/main.cjs +2775 -0
  32. package/dist/mcp/main.cjs.map +1 -0
  33. package/dist/mcp/main.d.cts +1 -0
  34. package/dist/mcp/main.d.ts +1 -0
  35. package/dist/mcp/main.js +31 -0
  36. package/dist/mcp/main.js.map +1 -0
  37. package/dist/mcp/server.cjs +2765 -0
  38. package/dist/mcp/server.cjs.map +1 -0
  39. package/dist/mcp/server.d.cts +23 -0
  40. package/dist/mcp/server.d.ts +23 -0
  41. package/dist/mcp/server.js +12 -0
  42. package/dist/mcp/server.js.map +1 -0
  43. package/dist/openai-GDIC3YVT.js +7 -0
  44. package/dist/openai-GDIC3YVT.js.map +1 -0
  45. package/dist/postgres-GQ6DZDBW.js +8 -0
  46. package/dist/postgres-GQ6DZDBW.js.map +1 -0
  47. package/package.json +117 -0
@@ -0,0 +1,474 @@
1
+ import {
2
+ Memory,
3
+ bruteForceCosineSearch,
4
+ bruteForceSimilarPairs
5
+ } from "./chunk-5Z46NSNR.js";
6
+
7
+ // src/stores/postgres.ts
8
+ var _pgModule = null;
9
+ var _registerPgvector = null;
10
+ async function loadPg() {
11
+ if (_pgModule) return _pgModule;
12
+ try {
13
+ _pgModule = await import("pg");
14
+ return _pgModule;
15
+ } catch {
16
+ throw new Error(
17
+ "PostgresStore requires the 'pg' package. Install it with: npm install pg pgvector"
18
+ );
19
+ }
20
+ }
21
+ async function loadPgvectorRegister() {
22
+ if (_registerPgvector) return _registerPgvector;
23
+ try {
24
+ const mod = await import("pgvector/pg");
25
+ _registerPgvector = mod.registerTypes ?? mod.default?.registerTypes ?? mod.registerType ?? mod.default?.registerType;
26
+ return _registerPgvector;
27
+ } catch {
28
+ throw new Error(
29
+ "PostgresStore requires the 'pgvector' package. Install it with: npm install pgvector"
30
+ );
31
+ }
32
+ }
33
+ var PostgresStore = class {
34
+ _dsn;
35
+ _embeddingDim;
36
+ _poolMin;
37
+ _poolMax;
38
+ _pool = null;
39
+ _pgvectorRegistered = false;
40
+ constructor(options) {
41
+ this._dsn = options.dsn;
42
+ this._embeddingDim = options.embeddingDim ?? 1536;
43
+ this._poolMin = options.poolMin ?? 2;
44
+ this._poolMax = options.poolMax ?? 10;
45
+ }
46
+ async _getPool() {
47
+ if (this._pool) return this._pool;
48
+ const pg = await loadPg();
49
+ this._pool = new pg.Pool({
50
+ connectionString: this._dsn,
51
+ min: this._poolMin,
52
+ max: this._poolMax
53
+ });
54
+ return this._pool;
55
+ }
56
+ async _query(sql, params = []) {
57
+ const pool = await this._getPool();
58
+ const client = await pool.connect();
59
+ try {
60
+ return await client.query(sql, params);
61
+ } finally {
62
+ client.release();
63
+ }
64
+ }
65
+ /** Register pgvector on the pool's connect event so every connection gets it. */
66
+ async _setupPgvectorOnPool() {
67
+ if (this._pgvectorRegistered) return;
68
+ const pool = await this._getPool();
69
+ const register = await loadPgvectorRegister();
70
+ pool.on("connect", (client2) => {
71
+ register(client2).catch((err) => {
72
+ process.stderr.write(`pgvector registration failed: ${err.message}
73
+ `);
74
+ });
75
+ });
76
+ const client = await pool.connect();
77
+ try {
78
+ await register(client);
79
+ } finally {
80
+ client.release();
81
+ }
82
+ this._pgvectorRegistered = true;
83
+ }
84
+ async initialize() {
85
+ await this._query("CREATE EXTENSION IF NOT EXISTS vector");
86
+ await this._setupPgvectorOnPool();
87
+ await this._query(`
88
+ CREATE TABLE IF NOT EXISTS memories (
89
+ id TEXT PRIMARY KEY,
90
+ content TEXT NOT NULL,
91
+ tier TEXT NOT NULL,
92
+ source TEXT NOT NULL DEFAULT 'unknown',
93
+ actor TEXT NOT NULL DEFAULT 'system',
94
+ session_id TEXT,
95
+ created_at TIMESTAMPTZ NOT NULL,
96
+ last_accessed TIMESTAMPTZ NOT NULL,
97
+ access_count INTEGER NOT NULL DEFAULT 0,
98
+ importance DOUBLE PRECISION NOT NULL DEFAULT 1.0,
99
+ superseded_by TEXT,
100
+ contradicted_by TEXT,
101
+ embedding vector(${this._embeddingDim}),
102
+ metadata JSONB NOT NULL DEFAULT '{}',
103
+ linked_ids JSONB NOT NULL DEFAULT '[]',
104
+ agent_id TEXT NOT NULL DEFAULT 'default',
105
+ shared BOOLEAN NOT NULL DEFAULT FALSE
106
+ )
107
+ `);
108
+ await this._query(`
109
+ CREATE TABLE IF NOT EXISTS edges (
110
+ source_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
111
+ target_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
112
+ relation TEXT NOT NULL,
113
+ weight DOUBLE PRECISION NOT NULL DEFAULT 1.0,
114
+ created_at TIMESTAMPTZ NOT NULL,
115
+ PRIMARY KEY (source_id, target_id, relation)
116
+ )
117
+ `);
118
+ await this._query(`
119
+ CREATE TABLE IF NOT EXISTS meta (
120
+ key TEXT PRIMARY KEY,
121
+ value TEXT NOT NULL
122
+ )
123
+ `);
124
+ await this._migrateColumns();
125
+ await this._query(
126
+ "CREATE INDEX IF NOT EXISTS idx_memories_agent_id ON memories (agent_id)"
127
+ );
128
+ await this._query(
129
+ "CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories (tier)"
130
+ );
131
+ await this._query(
132
+ "CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories (created_at)"
133
+ );
134
+ await this._query(
135
+ "CREATE INDEX IF NOT EXISTS idx_edges_source ON edges (source_id)"
136
+ );
137
+ await this._query(
138
+ "CREATE INDEX IF NOT EXISTS idx_edges_target ON edges (target_id)"
139
+ );
140
+ await this._query(
141
+ "CREATE INDEX IF NOT EXISTS idx_memories_shared ON memories (shared) WHERE shared = TRUE"
142
+ );
143
+ try {
144
+ await this._query(`
145
+ CREATE INDEX IF NOT EXISTS idx_memories_embedding_hnsw
146
+ ON memories USING hnsw (embedding vector_cosine_ops)
147
+ WITH (m = 16, ef_construction = 64)
148
+ `);
149
+ } catch {
150
+ }
151
+ }
152
+ async _migrateColumns() {
153
+ await this._query(
154
+ "ALTER TABLE memories ADD COLUMN IF NOT EXISTS agent_id TEXT NOT NULL DEFAULT 'default'"
155
+ );
156
+ await this._query(
157
+ "ALTER TABLE memories ADD COLUMN IF NOT EXISTS shared BOOLEAN NOT NULL DEFAULT FALSE"
158
+ );
159
+ await this._query(
160
+ "ALTER TABLE memories ADD COLUMN IF NOT EXISTS contradicted_by TEXT"
161
+ );
162
+ await this._query(
163
+ "UPDATE memories SET contradicted_by = metadata->>'contradicted_by' WHERE contradicted_by IS NULL AND metadata->>'contradicted_by' IS NOT NULL"
164
+ );
165
+ for (const col of ["source_id", "target_id"]) {
166
+ const name = `edges_${col}_fkey`;
167
+ try {
168
+ await this._query(
169
+ `ALTER TABLE edges ADD CONSTRAINT ${name} FOREIGN KEY (${col}) REFERENCES memories(id) ON DELETE CASCADE`
170
+ );
171
+ } catch (err) {
172
+ const code = err.code;
173
+ if (code !== "42710") throw err;
174
+ }
175
+ }
176
+ }
177
+ async close() {
178
+ if (this._pool) {
179
+ await this._pool.end();
180
+ this._pool = null;
181
+ this._pgvectorRegistered = false;
182
+ }
183
+ }
184
+ async save(memory) {
185
+ await this._query(
186
+ `INSERT INTO memories
187
+ (id, content, tier, source, actor, session_id, created_at,
188
+ last_accessed, access_count, importance, superseded_by,
189
+ contradicted_by, embedding, metadata, linked_ids, agent_id, shared)
190
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13::vector, $14, $15, $16, $17)
191
+ ON CONFLICT (id) DO UPDATE SET
192
+ content = EXCLUDED.content,
193
+ tier = EXCLUDED.tier,
194
+ source = EXCLUDED.source,
195
+ actor = EXCLUDED.actor,
196
+ session_id = EXCLUDED.session_id,
197
+ last_accessed = EXCLUDED.last_accessed,
198
+ access_count = EXCLUDED.access_count,
199
+ importance = EXCLUDED.importance,
200
+ superseded_by = EXCLUDED.superseded_by,
201
+ contradicted_by = EXCLUDED.contradicted_by,
202
+ embedding = EXCLUDED.embedding,
203
+ metadata = EXCLUDED.metadata,
204
+ linked_ids = EXCLUDED.linked_ids,
205
+ agent_id = EXCLUDED.agent_id,
206
+ shared = EXCLUDED.shared`,
207
+ [
208
+ memory.id,
209
+ memory.content,
210
+ memory.tierName,
211
+ memory.source,
212
+ memory.actor,
213
+ memory.sessionId,
214
+ memory.createdAt.toISOString(),
215
+ memory.lastAccessedAt.toISOString(),
216
+ memory.accessCount,
217
+ memory.importance,
218
+ memory.supersededBy,
219
+ memory.contradictedBy ?? null,
220
+ memory.embedding ? `[${memory.embedding.join(",")}]` : null,
221
+ JSON.stringify(memory.metadata),
222
+ JSON.stringify(memory.linkedIds),
223
+ memory.agentId,
224
+ memory.shared
225
+ ]
226
+ );
227
+ }
228
+ async get(memoryId) {
229
+ const result = await this._query(
230
+ "SELECT * FROM memories WHERE id = $1",
231
+ [memoryId]
232
+ );
233
+ if (result.rows.length === 0) return null;
234
+ return rowToMemory(result.rows[0]);
235
+ }
236
+ async listAll(options) {
237
+ const clauses = [];
238
+ const params = [];
239
+ let paramIdx = 1;
240
+ if (options?.agentId) {
241
+ if (options.includeShared === false) {
242
+ clauses.push(`agent_id = $${paramIdx}`);
243
+ params.push(options.agentId);
244
+ paramIdx++;
245
+ } else {
246
+ clauses.push(`(agent_id = $${paramIdx} OR shared = TRUE)`);
247
+ params.push(options.agentId);
248
+ paramIdx++;
249
+ }
250
+ }
251
+ if (options?.tier != null) {
252
+ clauses.push(`tier = $${paramIdx}`);
253
+ params.push(options.tier);
254
+ paramIdx++;
255
+ }
256
+ const where = clauses.length > 0 ? ` WHERE ${clauses.join(" AND ")}` : "";
257
+ let limitClause = "";
258
+ if (options?.limit != null) {
259
+ limitClause = ` LIMIT $${paramIdx}`;
260
+ params.push(options.limit);
261
+ paramIdx++;
262
+ }
263
+ const result = await this._query(
264
+ `SELECT * FROM memories${where}${limitClause}`,
265
+ params
266
+ );
267
+ return result.rows.map(rowToMemory);
268
+ }
269
+ async delete(memoryId) {
270
+ await this._query("DELETE FROM memories WHERE id = $1", [memoryId]);
271
+ }
272
+ async deleteOlderThan(ageMs, tier, options) {
273
+ const cutoff = new Date(Date.now() - ageMs).toISOString();
274
+ const conditions = ["created_at < $1"];
275
+ const params = [cutoff];
276
+ let paramIdx = 2;
277
+ if (tier != null) {
278
+ conditions.push(`tier = $${paramIdx}`);
279
+ params.push(tier);
280
+ paramIdx++;
281
+ }
282
+ if (options?.agentId) {
283
+ conditions.push(`agent_id = $${paramIdx}`);
284
+ params.push(options.agentId);
285
+ paramIdx++;
286
+ }
287
+ const where = conditions.join(" AND ");
288
+ const result = await this._query(
289
+ `DELETE FROM memories WHERE ${where}`,
290
+ params
291
+ );
292
+ return result.rowCount ?? 0;
293
+ }
294
+ async saveEdge(edge) {
295
+ await this._query(
296
+ `INSERT INTO edges (source_id, target_id, relation, weight, created_at)
297
+ VALUES ($1, $2, $3, $4, $5)
298
+ ON CONFLICT (source_id, target_id, relation) DO UPDATE SET
299
+ weight = EXCLUDED.weight,
300
+ created_at = EXCLUDED.created_at`,
301
+ [
302
+ edge.sourceId,
303
+ edge.targetId,
304
+ edge.relation,
305
+ edge.weight,
306
+ edge.createdAt.toISOString()
307
+ ]
308
+ );
309
+ }
310
+ async getEdges(memoryId) {
311
+ const result = await this._query(
312
+ "SELECT * FROM edges WHERE source_id = $1 OR target_id = $1",
313
+ [memoryId]
314
+ );
315
+ return result.rows.map(
316
+ (r) => ({
317
+ sourceId: r["source_id"],
318
+ targetId: r["target_id"],
319
+ relation: r["relation"],
320
+ weight: r["weight"],
321
+ createdAt: new Date(r["created_at"])
322
+ })
323
+ );
324
+ }
325
+ async searchByEmbedding(embedding, limit = 50, options) {
326
+ try {
327
+ const embeddingStr = `[${embedding.join(",")}]`;
328
+ if (options?.agentId) {
329
+ const result2 = await this._query(
330
+ `SELECT * FROM memories
331
+ WHERE (agent_id = $1 OR shared = TRUE) AND embedding IS NOT NULL
332
+ ORDER BY embedding <=> $2::vector
333
+ LIMIT $3`,
334
+ [options.agentId, embeddingStr, limit]
335
+ );
336
+ return result2.rows.map(rowToMemory);
337
+ }
338
+ const result = await this._query(
339
+ `SELECT * FROM memories
340
+ WHERE embedding IS NOT NULL
341
+ ORDER BY embedding <=> $1::vector
342
+ LIMIT $2`,
343
+ [embeddingStr, limit]
344
+ );
345
+ return result.rows.map(rowToMemory);
346
+ } catch (err) {
347
+ const msg = err instanceof Error ? err.message : String(err);
348
+ if (msg.includes("operator") || msg.includes("vector") || msg.includes("does not exist")) {
349
+ const all = await this.listAll(options);
350
+ return bruteForceCosineSearch(all, embedding, limit);
351
+ }
352
+ throw err;
353
+ }
354
+ }
355
+ async findSimilarPairs(options) {
356
+ const threshold = options?.threshold ?? 0.7;
357
+ const maxCandidates = options?.maxCandidates ?? 1e3;
358
+ const maxNeighbors = options?.maxNeighborsPerCandidate ?? 50;
359
+ const distanceThreshold = 1 - threshold;
360
+ const conditions = ["embedding IS NOT NULL"];
361
+ const params = [];
362
+ let paramIdx = 1;
363
+ if (options?.agentId) {
364
+ conditions.push(`agent_id = $${paramIdx}`);
365
+ params.push(options.agentId);
366
+ paramIdx++;
367
+ }
368
+ if (options?.tier != null) {
369
+ conditions.push(`tier = $${paramIdx}`);
370
+ params.push(options.tier);
371
+ paramIdx++;
372
+ }
373
+ params.push(maxCandidates);
374
+ const limitIdx = paramIdx++;
375
+ params.push(distanceThreshold);
376
+ const distIdx = paramIdx++;
377
+ params.push(threshold);
378
+ const simIdx = paramIdx++;
379
+ params.push(maxNeighbors);
380
+ const neighborLimitIdx = paramIdx++;
381
+ const where = conditions.join(" AND ");
382
+ const sql = `
383
+ WITH candidates AS (
384
+ SELECT id, embedding
385
+ FROM memories
386
+ WHERE ${where}
387
+ LIMIT $${limitIdx}
388
+ )
389
+ SELECT c1.id AS id_a, c2_sub.id AS id_b, c2_sub.sim AS similarity
390
+ FROM candidates c1
391
+ CROSS JOIN LATERAL (
392
+ SELECT c2.id, 1.0 - (c1.embedding <=> c2.embedding) AS sim
393
+ FROM candidates c2
394
+ WHERE c2.id > c1.id
395
+ AND c1.embedding <=> c2.embedding <= $${distIdx}
396
+ ORDER BY c1.embedding <=> c2.embedding
397
+ LIMIT $${neighborLimitIdx}
398
+ ) c2_sub
399
+ WHERE c2_sub.sim >= $${simIdx}
400
+ `;
401
+ try {
402
+ const result = await this._query(sql, params);
403
+ return result.rows.map(
404
+ (r) => ({
405
+ idA: r["id_a"],
406
+ idB: r["id_b"],
407
+ similarity: r["similarity"]
408
+ })
409
+ );
410
+ } catch (err) {
411
+ const msg = err instanceof Error ? err.message : String(err);
412
+ if (msg.includes("operator") || msg.includes("vector") || msg.includes("does not exist")) {
413
+ const all = await this.listAll({
414
+ agentId: options?.agentId,
415
+ includeShared: false,
416
+ tier: options?.tier,
417
+ limit: maxCandidates
418
+ });
419
+ return bruteForceSimilarPairs(all, threshold, maxCandidates);
420
+ }
421
+ throw err;
422
+ }
423
+ }
424
+ async getMeta(key) {
425
+ const result = await this._query(
426
+ "SELECT value FROM meta WHERE key = $1",
427
+ [key]
428
+ );
429
+ return result.rows.length > 0 ? result.rows[0].value : null;
430
+ }
431
+ async setMeta(key, value) {
432
+ await this._query(
433
+ `INSERT INTO meta (key, value) VALUES ($1, $2)
434
+ ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,
435
+ [key, value]
436
+ );
437
+ }
438
+ };
439
+ function rowToMemory(row) {
440
+ const embedding = row["embedding"];
441
+ let parsedEmbedding = null;
442
+ if (embedding != null) {
443
+ if (Array.isArray(embedding)) {
444
+ parsedEmbedding = embedding;
445
+ } else if (typeof embedding === "string") {
446
+ parsedEmbedding = JSON.parse(embedding);
447
+ }
448
+ }
449
+ const m = new Memory({
450
+ id: row["id"],
451
+ content: row["content"],
452
+ tier: row["tier"],
453
+ source: row["source"],
454
+ actor: row["actor"],
455
+ sessionId: row["session_id"],
456
+ createdAt: new Date(row["created_at"]),
457
+ lastAccessedAt: new Date(row["last_accessed"]),
458
+ accessCount: row["access_count"],
459
+ importance: row["importance"],
460
+ supersededBy: row["superseded_by"],
461
+ embedding: parsedEmbedding,
462
+ metadata: typeof row["metadata"] === "string" ? JSON.parse(row["metadata"]) : row["metadata"] ?? {},
463
+ linkedIds: typeof row["linked_ids"] === "string" ? JSON.parse(row["linked_ids"]) : row["linked_ids"] ?? [],
464
+ agentId: row["agent_id"] ?? "default",
465
+ shared: row["shared"] === true || row["shared"] === "t"
466
+ });
467
+ m.contradictedBy = row["contradicted_by"];
468
+ return m;
469
+ }
470
+
471
+ export {
472
+ PostgresStore
473
+ };
474
+ //# sourceMappingURL=chunk-M3IZJTMM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stores/postgres.ts"],"sourcesContent":["/**\n * PostgreSQL + pgvector memory store — production-grade async backend.\n */\n\nimport { Memory, type MemoryEdge, type SimilarPair } from \"../core/memory.js\";\nimport { bruteForceCosineSearch, bruteForceSimilarPairs } from \"../core/utils.js\";\nimport type { AgentFilterOptions } from \"./base.js\";\nimport type { AsyncBaseStore } from \"./async-base.js\";\n\nexport interface PostgresStoreOptions {\n /** PostgreSQL connection string (e.g. postgresql://user:pass@host:5432/db). */\n dsn: string;\n /** Embedding vector dimension (default 1536). */\n embeddingDim?: number;\n /** Minimum pool connections (default 2). */\n poolMin?: number;\n /** Maximum pool connections (default 10). */\n poolMax?: number;\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// Dynamic imports for optional peer deps — typed as `any` since pg/pgvector\n// are optional and may not be installed.\nlet _pgModule: any = null;\nlet _registerPgvector: ((client: any) => Promise<void>) | null = null;\n\nasync function loadPg(): Promise<any> {\n if (_pgModule) return _pgModule;\n try {\n _pgModule = await import(\"pg\");\n return _pgModule;\n } catch {\n throw new Error(\n \"PostgresStore requires the 'pg' package. Install it with: npm install pg pgvector\",\n );\n }\n}\n\nasync function loadPgvectorRegister(): Promise<(client: any) => Promise<void>> {\n if (_registerPgvector) return _registerPgvector;\n try {\n const mod: any = await import(\"pgvector/pg\");\n // pgvector >=0.2 exports registerTypes (plural); fall back to registerType for compat\n _registerPgvector =\n mod.registerTypes ?? mod.default?.registerTypes ??\n mod.registerType ?? mod.default?.registerType;\n return _registerPgvector!;\n } catch {\n throw new Error(\n \"PostgresStore requires the 'pgvector' package. Install it with: npm install pgvector\",\n );\n }\n}\n\nexport class PostgresStore implements AsyncBaseStore {\n private _dsn: string;\n private _embeddingDim: number;\n private _poolMin: number;\n private _poolMax: number;\n private _pool: any = null;\n private _pgvectorRegistered = false;\n\n constructor(options: PostgresStoreOptions) {\n this._dsn = options.dsn;\n this._embeddingDim = options.embeddingDim ?? 1536;\n this._poolMin = options.poolMin ?? 2;\n this._poolMax = options.poolMax ?? 10;\n }\n\n private async _getPool() {\n if (this._pool) return this._pool;\n const pg = await loadPg();\n this._pool = new pg.Pool({\n connectionString: this._dsn,\n min: this._poolMin,\n max: this._poolMax,\n });\n return this._pool;\n }\n\n private async _query(sql: string, params: unknown[] = []) {\n const pool = await this._getPool();\n const client = await pool.connect();\n try {\n return await client.query(sql, params);\n } finally {\n client.release();\n }\n }\n\n /** Register pgvector on the pool's connect event so every connection gets it. */\n private async _setupPgvectorOnPool(): Promise<void> {\n if (this._pgvectorRegistered) return;\n const pool = await this._getPool();\n const register = await loadPgvectorRegister();\n pool.on(\"connect\", (client: any) => {\n register(client).catch((err: Error) => {\n process.stderr.write(`pgvector registration failed: ${err.message}\\n`);\n });\n });\n // Register on already-connected clients by running a probe query\n const client = await pool.connect();\n try {\n await register(client);\n } finally {\n client.release();\n }\n this._pgvectorRegistered = true;\n }\n\n async initialize(): Promise<void> {\n // Ensure the vector extension exists before registering types —\n // registerTypes queries pg_type for the vector OID and fails without it.\n await this._query(\"CREATE EXTENSION IF NOT EXISTS vector\");\n await this._setupPgvectorOnPool();\n await this._query(`\n CREATE TABLE IF NOT EXISTS memories (\n id TEXT PRIMARY KEY,\n content TEXT NOT NULL,\n tier TEXT NOT NULL,\n source TEXT NOT NULL DEFAULT 'unknown',\n actor TEXT NOT NULL DEFAULT 'system',\n session_id TEXT,\n created_at TIMESTAMPTZ NOT NULL,\n last_accessed TIMESTAMPTZ NOT NULL,\n access_count INTEGER NOT NULL DEFAULT 0,\n importance DOUBLE PRECISION NOT NULL DEFAULT 1.0,\n superseded_by TEXT,\n contradicted_by TEXT,\n embedding vector(${this._embeddingDim}),\n metadata JSONB NOT NULL DEFAULT '{}',\n linked_ids JSONB NOT NULL DEFAULT '[]',\n agent_id TEXT NOT NULL DEFAULT 'default',\n shared BOOLEAN NOT NULL DEFAULT FALSE\n )\n `);\n\n await this._query(`\n CREATE TABLE IF NOT EXISTS edges (\n source_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n target_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,\n relation TEXT NOT NULL,\n weight DOUBLE PRECISION NOT NULL DEFAULT 1.0,\n created_at TIMESTAMPTZ NOT NULL,\n PRIMARY KEY (source_id, target_id, relation)\n )\n `);\n\n await this._query(`\n CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )\n `);\n\n // Migrations for existing tables — must run before index creation\n // so that agent_id/shared columns exist when we build indexes on them.\n await this._migrateColumns();\n\n // Indexes\n await this._query(\n \"CREATE INDEX IF NOT EXISTS idx_memories_agent_id ON memories (agent_id)\",\n );\n await this._query(\n \"CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories (tier)\",\n );\n await this._query(\n \"CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories (created_at)\",\n );\n await this._query(\n \"CREATE INDEX IF NOT EXISTS idx_edges_source ON edges (source_id)\",\n );\n await this._query(\n \"CREATE INDEX IF NOT EXISTS idx_edges_target ON edges (target_id)\",\n );\n\n // Partial index for shared memories\n await this._query(\n \"CREATE INDEX IF NOT EXISTS idx_memories_shared ON memories (shared) WHERE shared = TRUE\",\n );\n\n // HNSW vector index\n try {\n await this._query(`\n CREATE INDEX IF NOT EXISTS idx_memories_embedding_hnsw\n ON memories USING hnsw (embedding vector_cosine_ops)\n WITH (m = 16, ef_construction = 64)\n `);\n } catch {\n // pgvector extension or index type may not be available\n }\n }\n\n private async _migrateColumns(): Promise<void> {\n // IF NOT EXISTS handles the duplicate-column case; let real errors propagate.\n await this._query(\n \"ALTER TABLE memories ADD COLUMN IF NOT EXISTS agent_id TEXT NOT NULL DEFAULT 'default'\",\n );\n await this._query(\n \"ALTER TABLE memories ADD COLUMN IF NOT EXISTS shared BOOLEAN NOT NULL DEFAULT FALSE\",\n );\n await this._query(\n \"ALTER TABLE memories ADD COLUMN IF NOT EXISTS contradicted_by TEXT\",\n );\n await this._query(\n \"UPDATE memories SET contradicted_by = metadata->>'contradicted_by' \" +\n \"WHERE contradicted_by IS NULL AND metadata->>'contradicted_by' IS NOT NULL\",\n );\n\n // Add FK constraints if missing (for pre-existing edges tables)\n for (const col of [\"source_id\", \"target_id\"]) {\n const name = `edges_${col}_fkey`;\n try {\n await this._query(\n `ALTER TABLE edges ADD CONSTRAINT ${name} FOREIGN KEY (${col}) REFERENCES memories(id) ON DELETE CASCADE`,\n );\n } catch (err: unknown) {\n // 42710 = duplicate_object (constraint already exists); rethrow anything else\n const code = (err as { code?: string }).code;\n if (code !== \"42710\") throw err;\n }\n }\n }\n\n async close(): Promise<void> {\n if (this._pool) {\n await this._pool.end();\n this._pool = null;\n this._pgvectorRegistered = false;\n }\n }\n\n async save(memory: Memory): Promise<void> {\n await this._query(\n `INSERT INTO memories\n (id, content, tier, source, actor, session_id, created_at,\n last_accessed, access_count, importance, superseded_by,\n contradicted_by, embedding, metadata, linked_ids, agent_id, shared)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13::vector, $14, $15, $16, $17)\n ON CONFLICT (id) DO UPDATE SET\n content = EXCLUDED.content,\n tier = EXCLUDED.tier,\n source = EXCLUDED.source,\n actor = EXCLUDED.actor,\n session_id = EXCLUDED.session_id,\n last_accessed = EXCLUDED.last_accessed,\n access_count = EXCLUDED.access_count,\n importance = EXCLUDED.importance,\n superseded_by = EXCLUDED.superseded_by,\n contradicted_by = EXCLUDED.contradicted_by,\n embedding = EXCLUDED.embedding,\n metadata = EXCLUDED.metadata,\n linked_ids = EXCLUDED.linked_ids,\n agent_id = EXCLUDED.agent_id,\n shared = EXCLUDED.shared`,\n [\n memory.id,\n memory.content,\n memory.tierName,\n memory.source,\n memory.actor,\n memory.sessionId,\n memory.createdAt.toISOString(),\n memory.lastAccessedAt.toISOString(),\n memory.accessCount,\n memory.importance,\n memory.supersededBy,\n memory.contradictedBy ?? null,\n memory.embedding ? `[${memory.embedding.join(\",\")}]` : null,\n JSON.stringify(memory.metadata),\n JSON.stringify(memory.linkedIds),\n memory.agentId,\n memory.shared,\n ],\n );\n }\n\n async get(memoryId: string): Promise<Memory | null> {\n const result = await this._query(\n \"SELECT * FROM memories WHERE id = $1\",\n [memoryId],\n );\n if (result.rows.length === 0) return null;\n return rowToMemory(result.rows[0]);\n }\n\n async listAll(options?: AgentFilterOptions): Promise<Memory[]> {\n const clauses: string[] = [];\n const params: unknown[] = [];\n let paramIdx = 1;\n\n if (options?.agentId) {\n if (options.includeShared === false) {\n clauses.push(`agent_id = $${paramIdx}`);\n params.push(options.agentId);\n paramIdx++;\n } else {\n clauses.push(`(agent_id = $${paramIdx} OR shared = TRUE)`);\n params.push(options.agentId);\n paramIdx++;\n }\n }\n if (options?.tier != null) {\n clauses.push(`tier = $${paramIdx}`);\n params.push(options.tier);\n paramIdx++;\n }\n\n const where = clauses.length > 0 ? ` WHERE ${clauses.join(\" AND \")}` : \"\";\n let limitClause = \"\";\n if (options?.limit != null) {\n limitClause = ` LIMIT $${paramIdx}`;\n params.push(options.limit);\n paramIdx++;\n }\n const result = await this._query(\n `SELECT * FROM memories${where}${limitClause}`,\n params,\n );\n return result.rows.map(rowToMemory);\n }\n\n async delete(memoryId: string): Promise<void> {\n // FK ON DELETE CASCADE automatically removes edges referencing this memory.\n await this._query(\"DELETE FROM memories WHERE id = $1\", [memoryId]);\n }\n\n async deleteOlderThan(\n ageMs: number,\n tier?: string,\n options?: AgentFilterOptions,\n ): Promise<number> {\n const cutoff = new Date(Date.now() - ageMs).toISOString();\n const conditions = [\"created_at < $1\"];\n const params: unknown[] = [cutoff];\n let paramIdx = 2;\n\n if (tier != null) {\n conditions.push(`tier = $${paramIdx}`);\n params.push(tier);\n paramIdx++;\n }\n if (options?.agentId) {\n conditions.push(`agent_id = $${paramIdx}`);\n params.push(options.agentId);\n paramIdx++;\n }\n\n const where = conditions.join(\" AND \");\n\n // FK ON DELETE CASCADE automatically removes edges referencing deleted memories.\n const result = await this._query(\n `DELETE FROM memories WHERE ${where}`,\n params,\n );\n return result.rowCount ?? 0;\n }\n\n async saveEdge(edge: MemoryEdge): Promise<void> {\n await this._query(\n `INSERT INTO edges (source_id, target_id, relation, weight, created_at)\n VALUES ($1, $2, $3, $4, $5)\n ON CONFLICT (source_id, target_id, relation) DO UPDATE SET\n weight = EXCLUDED.weight,\n created_at = EXCLUDED.created_at`,\n [\n edge.sourceId,\n edge.targetId,\n edge.relation,\n edge.weight,\n edge.createdAt.toISOString(),\n ],\n );\n }\n\n async getEdges(memoryId: string): Promise<MemoryEdge[]> {\n const result = await this._query(\n \"SELECT * FROM edges WHERE source_id = $1 OR target_id = $1\",\n [memoryId],\n );\n return result.rows.map(\n (r: Record<string, unknown>) =>\n ({\n sourceId: r[\"source_id\"] as string,\n targetId: r[\"target_id\"] as string,\n relation: r[\"relation\"] as string,\n weight: r[\"weight\"] as number,\n createdAt: new Date(r[\"created_at\"] as string),\n }) satisfies MemoryEdge,\n );\n }\n\n async searchByEmbedding(\n embedding: number[],\n limit: number = 50,\n options?: AgentFilterOptions,\n ): Promise<Memory[]> {\n try {\n // Try HNSW vector search\n const embeddingStr = `[${embedding.join(\",\")}]`;\n if (options?.agentId) {\n const result = await this._query(\n `SELECT * FROM memories\n WHERE (agent_id = $1 OR shared = TRUE) AND embedding IS NOT NULL\n ORDER BY embedding <=> $2::vector\n LIMIT $3`,\n [options.agentId, embeddingStr, limit],\n );\n return result.rows.map(rowToMemory);\n }\n const result = await this._query(\n `SELECT * FROM memories\n WHERE embedding IS NOT NULL\n ORDER BY embedding <=> $1::vector\n LIMIT $2`,\n [embeddingStr, limit],\n );\n return result.rows.map(rowToMemory);\n } catch (err: unknown) {\n // Fallback to brute-force only for pgvector operator/type errors\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes(\"operator\") || msg.includes(\"vector\") || msg.includes(\"does not exist\")) {\n const all = await this.listAll(options);\n return bruteForceCosineSearch(all, embedding, limit);\n }\n throw err;\n }\n }\n\n async findSimilarPairs(options?: {\n threshold?: number;\n agentId?: string;\n tier?: string;\n maxCandidates?: number;\n maxNeighborsPerCandidate?: number;\n }): Promise<SimilarPair[]> {\n const threshold = options?.threshold ?? 0.7;\n const maxCandidates = options?.maxCandidates ?? 1000;\n const maxNeighbors = options?.maxNeighborsPerCandidate ?? 50;\n const distanceThreshold = 1.0 - threshold;\n\n const conditions = [\"embedding IS NOT NULL\"];\n const params: unknown[] = [];\n let paramIdx = 1;\n\n if (options?.agentId) {\n conditions.push(`agent_id = $${paramIdx}`);\n params.push(options.agentId);\n paramIdx++;\n }\n if (options?.tier != null) {\n conditions.push(`tier = $${paramIdx}`);\n params.push(options.tier);\n paramIdx++;\n }\n\n params.push(maxCandidates);\n const limitIdx = paramIdx++;\n params.push(distanceThreshold);\n const distIdx = paramIdx++;\n params.push(threshold);\n const simIdx = paramIdx++;\n params.push(maxNeighbors);\n const neighborLimitIdx = paramIdx++;\n\n const where = conditions.join(\" AND \");\n\n const sql = `\n WITH candidates AS (\n SELECT id, embedding\n FROM memories\n WHERE ${where}\n LIMIT $${limitIdx}\n )\n SELECT c1.id AS id_a, c2_sub.id AS id_b, c2_sub.sim AS similarity\n FROM candidates c1\n CROSS JOIN LATERAL (\n SELECT c2.id, 1.0 - (c1.embedding <=> c2.embedding) AS sim\n FROM candidates c2\n WHERE c2.id > c1.id\n AND c1.embedding <=> c2.embedding <= $${distIdx}\n ORDER BY c1.embedding <=> c2.embedding\n LIMIT $${neighborLimitIdx}\n ) c2_sub\n WHERE c2_sub.sim >= $${simIdx}\n `;\n\n try {\n const result = await this._query(sql, params);\n return result.rows.map(\n (r: Record<string, unknown>) => ({\n idA: r[\"id_a\"] as string,\n idB: r[\"id_b\"] as string,\n similarity: r[\"similarity\"] as number,\n }),\n );\n } catch (err: unknown) {\n // Fallback to brute-force if pgvector operator not available\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes(\"operator\") || msg.includes(\"vector\") || msg.includes(\"does not exist\")) {\n const all = await this.listAll({\n agentId: options?.agentId,\n includeShared: false,\n tier: options?.tier,\n limit: maxCandidates,\n });\n return bruteForceSimilarPairs(all, threshold, maxCandidates);\n }\n throw err;\n }\n }\n\n async getMeta(key: string): Promise<string | null> {\n const result = await this._query(\n \"SELECT value FROM meta WHERE key = $1\",\n [key],\n );\n return result.rows.length > 0\n ? (result.rows[0] as { value: string }).value\n : null;\n }\n\n async setMeta(key: string, value: string): Promise<void> {\n await this._query(\n `INSERT INTO meta (key, value) VALUES ($1, $2)\n ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value`,\n [key, value],\n );\n }\n}\n\nfunction rowToMemory(row: Record<string, unknown>): Memory {\n const embedding = row[\"embedding\"];\n let parsedEmbedding: number[] | null = null;\n if (embedding != null) {\n if (Array.isArray(embedding)) {\n parsedEmbedding = embedding as number[];\n } else if (typeof embedding === \"string\") {\n // pgvector may return as string \"[1,2,3]\"\n parsedEmbedding = JSON.parse(embedding) as number[];\n }\n }\n\n const m = new Memory({\n id: row[\"id\"] as string,\n content: row[\"content\"] as string,\n tier: row[\"tier\"] as string,\n source: row[\"source\"] as string,\n actor: row[\"actor\"] as string,\n sessionId: row[\"session_id\"] as string | null,\n createdAt: new Date(row[\"created_at\"] as string),\n lastAccessedAt: new Date(row[\"last_accessed\"] as string),\n accessCount: row[\"access_count\"] as number,\n importance: row[\"importance\"] as number,\n supersededBy: row[\"superseded_by\"] as string | null,\n embedding: parsedEmbedding,\n metadata:\n typeof row[\"metadata\"] === \"string\"\n ? (JSON.parse(row[\"metadata\"] as string) as Record<string, unknown>)\n : ((row[\"metadata\"] as Record<string, unknown>) ?? {}),\n linkedIds:\n typeof row[\"linked_ids\"] === \"string\"\n ? (JSON.parse(row[\"linked_ids\"] as string) as string[])\n : ((row[\"linked_ids\"] as string[]) ?? []),\n agentId: (row[\"agent_id\"] as string) ?? \"default\",\n shared: row[\"shared\"] === true || row[\"shared\"] === \"t\",\n });\n m.contradictedBy = row[\"contradicted_by\"] as string | null;\n return m;\n}\n"],"mappings":"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","names":["client","result"]}