@hazeljs/memory 0.2.0-alpha.3

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 (114) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +121 -0
  3. package/dist/__tests__/composite.store.test.d.ts +2 -0
  4. package/dist/__tests__/composite.store.test.d.ts.map +1 -0
  5. package/dist/__tests__/composite.store.test.js +216 -0
  6. package/dist/__tests__/composite.store.test.js.map +1 -0
  7. package/dist/__tests__/create-memory-store.test.d.ts +2 -0
  8. package/dist/__tests__/create-memory-store.test.d.ts.map +1 -0
  9. package/dist/__tests__/create-memory-store.test.js +85 -0
  10. package/dist/__tests__/create-memory-store.test.js.map +1 -0
  11. package/dist/__tests__/in-memory.store.test.d.ts +2 -0
  12. package/dist/__tests__/in-memory.store.test.d.ts.map +1 -0
  13. package/dist/__tests__/in-memory.store.test.js +336 -0
  14. package/dist/__tests__/in-memory.store.test.js.map +1 -0
  15. package/dist/__tests__/memory.config.test.d.ts +2 -0
  16. package/dist/__tests__/memory.config.test.d.ts.map +1 -0
  17. package/dist/__tests__/memory.config.test.js +39 -0
  18. package/dist/__tests__/memory.config.test.js.map +1 -0
  19. package/dist/__tests__/memory.service.test.d.ts +2 -0
  20. package/dist/__tests__/memory.service.test.d.ts.map +1 -0
  21. package/dist/__tests__/memory.service.test.js +231 -0
  22. package/dist/__tests__/memory.service.test.js.map +1 -0
  23. package/dist/config/memory.config.d.ts +17 -0
  24. package/dist/config/memory.config.d.ts.map +1 -0
  25. package/dist/config/memory.config.js +20 -0
  26. package/dist/config/memory.config.js.map +1 -0
  27. package/dist/generated/prisma/client.d.ts +1 -0
  28. package/dist/generated/prisma/client.js +5 -0
  29. package/dist/generated/prisma/default.d.ts +1 -0
  30. package/dist/generated/prisma/default.js +5 -0
  31. package/dist/generated/prisma/edge.d.ts +1 -0
  32. package/dist/generated/prisma/edge.js +213 -0
  33. package/dist/generated/prisma/index-browser.js +199 -0
  34. package/dist/generated/prisma/index.d.ts +2874 -0
  35. package/dist/generated/prisma/index.js +234 -0
  36. package/dist/generated/prisma/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  37. package/dist/generated/prisma/package.json +183 -0
  38. package/dist/generated/prisma/query_engine_bg.js +2 -0
  39. package/dist/generated/prisma/query_engine_bg.wasm +0 -0
  40. package/dist/generated/prisma/runtime/edge-esm.js +35 -0
  41. package/dist/generated/prisma/runtime/edge.js +35 -0
  42. package/dist/generated/prisma/runtime/index-browser.d.ts +370 -0
  43. package/dist/generated/prisma/runtime/index-browser.js +17 -0
  44. package/dist/generated/prisma/runtime/library.d.ts +3982 -0
  45. package/dist/generated/prisma/runtime/library.js +147 -0
  46. package/dist/generated/prisma/runtime/react-native.js +84 -0
  47. package/dist/generated/prisma/runtime/wasm-compiler-edge.js +85 -0
  48. package/dist/generated/prisma/runtime/wasm-engine-edge.js +38 -0
  49. package/dist/generated/prisma/schema.prisma +32 -0
  50. package/dist/generated/prisma/wasm-edge-light-loader.mjs +5 -0
  51. package/dist/generated/prisma/wasm-worker-loader.mjs +5 -0
  52. package/dist/generated/prisma/wasm.d.ts +1 -0
  53. package/dist/generated/prisma/wasm.js +220 -0
  54. package/dist/index.d.ts +16 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +50 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/prisma-client.d.ts +13 -0
  59. package/dist/prisma-client.d.ts.map +1 -0
  60. package/dist/prisma-client.js +37 -0
  61. package/dist/prisma-client.js.map +1 -0
  62. package/dist/prisma.d.ts +12 -0
  63. package/dist/prisma.d.ts.map +1 -0
  64. package/dist/prisma.js +20 -0
  65. package/dist/prisma.js.map +1 -0
  66. package/dist/service/memory.service.d.ts +63 -0
  67. package/dist/service/memory.service.d.ts.map +1 -0
  68. package/dist/service/memory.service.js +134 -0
  69. package/dist/service/memory.service.js.map +1 -0
  70. package/dist/store/adapters/postgres.store.d.ts +55 -0
  71. package/dist/store/adapters/postgres.store.d.ts.map +1 -0
  72. package/dist/store/adapters/postgres.store.js +263 -0
  73. package/dist/store/adapters/postgres.store.js.map +1 -0
  74. package/dist/store/adapters/prisma.store.d.ts +88 -0
  75. package/dist/store/adapters/prisma.store.d.ts.map +1 -0
  76. package/dist/store/adapters/prisma.store.js +202 -0
  77. package/dist/store/adapters/prisma.store.js.map +1 -0
  78. package/dist/store/adapters/redis.store.d.ts +44 -0
  79. package/dist/store/adapters/redis.store.d.ts.map +1 -0
  80. package/dist/store/adapters/redis.store.js +261 -0
  81. package/dist/store/adapters/redis.store.js.map +1 -0
  82. package/dist/store/adapters/vector-episodic.store.d.ts +55 -0
  83. package/dist/store/adapters/vector-episodic.store.d.ts.map +1 -0
  84. package/dist/store/adapters/vector-episodic.store.js +253 -0
  85. package/dist/store/adapters/vector-episodic.store.js.map +1 -0
  86. package/dist/store/composite.store.d.ts +37 -0
  87. package/dist/store/composite.store.d.ts.map +1 -0
  88. package/dist/store/composite.store.js +151 -0
  89. package/dist/store/composite.store.js.map +1 -0
  90. package/dist/store/create-memory-store.d.ts +26 -0
  91. package/dist/store/create-memory-store.d.ts.map +1 -0
  92. package/dist/store/create-memory-store.js +29 -0
  93. package/dist/store/create-memory-store.js.map +1 -0
  94. package/dist/store/in-memory.store.d.ts +45 -0
  95. package/dist/store/in-memory.store.d.ts.map +1 -0
  96. package/dist/store/in-memory.store.js +316 -0
  97. package/dist/store/in-memory.store.js.map +1 -0
  98. package/dist/store/memory-store.interface.d.ts +56 -0
  99. package/dist/store/memory-store.interface.d.ts.map +1 -0
  100. package/dist/store/memory-store.interface.js +6 -0
  101. package/dist/store/memory-store.interface.js.map +1 -0
  102. package/dist/types/category.types.d.ts +29 -0
  103. package/dist/types/category.types.d.ts.map +1 -0
  104. package/dist/types/category.types.js +44 -0
  105. package/dist/types/category.types.js.map +1 -0
  106. package/dist/types/memory-item.types.d.ts +32 -0
  107. package/dist/types/memory-item.types.d.ts.map +1 -0
  108. package/dist/types/memory-item.types.js +6 -0
  109. package/dist/types/memory-item.types.js.map +1 -0
  110. package/dist/types/store.types.d.ts +36 -0
  111. package/dist/types/store.types.d.ts.map +1 -0
  112. package/dist/types/store.types.js +6 -0
  113. package/dist/types/store.types.js.map +1 -0
  114. package/package.json +77 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * PostgreSQL memory store adapter.
3
+ * Pass a pool (e.g. from "pg") so this package has no direct pg dependency.
4
+ */
5
+ import { MemoryItem } from '../../types/memory-item.types';
6
+ import { MemoryQuery, MemoryStats, PruneOptions } from '../../types/store.types';
7
+ import { MemoryStore } from '../memory-store.interface';
8
+ export interface PostgresStoreOptions {
9
+ /** A pool-like client with query(sql, params?) returning rows and optional rowCount. */
10
+ pool: {
11
+ query: (sql: string, params?: unknown[]) => Promise<{
12
+ rows: unknown[];
13
+ rowCount?: number;
14
+ }>;
15
+ };
16
+ /** Table name. Default: memory_items. */
17
+ tableName?: string;
18
+ }
19
+ /**
20
+ * PostgreSQL-backed memory store. Create table with:
21
+ * CREATE TABLE memory_items (
22
+ * id TEXT PRIMARY KEY,
23
+ * user_id TEXT NOT NULL,
24
+ * category TEXT NOT NULL,
25
+ * key TEXT NOT NULL,
26
+ * value TEXT NOT NULL,
27
+ * confidence REAL NOT NULL,
28
+ * source TEXT NOT NULL,
29
+ * evidence TEXT NOT NULL,
30
+ * created_at TIMESTAMPTZ NOT NULL,
31
+ * updated_at TIMESTAMPTZ NOT NULL,
32
+ * expires_at TIMESTAMPTZ,
33
+ * access_count INTEGER NOT NULL DEFAULT 0,
34
+ * session_id TEXT
35
+ * );
36
+ * CREATE INDEX idx_memory_items_user_category ON memory_items(user_id, category);
37
+ * CREATE INDEX idx_memory_items_expires ON memory_items(expires_at) WHERE expires_at IS NOT NULL;
38
+ */
39
+ export declare class PostgresStore implements MemoryStore {
40
+ private readonly pool;
41
+ private readonly table;
42
+ private initialized;
43
+ constructor(options: PostgresStoreOptions);
44
+ initialize(): Promise<void>;
45
+ save(item: MemoryItem): Promise<string>;
46
+ saveBatch(items: MemoryItem[]): Promise<string[]>;
47
+ get(id: string): Promise<MemoryItem | null>;
48
+ update(id: string, updates: Partial<MemoryItem>): Promise<void>;
49
+ delete(id: string): Promise<void>;
50
+ deleteBatch(ids: string[]): Promise<void>;
51
+ query(options: MemoryQuery): Promise<MemoryItem[]>;
52
+ getStats(userId?: string): Promise<MemoryStats>;
53
+ prune(options?: PruneOptions): Promise<number>;
54
+ }
55
+ //# sourceMappingURL=postgres.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.store.d.ts","sourceRoot":"","sources":["../../../src/store/adapters/postgres.store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAgB,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,wFAAwF;IACxF,IAAI,EAAE;QACJ,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;YAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC7F,CAAC;IACF,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAc,YAAW,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,oBAAoB;IAKnC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B3B,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BvC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQjD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAY3C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC/D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAuClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmC/C,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;CA+BrD"}
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ /**
3
+ * PostgreSQL memory store adapter.
4
+ * Pass a pool (e.g. from "pg") so this package has no direct pg dependency.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PostgresStore = void 0;
8
+ const category_types_1 = require("../../types/category.types");
9
+ const DEFAULT_TABLE = 'memory_items';
10
+ function parseValue(raw) {
11
+ try {
12
+ const parsed = JSON.parse(raw);
13
+ if (typeof parsed === 'string')
14
+ return parsed;
15
+ if (Array.isArray(parsed))
16
+ return parsed;
17
+ return parsed;
18
+ }
19
+ catch {
20
+ return raw;
21
+ }
22
+ }
23
+ function rowToItem(row) {
24
+ return {
25
+ id: row.id,
26
+ userId: row.user_id,
27
+ category: row.category,
28
+ key: row.key,
29
+ value: parseValue(row.value ?? 'null'),
30
+ confidence: Number(row.confidence),
31
+ source: row.source,
32
+ evidence: Array.isArray(row.evidence)
33
+ ? row.evidence
34
+ : JSON.parse(row.evidence || '[]'),
35
+ createdAt: new Date(row.created_at),
36
+ updatedAt: new Date(row.updated_at),
37
+ expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,
38
+ accessCount: Number(row.access_count ?? 0),
39
+ sessionId: row.session_id,
40
+ };
41
+ }
42
+ /**
43
+ * PostgreSQL-backed memory store. Create table with:
44
+ * CREATE TABLE memory_items (
45
+ * id TEXT PRIMARY KEY,
46
+ * user_id TEXT NOT NULL,
47
+ * category TEXT NOT NULL,
48
+ * key TEXT NOT NULL,
49
+ * value TEXT NOT NULL,
50
+ * confidence REAL NOT NULL,
51
+ * source TEXT NOT NULL,
52
+ * evidence TEXT NOT NULL,
53
+ * created_at TIMESTAMPTZ NOT NULL,
54
+ * updated_at TIMESTAMPTZ NOT NULL,
55
+ * expires_at TIMESTAMPTZ,
56
+ * access_count INTEGER NOT NULL DEFAULT 0,
57
+ * session_id TEXT
58
+ * );
59
+ * CREATE INDEX idx_memory_items_user_category ON memory_items(user_id, category);
60
+ * CREATE INDEX idx_memory_items_expires ON memory_items(expires_at) WHERE expires_at IS NOT NULL;
61
+ */
62
+ class PostgresStore {
63
+ constructor(options) {
64
+ this.initialized = false;
65
+ this.pool = options.pool;
66
+ this.table = options.tableName ?? DEFAULT_TABLE;
67
+ }
68
+ async initialize() {
69
+ if (this.initialized)
70
+ return;
71
+ await this.pool.query(`
72
+ CREATE TABLE IF NOT EXISTS ${this.table} (
73
+ id TEXT PRIMARY KEY,
74
+ user_id TEXT NOT NULL,
75
+ category TEXT NOT NULL,
76
+ key TEXT NOT NULL,
77
+ value TEXT NOT NULL,
78
+ confidence REAL NOT NULL,
79
+ source TEXT NOT NULL,
80
+ evidence TEXT NOT NULL,
81
+ created_at TIMESTAMPTZ NOT NULL,
82
+ updated_at TIMESTAMPTZ NOT NULL,
83
+ expires_at TIMESTAMPTZ,
84
+ access_count INTEGER NOT NULL DEFAULT 0,
85
+ session_id TEXT
86
+ )
87
+ `);
88
+ await this.pool.query(`
89
+ CREATE INDEX IF NOT EXISTS idx_${this.table}_user_category
90
+ ON ${this.table}(user_id, category)
91
+ `);
92
+ await this.pool.query(`
93
+ CREATE INDEX IF NOT EXISTS idx_${this.table}_expires
94
+ ON ${this.table}(expires_at) WHERE expires_at IS NOT NULL
95
+ `);
96
+ this.initialized = true;
97
+ }
98
+ async save(item) {
99
+ const valueStr = typeof item.value === 'object' && item.value !== null
100
+ ? JSON.stringify(item.value)
101
+ : String(item.value);
102
+ const evidenceStr = JSON.stringify(item.evidence ?? []);
103
+ await this.pool.query(`INSERT INTO ${this.table} (id, user_id, category, key, value, confidence, source, evidence, created_at, updated_at, expires_at, access_count, session_id)
104
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
105
+ ON CONFLICT (id) DO UPDATE SET
106
+ value = EXCLUDED.value, confidence = EXCLUDED.confidence, evidence = EXCLUDED.evidence,
107
+ updated_at = EXCLUDED.updated_at, expires_at = EXCLUDED.expires_at, access_count = EXCLUDED.access_count`, [
108
+ item.id,
109
+ item.userId,
110
+ item.category,
111
+ item.key,
112
+ valueStr,
113
+ item.confidence,
114
+ item.source,
115
+ evidenceStr,
116
+ item.createdAt,
117
+ item.updatedAt,
118
+ item.expiresAt ?? null,
119
+ item.accessCount ?? 0,
120
+ item.sessionId ?? null,
121
+ ]);
122
+ return item.id;
123
+ }
124
+ async saveBatch(items) {
125
+ const ids = [];
126
+ for (const item of items) {
127
+ ids.push(await this.save(item));
128
+ }
129
+ return ids;
130
+ }
131
+ async get(id) {
132
+ const { rows } = await this.pool.query(`SELECT * FROM ${this.table} WHERE id = $1`, [id]);
133
+ const row = rows[0];
134
+ if (!row)
135
+ return null;
136
+ const item = rowToItem(row);
137
+ if (item.expiresAt && item.expiresAt.getTime() < Date.now()) {
138
+ await this.delete(id);
139
+ return null;
140
+ }
141
+ return item;
142
+ }
143
+ async update(id, updates) {
144
+ const existing = await this.get(id);
145
+ if (!existing)
146
+ return;
147
+ const valueStr = updates.value !== undefined
148
+ ? typeof updates.value === 'object' && updates.value !== null
149
+ ? JSON.stringify(updates.value)
150
+ : String(updates.value)
151
+ : typeof existing.value === 'object'
152
+ ? JSON.stringify(existing.value)
153
+ : String(existing.value);
154
+ const evidenceStr = updates.evidence !== undefined
155
+ ? JSON.stringify(updates.evidence)
156
+ : JSON.stringify(existing.evidence);
157
+ await this.pool.query(`UPDATE ${this.table} SET
158
+ value = $2, confidence = COALESCE($3, confidence), source = COALESCE($4, source),
159
+ evidence = $5, updated_at = $6, expires_at = COALESCE($7, expires_at), access_count = COALESCE($8, access_count)
160
+ WHERE id = $1`, [
161
+ id,
162
+ valueStr,
163
+ updates.confidence ?? existing.confidence,
164
+ updates.source ?? existing.source,
165
+ evidenceStr,
166
+ new Date(),
167
+ updates.expiresAt !== undefined ? updates.expiresAt : existing.expiresAt,
168
+ updates.accessCount ?? existing.accessCount,
169
+ ]);
170
+ }
171
+ async delete(id) {
172
+ await this.pool.query(`DELETE FROM ${this.table} WHERE id = $1`, [id]);
173
+ }
174
+ async deleteBatch(ids) {
175
+ if (ids.length === 0)
176
+ return;
177
+ const placeholders = ids.map((_, i) => `$${i + 1}`).join(',');
178
+ await this.pool.query(`DELETE FROM ${this.table} WHERE id IN (${placeholders})`, ids);
179
+ }
180
+ async query(options) {
181
+ const conditions = ['user_id = $1'];
182
+ const params = [options.userId];
183
+ let paramIndex = 2;
184
+ if (options.category != null) {
185
+ const cats = Array.isArray(options.category) ? options.category : [options.category];
186
+ conditions.push(`category = ANY($${paramIndex})`);
187
+ params.push(cats);
188
+ paramIndex++;
189
+ }
190
+ if (options.source != null) {
191
+ const srcs = Array.isArray(options.source) ? options.source : [options.source];
192
+ conditions.push(`source = ANY($${paramIndex})`);
193
+ params.push(srcs);
194
+ paramIndex++;
195
+ }
196
+ if (options.minConfidence != null) {
197
+ conditions.push(`confidence >= $${paramIndex}`);
198
+ params.push(options.minConfidence);
199
+ paramIndex++;
200
+ }
201
+ if (options.notExpired !== false) {
202
+ conditions.push(`(expires_at IS NULL OR expires_at > NOW())`);
203
+ }
204
+ const orderByCol = options.orderBy === 'createdAt' ? 'created_at' : 'updated_at';
205
+ const order = options.order ?? 'desc';
206
+ const limit = options.limit ?? 100;
207
+ const offset = options.offset ?? 0;
208
+ const { rows } = await this.pool.query(`SELECT * FROM ${this.table} WHERE ${conditions.join(' AND ')} ORDER BY ${orderByCol} ${order} LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`, [...params, limit, offset]);
209
+ return rows.map(rowToItem);
210
+ }
211
+ async getStats(userId) {
212
+ const byCategory = Object.values(category_types_1.MemoryCategory).reduce((acc, cat) => ({ ...acc, [cat]: 0 }), {});
213
+ const where = userId
214
+ ? 'WHERE user_id = $1 AND (expires_at IS NULL OR expires_at > NOW())'
215
+ : 'WHERE expires_at IS NULL OR expires_at > NOW()';
216
+ const params = userId ? [userId] : [];
217
+ const { rows } = await this.pool.query(`SELECT category, COUNT(*) as cnt FROM ${this.table} ${where} GROUP BY category`, params);
218
+ for (const row of rows) {
219
+ if (row.category in byCategory)
220
+ byCategory[row.category] = parseInt(row.cnt, 10);
221
+ }
222
+ const { rows: agg } = await this.pool.query(`SELECT MIN(updated_at) as oldest, MAX(updated_at) as newest FROM ${this.table} ${where}`, params);
223
+ const a = agg[0] ?? {};
224
+ const total = Object.values(byCategory).reduce((s, n) => s + n, 0);
225
+ return {
226
+ total,
227
+ byCategory,
228
+ oldestMemory: a.oldest ? new Date(a.oldest) : null,
229
+ newestMemory: a.newest ? new Date(a.newest) : null,
230
+ };
231
+ }
232
+ async prune(options) {
233
+ const conditions = [];
234
+ const params = [];
235
+ let paramIndex = 1;
236
+ if (options?.userId) {
237
+ conditions.push(`user_id = $${paramIndex}`);
238
+ params.push(options.userId);
239
+ paramIndex++;
240
+ }
241
+ if (options?.category) {
242
+ conditions.push(`category = $${paramIndex}`);
243
+ params.push(options.category);
244
+ paramIndex++;
245
+ }
246
+ if (options?.olderThan) {
247
+ conditions.push(`updated_at < $${paramIndex}`);
248
+ params.push(options.olderThan);
249
+ paramIndex++;
250
+ }
251
+ if (options?.minConfidence != null) {
252
+ conditions.push(`confidence < $${paramIndex}`);
253
+ params.push(options.minConfidence);
254
+ paramIndex++;
255
+ }
256
+ conditions.push('(expires_at IS NOT NULL AND expires_at < NOW())');
257
+ const where = conditions.length ? 'WHERE ' + conditions.join(' AND ') : '';
258
+ const result = await this.pool.query(`DELETE FROM ${this.table} ${where}`, params);
259
+ return typeof result.rowCount === 'number' ? result.rowCount : 0;
260
+ }
261
+ }
262
+ exports.PostgresStore = PostgresStore;
263
+ //# sourceMappingURL=postgres.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres.store.js","sourceRoot":"","sources":["../../../src/store/adapters/postgres.store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Prisma-backed memory store (PostgreSQL).
3
+ * Import from '@hazeljs/memory/prisma' when you want DB persistence with Prisma.
4
+ */
5
+ /** Minimal Prisma client shape for memory (avoids importing generated client in this file). */
6
+ export interface MemoryPrismaClient {
7
+ memoryItem: {
8
+ upsert(args: {
9
+ where: {
10
+ id: string;
11
+ };
12
+ create: object;
13
+ update: object;
14
+ }): Promise<unknown>;
15
+ findUnique(args: {
16
+ where: {
17
+ id: string;
18
+ };
19
+ }): Promise<unknown>;
20
+ findMany(args: {
21
+ where?: object;
22
+ orderBy?: object;
23
+ take?: number;
24
+ skip?: number;
25
+ }): Promise<unknown[]>;
26
+ update(args: {
27
+ where: {
28
+ id: string;
29
+ };
30
+ data: object;
31
+ }): Promise<unknown>;
32
+ delete(args: {
33
+ where: {
34
+ id: string;
35
+ };
36
+ }): Promise<unknown>;
37
+ deleteMany(args: {
38
+ where: object;
39
+ }): Promise<{
40
+ count: number;
41
+ }>;
42
+ groupBy(args: {
43
+ by: string[];
44
+ where?: object;
45
+ _count?: object;
46
+ }): Promise<unknown[]>;
47
+ aggregate(args: {
48
+ where?: object;
49
+ _min?: object;
50
+ _max?: object;
51
+ }): Promise<{
52
+ _min: {
53
+ updatedAt: Date | null;
54
+ };
55
+ _max: {
56
+ updatedAt: Date | null;
57
+ };
58
+ }>;
59
+ };
60
+ $connect(): Promise<void>;
61
+ $disconnect(): Promise<void>;
62
+ }
63
+ import { MemoryItem } from '../../types/memory-item.types';
64
+ import { MemoryQuery, MemoryStats, PruneOptions } from '../../types/store.types';
65
+ import { MemoryStore } from '../memory-store.interface';
66
+ export interface PrismaMemoryStoreOptions {
67
+ /** Prisma client (with memory schema applied). */
68
+ prisma: MemoryPrismaClient;
69
+ }
70
+ /**
71
+ * PostgreSQL-backed memory store using Prisma (same pattern as @hazeljs/flow).
72
+ * Run migrations with: pnpm prisma migrate dev (from packages/memory).
73
+ */
74
+ export declare class PrismaMemoryStore implements MemoryStore {
75
+ private readonly prisma;
76
+ constructor(prisma: MemoryPrismaClient);
77
+ initialize(): Promise<void>;
78
+ save(item: MemoryItem): Promise<string>;
79
+ saveBatch(items: MemoryItem[]): Promise<string[]>;
80
+ get(id: string): Promise<MemoryItem | null>;
81
+ update(id: string, updates: Partial<MemoryItem>): Promise<void>;
82
+ delete(id: string): Promise<void>;
83
+ deleteBatch(ids: string[]): Promise<void>;
84
+ query(options: MemoryQuery): Promise<MemoryItem[]>;
85
+ getStats(userId?: string): Promise<MemoryStats>;
86
+ prune(options?: PruneOptions): Promise<number>;
87
+ }
88
+ //# sourceMappingURL=prisma.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.store.d.ts","sourceRoot":"","sources":["../../../src/store/adapters/prisma.store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE;QACV,MAAM,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1F,UAAU,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,QAAQ,CAAC,IAAI,EAAE;YACb,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1D,UAAU,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,SAAS,CAAC,IAAI,EAAE;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,GAAG,OAAO,CAAC;YAAE,IAAI,EAAE;gBAAE,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;aAAE,CAAC;YAAC,IAAI,EAAE;gBAAE,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;aAAE,CAAA;SAAE,CAAC,CAAC;KACrF,CAAC;IACF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,OAAO,EAAE,UAAU,EAAgB,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,WAAW,wBAAwB;IACvC,kDAAkD;IAClD,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAyCD;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,kBAAkB;IAEjD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAiCvC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQjD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAa3C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB/D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,KAAK,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqC/C,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;CAkBrD"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ /**
3
+ * Prisma-backed memory store (PostgreSQL).
4
+ * Import from '@hazeljs/memory/prisma' when you want DB persistence with Prisma.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PrismaMemoryStore = void 0;
8
+ const category_types_1 = require("../../types/category.types");
9
+ function parseValue(raw) {
10
+ if (typeof raw === 'string')
11
+ return raw;
12
+ if (Array.isArray(raw))
13
+ return raw;
14
+ if (raw !== null && typeof raw === 'object')
15
+ return raw;
16
+ return raw;
17
+ }
18
+ function rowToItem(row) {
19
+ return {
20
+ id: row.id,
21
+ userId: row.userId,
22
+ category: row.category,
23
+ key: row.key,
24
+ value: parseValue(row.value),
25
+ confidence: row.confidence,
26
+ source: row.source,
27
+ evidence: Array.isArray(row.evidence) ? row.evidence : [],
28
+ createdAt: row.createdAt,
29
+ updatedAt: row.updatedAt,
30
+ expiresAt: row.expiresAt ?? undefined,
31
+ accessCount: row.accessCount,
32
+ sessionId: row.sessionId ?? undefined,
33
+ };
34
+ }
35
+ /**
36
+ * PostgreSQL-backed memory store using Prisma (same pattern as @hazeljs/flow).
37
+ * Run migrations with: pnpm prisma migrate dev (from packages/memory).
38
+ */
39
+ class PrismaMemoryStore {
40
+ constructor(prisma) {
41
+ this.prisma = prisma;
42
+ }
43
+ async initialize() {
44
+ await this.prisma.$connect();
45
+ }
46
+ async save(item) {
47
+ const valueJson = item.value;
48
+ const evidenceJson = item.evidence ?? [];
49
+ await this.prisma.memoryItem.upsert({
50
+ where: { id: item.id },
51
+ create: {
52
+ id: item.id,
53
+ userId: item.userId,
54
+ category: item.category,
55
+ key: item.key,
56
+ value: valueJson,
57
+ confidence: item.confidence,
58
+ source: item.source,
59
+ evidence: evidenceJson,
60
+ createdAt: item.createdAt,
61
+ updatedAt: item.updatedAt,
62
+ expiresAt: item.expiresAt ?? null,
63
+ accessCount: item.accessCount ?? 0,
64
+ sessionId: item.sessionId ?? null,
65
+ },
66
+ update: {
67
+ value: valueJson,
68
+ confidence: item.confidence,
69
+ evidence: evidenceJson,
70
+ updatedAt: item.updatedAt,
71
+ expiresAt: item.expiresAt ?? null,
72
+ accessCount: item.accessCount ?? 0,
73
+ },
74
+ });
75
+ return item.id;
76
+ }
77
+ async saveBatch(items) {
78
+ const ids = [];
79
+ for (const item of items) {
80
+ ids.push(await this.save(item));
81
+ }
82
+ return ids;
83
+ }
84
+ async get(id) {
85
+ const row = await this.prisma.memoryItem.findUnique({
86
+ where: { id },
87
+ });
88
+ if (!row)
89
+ return null;
90
+ const item = rowToItem(row);
91
+ if (item.expiresAt && item.expiresAt.getTime() < Date.now()) {
92
+ await this.delete(id);
93
+ return null;
94
+ }
95
+ return item;
96
+ }
97
+ async update(id, updates) {
98
+ const existing = await this.get(id);
99
+ if (!existing)
100
+ return;
101
+ const valueJson = updates.value ?? existing.value;
102
+ const evidenceJson = updates.evidence ?? existing.evidence;
103
+ await this.prisma.memoryItem.update({
104
+ where: { id },
105
+ data: {
106
+ value: valueJson,
107
+ confidence: updates.confidence ?? existing.confidence,
108
+ source: updates.source ?? existing.source,
109
+ evidence: evidenceJson,
110
+ updatedAt: new Date(),
111
+ expiresAt: updates.expiresAt !== undefined ? updates.expiresAt : existing.expiresAt,
112
+ accessCount: updates.accessCount ?? existing.accessCount,
113
+ },
114
+ });
115
+ }
116
+ async delete(id) {
117
+ await this.prisma.memoryItem.delete({ where: { id } }).catch(() => { });
118
+ }
119
+ async deleteBatch(ids) {
120
+ if (ids.length === 0)
121
+ return;
122
+ await this.prisma.memoryItem.deleteMany({ where: { id: { in: ids } } });
123
+ }
124
+ async query(options) {
125
+ const categories = options.category != null
126
+ ? Array.isArray(options.category)
127
+ ? options.category
128
+ : [options.category]
129
+ : Object.values(category_types_1.MemoryCategory);
130
+ const sources = options.source != null
131
+ ? Array.isArray(options.source)
132
+ ? options.source
133
+ : [options.source]
134
+ : null;
135
+ const where = {
136
+ userId: options.userId,
137
+ category: { in: categories },
138
+ };
139
+ if (sources)
140
+ where.source = { in: sources };
141
+ if (options.minConfidence != null)
142
+ where.confidence = { gte: options.minConfidence };
143
+ if (options.notExpired !== false) {
144
+ where.OR = [{ expiresAt: null }, { expiresAt: { gt: new Date() } }];
145
+ }
146
+ const orderBy = options.orderBy === 'createdAt' ? 'createdAt' : 'updatedAt';
147
+ const rows = await this.prisma.memoryItem.findMany({
148
+ where,
149
+ orderBy: { [orderBy]: options.order ?? 'desc' },
150
+ take: options.limit ?? 100,
151
+ skip: options.offset ?? 0,
152
+ });
153
+ return rows.map(rowToItem);
154
+ }
155
+ async getStats(userId) {
156
+ const byCategory = Object.values(category_types_1.MemoryCategory).reduce((acc, cat) => ({ ...acc, [cat]: 0 }), {});
157
+ const where = userId
158
+ ? {
159
+ userId,
160
+ OR: [{ expiresAt: null }, { expiresAt: { gt: new Date() } }],
161
+ }
162
+ : { OR: [{ expiresAt: null }, { expiresAt: { gt: new Date() } }] };
163
+ const groups = await this.prisma.memoryItem.groupBy({
164
+ by: ['category'],
165
+ where,
166
+ _count: { id: true },
167
+ });
168
+ for (const g of groups) {
169
+ if (g.category in byCategory)
170
+ byCategory[g.category] = g._count.id;
171
+ }
172
+ const agg = await this.prisma.memoryItem.aggregate({
173
+ where,
174
+ _min: { updatedAt: true },
175
+ _max: { updatedAt: true },
176
+ });
177
+ const total = Object.values(byCategory).reduce((s, n) => s + n, 0);
178
+ return {
179
+ total,
180
+ byCategory,
181
+ oldestMemory: agg._min.updatedAt,
182
+ newestMemory: agg._max.updatedAt,
183
+ };
184
+ }
185
+ async prune(options) {
186
+ const where = {
187
+ expiresAt: { lt: new Date() },
188
+ };
189
+ if (options?.userId)
190
+ where.userId = options.userId;
191
+ if (options?.category)
192
+ where.category = options.category;
193
+ if (options?.olderThan)
194
+ where.updatedAt = { lt: options.olderThan };
195
+ if (options?.minConfidence != null)
196
+ where.confidence = { lt: options.minConfidence };
197
+ const result = await this.prisma.memoryItem.deleteMany({ where });
198
+ return result.count;
199
+ }
200
+ }
201
+ exports.PrismaMemoryStore = PrismaMemoryStore;
202
+ //# sourceMappingURL=prisma.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.store.js","sourceRoot":"","sources":["../../../src/store/adapters/prisma.store.ts"],"names":[],"mappings":"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"}