agentdb 3.0.0-alpha.11 → 3.0.0-alpha.13

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 (107) hide show
  1. package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts +54 -0
  2. package/dist/src/backends/graph/GraphDatabaseAdapter.d.ts.map +1 -1
  3. package/dist/src/backends/graph/GraphDatabaseAdapter.js +125 -0
  4. package/dist/src/backends/graph/GraphDatabaseAdapter.js.map +1 -1
  5. package/dist/src/cli/agentdb-cli.js +0 -0
  6. package/dist/src/controllers/ReflexionMemory.d.ts +50 -0
  7. package/dist/src/controllers/ReflexionMemory.d.ts.map +1 -1
  8. package/dist/src/controllers/ReflexionMemory.js +258 -0
  9. package/dist/src/controllers/ReflexionMemory.js.map +1 -1
  10. package/dist/src/controllers/index.d.ts +2 -0
  11. package/dist/src/controllers/index.d.ts.map +1 -1
  12. package/dist/src/controllers/index.js +2 -0
  13. package/dist/src/controllers/index.js.map +1 -1
  14. package/dist/src/controllers/prerequisites.d.ts +76 -0
  15. package/dist/src/controllers/prerequisites.d.ts.map +1 -0
  16. package/dist/src/controllers/prerequisites.js +235 -0
  17. package/dist/src/controllers/prerequisites.js.map +1 -0
  18. package/dist/src/db-fallback.d.ts.map +1 -1
  19. package/dist/src/db-fallback.js +55 -45
  20. package/dist/src/db-fallback.js.map +1 -1
  21. package/package.json +1 -1
  22. package/dist/schemas/frontier-schema.sql +0 -378
  23. package/dist/schemas/schema.sql +0 -382
  24. package/dist/src/backends/index.cjs +0 -6
  25. package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts +0 -93
  26. package/dist/src/backends/ruvector/GuardedVectorBackend.d.ts.map +0 -1
  27. package/dist/src/backends/ruvector/GuardedVectorBackend.js +0 -182
  28. package/dist/src/backends/ruvector/GuardedVectorBackend.js.map +0 -1
  29. package/dist/src/consensus/RaftConsensus.d.ts +0 -220
  30. package/dist/src/consensus/RaftConsensus.d.ts.map +0 -1
  31. package/dist/src/consensus/RaftConsensus.js +0 -762
  32. package/dist/src/consensus/RaftConsensus.js.map +0 -1
  33. package/dist/src/controllers/HierarchicalMemory.d.ts +0 -197
  34. package/dist/src/controllers/HierarchicalMemory.d.ts.map +0 -1
  35. package/dist/src/controllers/HierarchicalMemory.js +0 -519
  36. package/dist/src/controllers/HierarchicalMemory.js.map +0 -1
  37. package/dist/src/controllers/MemoryConsolidation.d.ts +0 -142
  38. package/dist/src/controllers/MemoryConsolidation.d.ts.map +0 -1
  39. package/dist/src/controllers/MemoryConsolidation.js +0 -479
  40. package/dist/src/controllers/MemoryConsolidation.js.map +0 -1
  41. package/dist/src/controllers/QUICConnection.d.ts +0 -122
  42. package/dist/src/controllers/QUICConnection.d.ts.map +0 -1
  43. package/dist/src/controllers/QUICConnection.js +0 -329
  44. package/dist/src/controllers/QUICConnection.js.map +0 -1
  45. package/dist/src/controllers/QUICConnectionPool.d.ts +0 -83
  46. package/dist/src/controllers/QUICConnectionPool.d.ts.map +0 -1
  47. package/dist/src/controllers/QUICConnectionPool.js +0 -256
  48. package/dist/src/controllers/QUICConnectionPool.js.map +0 -1
  49. package/dist/src/controllers/QUICStreamManager.d.ts +0 -114
  50. package/dist/src/controllers/QUICStreamManager.d.ts.map +0 -1
  51. package/dist/src/controllers/QUICStreamManager.js +0 -267
  52. package/dist/src/controllers/QUICStreamManager.js.map +0 -1
  53. package/dist/src/controllers/StreamingEmbeddingService.d.ts +0 -82
  54. package/dist/src/controllers/StreamingEmbeddingService.d.ts.map +0 -1
  55. package/dist/src/controllers/StreamingEmbeddingService.js +0 -243
  56. package/dist/src/controllers/StreamingEmbeddingService.js.map +0 -1
  57. package/dist/src/controllers/index.cjs +0 -6
  58. package/dist/src/coordination/MultiDatabaseCoordinator.d.ts +0 -348
  59. package/dist/src/coordination/MultiDatabaseCoordinator.d.ts.map +0 -1
  60. package/dist/src/coordination/MultiDatabaseCoordinator.js +0 -803
  61. package/dist/src/coordination/MultiDatabaseCoordinator.js.map +0 -1
  62. package/dist/src/coordination/index.d.ts +0 -10
  63. package/dist/src/coordination/index.d.ts.map +0 -1
  64. package/dist/src/coordination/index.js +0 -10
  65. package/dist/src/coordination/index.js.map +0 -1
  66. package/dist/src/index.cjs +0 -6
  67. package/dist/src/optimizations/RVFOptimizer.d.ts +0 -226
  68. package/dist/src/optimizations/RVFOptimizer.d.ts.map +0 -1
  69. package/dist/src/optimizations/RVFOptimizer.js +0 -541
  70. package/dist/src/optimizations/RVFOptimizer.js.map +0 -1
  71. package/dist/src/security/AttestationLog.d.ts +0 -70
  72. package/dist/src/security/AttestationLog.d.ts.map +0 -1
  73. package/dist/src/security/AttestationLog.js +0 -174
  74. package/dist/src/security/AttestationLog.js.map +0 -1
  75. package/dist/src/security/MutationGuard.d.ts +0 -83
  76. package/dist/src/security/MutationGuard.d.ts.map +0 -1
  77. package/dist/src/security/MutationGuard.js +0 -364
  78. package/dist/src/security/MutationGuard.js.map +0 -1
  79. package/dist/src/security/index.cjs +0 -6
  80. package/dist/src/security/index.d.ts +0 -15
  81. package/dist/src/security/index.d.ts.map +0 -1
  82. package/dist/src/security/index.js +0 -18
  83. package/dist/src/security/index.js.map +0 -1
  84. package/dist/src/services/GNNService.d.ts +0 -173
  85. package/dist/src/services/GNNService.d.ts.map +0 -1
  86. package/dist/src/services/GNNService.js +0 -639
  87. package/dist/src/services/GNNService.js.map +0 -1
  88. package/dist/src/services/GraphTransformerService.d.ts +0 -80
  89. package/dist/src/services/GraphTransformerService.d.ts.map +0 -1
  90. package/dist/src/services/GraphTransformerService.js +0 -369
  91. package/dist/src/services/GraphTransformerService.js.map +0 -1
  92. package/dist/src/services/SemanticRouter.d.ts +0 -83
  93. package/dist/src/services/SemanticRouter.d.ts.map +0 -1
  94. package/dist/src/services/SemanticRouter.js +0 -160
  95. package/dist/src/services/SemanticRouter.js.map +0 -1
  96. package/dist/src/services/SonaTrajectoryService.d.ts +0 -224
  97. package/dist/src/services/SonaTrajectoryService.d.ts.map +0 -1
  98. package/dist/src/services/SonaTrajectoryService.js +0 -539
  99. package/dist/src/services/SonaTrajectoryService.js.map +0 -1
  100. package/dist/src/utils/LegacyAttentionAdapter.d.ts +0 -93
  101. package/dist/src/utils/LegacyAttentionAdapter.d.ts.map +0 -1
  102. package/dist/src/utils/LegacyAttentionAdapter.js +0 -241
  103. package/dist/src/utils/LegacyAttentionAdapter.js.map +0 -1
  104. package/dist/src/utils/vector-math.d.ts +0 -29
  105. package/dist/src/utils/vector-math.d.ts.map +0 -1
  106. package/dist/src/utils/vector-math.js +0 -66
  107. package/dist/src/utils/vector-math.js.map +0 -1
@@ -122,6 +122,60 @@ export declare class GraphDatabaseAdapter {
122
122
  * Generic createEdge method for graph traversal scenarios
123
123
  */
124
124
  createEdge(edge: JsEdge): Promise<void>;
125
+ /**
126
+ * Delete a node by id. With `cascade: true` (default) all incident edges
127
+ * are removed in the same transaction (`DETACH DELETE`); with
128
+ * `cascade: false` the call refuses when incident edges exist (matching
129
+ * the spec from RuVector#427).
130
+ *
131
+ * @returns `deletedNode`: whether the node existed and was removed.
132
+ * `deletedEdges`: count of incident edges removed (only meaningful
133
+ * when `cascade: true`).
134
+ */
135
+ deleteNode(id: string, opts?: {
136
+ cascade?: boolean;
137
+ }): Promise<{
138
+ deletedNode: boolean;
139
+ deletedEdges: number;
140
+ }>;
141
+ /**
142
+ * Delete a single edge by id. Endpoints stay intact.
143
+ */
144
+ deleteEdge(id: string): Promise<{
145
+ deleted: boolean;
146
+ }>;
147
+ /**
148
+ * Delete a hyperedge by id. Member nodes stay intact.
149
+ *
150
+ * Hyperedges are stored as relationship-like entities in RuVector's graph;
151
+ * we use the same Cypher pattern as `deleteEdge` but match `:HYPEREDGE`
152
+ * to disambiguate when the storage represents both as relationships.
153
+ */
154
+ deleteHyperedge(id: string): Promise<{
155
+ deleted: boolean;
156
+ }>;
157
+ /**
158
+ * Delete every edge between two endpoints, optionally filtered by label.
159
+ * Saves callers the cost of materialising edge ids first when they want to
160
+ * scrub a `(source, target [, label])` tuple wholesale.
161
+ */
162
+ deleteEdgesByEndpoints(from: string, to: string, label?: string): Promise<{
163
+ deleted: number;
164
+ }>;
165
+ /**
166
+ * Cypher escaping for ids/strings. We single-quote the value, so any
167
+ * embedded single quote needs doubling, and backslashes are escaped to
168
+ * keep the binding's parser happy.
169
+ */
170
+ private escapeId;
171
+ private escapeLabel;
172
+ /**
173
+ * Pull the first numeric value of column `col` out of a JsQueryResult.
174
+ * Different binding versions package row data slightly differently
175
+ * (`rows`, `nodes`, `edges`, `data`); this is the lowest-common-denominator
176
+ * extractor.
177
+ */
178
+ private firstNumeric;
125
179
  /**
126
180
  * Get graph statistics
127
181
  */
@@ -1 +1 @@
1
- {"version":3,"file":"GraphDatabaseAdapter.d.ts","sourceRoot":"","sources":["../../../../src/backends/graph/GraphDatabaseAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GraphDatabaseAdapter.d.ts","sourceRoot":"","sources":["../../../../src/backends/graph/GraphDatabaseAdapter.ts"],"names":[],"mappings":"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"}
@@ -183,6 +183,131 @@ export class GraphDatabaseAdapter {
183
183
  async createEdge(edge) {
184
184
  await this.db.createEdge(edge);
185
185
  }
186
+ // ==========================================================================
187
+ // Delete API (issue #150 — closes the gap from ruflo#1784 / RuVector#427)
188
+ //
189
+ // The native @ruvector/graph-node binding (currently 2.0.4) doesn't expose
190
+ // direct deleteNode / deleteEdge / deleteHyperedge methods, but `query()`
191
+ // accepts arbitrary Cypher. We implement deletes by routing through Cypher
192
+ // so downstream consumers (ruflo's adr-index, agent decommissioning, etc.)
193
+ // can keep the graph in sync with external sources of truth without
194
+ // rebuilding the whole database.
195
+ // ==========================================================================
196
+ /**
197
+ * Delete a node by id. With `cascade: true` (default) all incident edges
198
+ * are removed in the same transaction (`DETACH DELETE`); with
199
+ * `cascade: false` the call refuses when incident edges exist (matching
200
+ * the spec from RuVector#427).
201
+ *
202
+ * @returns `deletedNode`: whether the node existed and was removed.
203
+ * `deletedEdges`: count of incident edges removed (only meaningful
204
+ * when `cascade: true`).
205
+ */
206
+ async deleteNode(id, opts = {}) {
207
+ const cascade = opts.cascade !== false;
208
+ const escaped = this.escapeId(id);
209
+ // Count incident edges before delete so we can return an accurate count
210
+ // regardless of whether the binding's stats include it.
211
+ const before = await this.db.query(`MATCH ({id: '${escaped}'})-[r]-() RETURN count(r) AS edgeCount`);
212
+ const edgeCount = this.firstNumeric(before, 'edgeCount') ?? 0;
213
+ if (!cascade && edgeCount > 0) {
214
+ throw new Error(`deleteNode('${id}', { cascade: false }): node has ${edgeCount} incident edge(s); ` +
215
+ `pass cascade: true to remove them in the same transaction.`);
216
+ }
217
+ const cypher = cascade
218
+ ? `MATCH (n {id: '${escaped}'}) DETACH DELETE n RETURN count(n) AS deleted`
219
+ : `MATCH (n {id: '${escaped}'}) DELETE n RETURN count(n) AS deleted`;
220
+ const result = await this.db.query(cypher);
221
+ const deletedNode = (this.firstNumeric(result, 'deleted') ?? 0) > 0;
222
+ return { deletedNode, deletedEdges: cascade ? edgeCount : 0 };
223
+ }
224
+ /**
225
+ * Delete a single edge by id. Endpoints stay intact.
226
+ */
227
+ async deleteEdge(id) {
228
+ const escaped = this.escapeId(id);
229
+ const result = await this.db.query(`MATCH ()-[r {id: '${escaped}'}]-() DELETE r RETURN count(r) AS deleted`);
230
+ const deleted = (this.firstNumeric(result, 'deleted') ?? 0) > 0;
231
+ return { deleted };
232
+ }
233
+ /**
234
+ * Delete a hyperedge by id. Member nodes stay intact.
235
+ *
236
+ * Hyperedges are stored as relationship-like entities in RuVector's graph;
237
+ * we use the same Cypher pattern as `deleteEdge` but match `:HYPEREDGE`
238
+ * to disambiguate when the storage represents both as relationships.
239
+ */
240
+ async deleteHyperedge(id) {
241
+ const escaped = this.escapeId(id);
242
+ const result = await this.db.query(`MATCH ()-[r:HYPEREDGE {id: '${escaped}'}]-() DELETE r RETURN count(r) AS deleted`);
243
+ const deleted = (this.firstNumeric(result, 'deleted') ?? 0) > 0;
244
+ return { deleted };
245
+ }
246
+ /**
247
+ * Delete every edge between two endpoints, optionally filtered by label.
248
+ * Saves callers the cost of materialising edge ids first when they want to
249
+ * scrub a `(source, target [, label])` tuple wholesale.
250
+ */
251
+ async deleteEdgesByEndpoints(from, to, label) {
252
+ const f = this.escapeId(from);
253
+ const t = this.escapeId(to);
254
+ const labelClause = label ? `:${this.escapeLabel(label)}` : '';
255
+ const result = await this.db.query(`MATCH ({id: '${f}'})-[r${labelClause}]->({id: '${t}'}) DELETE r RETURN count(r) AS deleted`);
256
+ const deleted = this.firstNumeric(result, 'deleted') ?? 0;
257
+ return { deleted };
258
+ }
259
+ /**
260
+ * Cypher escaping for ids/strings. We single-quote the value, so any
261
+ * embedded single quote needs doubling, and backslashes are escaped to
262
+ * keep the binding's parser happy.
263
+ */
264
+ escapeId(value) {
265
+ return String(value).replace(/\\/g, '\\\\').replace(/'/g, "\\'");
266
+ }
267
+ escapeLabel(label) {
268
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(label)) {
269
+ throw new Error(`Invalid graph label: ${label}`);
270
+ }
271
+ return label;
272
+ }
273
+ /**
274
+ * Pull the first numeric value of column `col` out of a JsQueryResult.
275
+ * Different binding versions package row data slightly differently
276
+ * (`rows`, `nodes`, `edges`, `data`); this is the lowest-common-denominator
277
+ * extractor.
278
+ */
279
+ firstNumeric(result, col) {
280
+ if (!result)
281
+ return null;
282
+ const candidates = [];
283
+ if (Array.isArray(result.rows))
284
+ candidates.push(...result.rows);
285
+ if (Array.isArray(result.data))
286
+ candidates.push(...result.data);
287
+ if (Array.isArray(result.nodes))
288
+ candidates.push(...result.nodes);
289
+ if (Array.isArray(result.edges))
290
+ candidates.push(...result.edges);
291
+ if (Array.isArray(result))
292
+ candidates.push(...result);
293
+ for (const row of candidates) {
294
+ if (row == null)
295
+ continue;
296
+ if (typeof row === 'object' && col in row) {
297
+ const v = row[col];
298
+ const n = typeof v === 'string' ? Number(v) : v;
299
+ if (typeof n === 'number' && !Number.isNaN(n))
300
+ return n;
301
+ }
302
+ if (typeof row === 'object' && row.properties && col in row.properties) {
303
+ const v = row.properties[col];
304
+ const n = typeof v === 'string' ? Number(v) : v;
305
+ if (typeof n === 'number' && !Number.isNaN(n))
306
+ return n;
307
+ }
308
+ }
309
+ return null;
310
+ }
186
311
  /**
187
312
  * Get graph statistics
188
313
  */
@@ -1 +1 @@
1
- {"version":3,"file":"GraphDatabaseAdapter.js","sourceRoot":"","sources":["../../../../src/backends/graph/GraphDatabaseAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GraphDatabaseAdapter.js","sourceRoot":"","sources":["../../../../src/backends/graph/GraphDatabaseAdapter.ts"],"names":[],"mappings":"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"}
File without changes
@@ -52,6 +52,13 @@ export declare class ReflexionMemory {
52
52
  /**
53
53
  * Store a new episode with its critique and outcome
54
54
  * Invalidates relevant cache entries
55
+ *
56
+ * Persistence guarantee (issue #128 fix):
57
+ * storeEpisode() always writes to the SQLite `episodes` and
58
+ * `episode_embeddings` tables when a SQL-capable connection is present,
59
+ * even when a graph or vector backend handles the primary index. This
60
+ * ensures data survives process restarts (graph/vector backends are
61
+ * often in-memory or rebuildable from SQL).
55
62
  */
56
63
  storeEpisode(episode: Episode): Promise<number>;
57
64
  /**
@@ -193,5 +200,48 @@ export declare class ReflexionMemory {
193
200
  * Warm cache with common queries
194
201
  */
195
202
  warmCache(sessionId?: string): Promise<void>;
203
+ /**
204
+ * Delete an episode by id. Closes the gap from issue #150 (downstream:
205
+ * ruflo#1784, RuVector#427) — once an episode is written there was no
206
+ * first-class way to remove it through any backend.
207
+ *
208
+ * Strategy mirrors storeEpisode: when a graph backend is present we go
209
+ * through it (`graphAdapter.deleteNode` / `graphBackend.deleteNode` —
210
+ * both Cypher-backed under the hood), and we ALWAYS also purge the SQL
211
+ * `episodes` and `episode_embeddings` rows so durable storage stays in
212
+ * sync. Vector backend entries are removed too when present.
213
+ *
214
+ * @returns True if the episode existed in any backend and was removed.
215
+ */
216
+ deleteEpisode(id: number | string): Promise<boolean>;
217
+ /**
218
+ * Dual-write helper for issue #128.
219
+ *
220
+ * Inserts the given episode into the SQLite `episodes` and
221
+ * `episode_embeddings` tables when the underlying connection supports it.
222
+ * Used when a graph or vector backend handles the primary index but the
223
+ * caller still wants restart-safe persistence.
224
+ *
225
+ * Errors are swallowed and logged — the primary write to the graph/vector
226
+ * backend has already succeeded, and we don't want to fail the caller if
227
+ * SQL persistence is unavailable (e.g. read-only DB, schema not present).
228
+ */
229
+ private dualWriteEpisodeToSQL;
230
+ /**
231
+ * Rebuild the in-memory vector index from the SQLite `episodes` /
232
+ * `episode_embeddings` tables, going through the proper backend channels
233
+ * so `retrieveRelevant()` sees the data afterwards.
234
+ *
235
+ * Fixes the user's recovery use-case from issue #129: rather than calling
236
+ * `vectorBackend.getInner().insert()` directly (which bypasses the
237
+ * GuardedBackend wrapper and confuses retrieveRelevant), call this method
238
+ * to re-hydrate the vector and graph indices from durable storage.
239
+ *
240
+ * Returns the number of episodes re-indexed. No-ops cleanly when the SQL
241
+ * tables are empty or absent.
242
+ */
243
+ rebuildIndex(options?: {
244
+ fromTimestamp?: number;
245
+ }): Promise<number>;
196
246
  }
197
247
  //# sourceMappingURL=ReflexionMemory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReflexionMemory.d.ts","sourceRoot":"","sources":["../../../src/controllers/ReflexionMemory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ReflexionMemory.d.ts","sourceRoot":"","sources":["../../../src/controllers/ReflexionMemory.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,13 @@ export class ReflexionMemory {
28
28
  /**
29
29
  * Store a new episode with its critique and outcome
30
30
  * Invalidates relevant cache entries
31
+ *
32
+ * Persistence guarantee (issue #128 fix):
33
+ * storeEpisode() always writes to the SQLite `episodes` and
34
+ * `episode_embeddings` tables when a SQL-capable connection is present,
35
+ * even when a graph or vector backend handles the primary index. This
36
+ * ensures data survives process restarts (graph/vector backends are
37
+ * often in-memory or rebuildable from SQL).
31
38
  */
32
39
  async storeEpisode(episode) {
33
40
  // Invalidate episode caches on write
@@ -57,6 +64,9 @@ export class ReflexionMemory {
57
64
  const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
58
65
  // Register mapping for later use by CausalMemoryGraph
59
66
  NodeIdMapper.getInstance().register(numericId, nodeId);
67
+ // #128: dual-write to SQL for restart-safe persistence. Graph adapter
68
+ // index is typically in-memory; SQL is the durable record.
69
+ this.dualWriteEpisodeToSQL(episode, taskEmbedding);
60
70
  return numericId;
61
71
  }
62
72
  // Use generic GraphBackend if available
@@ -89,6 +99,8 @@ export class ReflexionMemory {
89
99
  const numericId = parseInt(nodeId.split('-').pop() || '0', 36);
90
100
  // Register mapping for later use by CausalMemoryGraph
91
101
  NodeIdMapper.getInstance().register(numericId, nodeId);
102
+ // #128: dual-write to SQL for restart-safe persistence.
103
+ this.dualWriteEpisodeToSQL(episode, taskEmbedding);
92
104
  return numericId;
93
105
  }
94
106
  // Fallback to SQLite (v1 compatibility)
@@ -812,5 +824,251 @@ export class ReflexionMemory {
812
824
  }
813
825
  });
814
826
  }
827
+ /**
828
+ * Delete an episode by id. Closes the gap from issue #150 (downstream:
829
+ * ruflo#1784, RuVector#427) — once an episode is written there was no
830
+ * first-class way to remove it through any backend.
831
+ *
832
+ * Strategy mirrors storeEpisode: when a graph backend is present we go
833
+ * through it (`graphAdapter.deleteNode` / `graphBackend.deleteNode` —
834
+ * both Cypher-backed under the hood), and we ALWAYS also purge the SQL
835
+ * `episodes` and `episode_embeddings` rows so durable storage stays in
836
+ * sync. Vector backend entries are removed too when present.
837
+ *
838
+ * @returns True if the episode existed in any backend and was removed.
839
+ */
840
+ async deleteEpisode(id) {
841
+ const numericId = typeof id === 'number' ? id : parseInt(String(id), 10);
842
+ const stringId = String(id);
843
+ // Invalidate caches up front — failures below shouldn't leave stale reads.
844
+ this.queryCache.invalidateCategory('episodes');
845
+ this.queryCache.invalidateCategory('task-stats');
846
+ let removed = false;
847
+ // 1. Graph adapter (AgentDB v2 fast path)
848
+ if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
849
+ const adapter = this.graphBackend;
850
+ if (typeof adapter.deleteNode === 'function') {
851
+ try {
852
+ // Adapter accepts either the canonical "episode-<id>" key or a raw
853
+ // id; try the canonical form first since that's what storeEpisode
854
+ // emits.
855
+ const r = await adapter.deleteNode(`episode-${numericId}`, { cascade: true });
856
+ if (r?.deletedNode)
857
+ removed = true;
858
+ if (!removed) {
859
+ const r2 = await adapter.deleteNode(stringId, { cascade: true });
860
+ if (r2?.deletedNode)
861
+ removed = true;
862
+ }
863
+ }
864
+ catch (err) {
865
+ const msg = err instanceof Error ? err.message : String(err);
866
+ // eslint-disable-next-line no-console
867
+ console.warn(`[ReflexionMemory] deleteEpisode: graph adapter delete failed: ${msg}`);
868
+ }
869
+ }
870
+ }
871
+ // 2. Generic graph backend
872
+ else if (this.graphBackend && typeof this.graphBackend.deleteNode === 'function') {
873
+ try {
874
+ const r = await this.graphBackend.deleteNode(stringId);
875
+ if (r === true)
876
+ removed = true;
877
+ }
878
+ catch (err) {
879
+ const msg = err instanceof Error ? err.message : String(err);
880
+ // eslint-disable-next-line no-console
881
+ console.warn(`[ReflexionMemory] deleteEpisode: graph backend delete failed: ${msg}`);
882
+ }
883
+ }
884
+ // 3. Vector backend (HNSW/RuVector); some implementations don't expose
885
+ // delete — guard with a feature check.
886
+ if (this.vectorBackend && typeof this.vectorBackend.delete === 'function') {
887
+ try {
888
+ const r = await this.vectorBackend.delete(String(numericId));
889
+ if (r === true)
890
+ removed = true;
891
+ }
892
+ catch (err) {
893
+ const msg = err instanceof Error ? err.message : String(err);
894
+ // eslint-disable-next-line no-console
895
+ console.warn(`[ReflexionMemory] deleteEpisode: vector backend delete failed: ${msg}`);
896
+ }
897
+ }
898
+ // 4. SQL durable storage — always attempt so persistence stays clean
899
+ // even when the primary backend was a no-op.
900
+ if (this.db && typeof this.db.prepare === 'function' && Number.isFinite(numericId)) {
901
+ try {
902
+ const embStmt = this.db.prepare(`DELETE FROM episode_embeddings WHERE episode_id = ?`);
903
+ embStmt.run(numericId);
904
+ const stmt = this.db.prepare(`DELETE FROM episodes WHERE id = ?`);
905
+ const r = stmt.run(numericId);
906
+ const changes = r?.changes ?? 0;
907
+ if (changes > 0)
908
+ removed = true;
909
+ }
910
+ catch (err) {
911
+ const msg = err instanceof Error ? err.message : String(err);
912
+ if (!/no such table/i.test(msg)) {
913
+ // eslint-disable-next-line no-console
914
+ console.warn(`[ReflexionMemory] deleteEpisode: SQL delete failed: ${msg}`);
915
+ }
916
+ }
917
+ }
918
+ return removed;
919
+ }
920
+ /**
921
+ * Dual-write helper for issue #128.
922
+ *
923
+ * Inserts the given episode into the SQLite `episodes` and
924
+ * `episode_embeddings` tables when the underlying connection supports it.
925
+ * Used when a graph or vector backend handles the primary index but the
926
+ * caller still wants restart-safe persistence.
927
+ *
928
+ * Errors are swallowed and logged — the primary write to the graph/vector
929
+ * backend has already succeeded, and we don't want to fail the caller if
930
+ * SQL persistence is unavailable (e.g. read-only DB, schema not present).
931
+ */
932
+ dualWriteEpisodeToSQL(episode, embedding) {
933
+ if (!this.db || typeof this.db.prepare !== 'function')
934
+ return;
935
+ try {
936
+ const stmt = this.db.prepare(`
937
+ INSERT INTO episodes (
938
+ session_id, task, input, output, critique, reward, success,
939
+ latency_ms, tokens_used, tags, metadata
940
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
941
+ `);
942
+ const tags = episode.tags ? JSON.stringify(episode.tags) : null;
943
+ const metadata = episode.metadata ? JSON.stringify(episode.metadata) : null;
944
+ const result = stmt.run(episode.sessionId, episode.task, episode.input ?? null, episode.output ?? null, episode.critique ?? null, episode.reward, episode.success ? 1 : 0, episode.latencyMs ?? null, episode.tokensUsed ?? null, tags, metadata);
945
+ if (embedding) {
946
+ const episodeId = normalizeRowId(result.lastInsertRowid);
947
+ this.storeEmbedding(episodeId, embedding);
948
+ }
949
+ }
950
+ catch (err) {
951
+ // The expected failure here is "no such table: episodes" on databases
952
+ // that intentionally don't carry the v1 schema. Don't escalate — the
953
+ // primary backend already has the data.
954
+ const msg = err instanceof Error ? err.message : String(err);
955
+ if (!/no such table/i.test(msg)) {
956
+ // eslint-disable-next-line no-console
957
+ console.warn('[ReflexionMemory] dualWriteEpisodeToSQL failed:', msg);
958
+ }
959
+ }
960
+ }
961
+ /**
962
+ * Rebuild the in-memory vector index from the SQLite `episodes` /
963
+ * `episode_embeddings` tables, going through the proper backend channels
964
+ * so `retrieveRelevant()` sees the data afterwards.
965
+ *
966
+ * Fixes the user's recovery use-case from issue #129: rather than calling
967
+ * `vectorBackend.getInner().insert()` directly (which bypasses the
968
+ * GuardedBackend wrapper and confuses retrieveRelevant), call this method
969
+ * to re-hydrate the vector and graph indices from durable storage.
970
+ *
971
+ * Returns the number of episodes re-indexed. No-ops cleanly when the SQL
972
+ * tables are empty or absent.
973
+ */
974
+ async rebuildIndex(options = {}) {
975
+ if (!this.db || typeof this.db.prepare !== 'function')
976
+ return 0;
977
+ const where = options.fromTimestamp !== undefined ? 'WHERE e.ts >= ?' : '';
978
+ const params = options.fromTimestamp !== undefined ? [options.fromTimestamp] : [];
979
+ let rows = [];
980
+ try {
981
+ const stmt = this.db.prepare(`
982
+ SELECT
983
+ e.id, e.ts, e.session_id, e.task, e.input, e.output, e.critique,
984
+ e.reward, e.success, e.latency_ms, e.tokens_used, e.tags, e.metadata,
985
+ ee.embedding
986
+ FROM episodes e
987
+ LEFT JOIN episode_embeddings ee ON ee.episode_id = e.id
988
+ ${where}
989
+ ORDER BY e.id ASC
990
+ `);
991
+ rows = stmt.all(...params);
992
+ }
993
+ catch (err) {
994
+ const msg = err instanceof Error ? err.message : String(err);
995
+ if (/no such table/i.test(msg))
996
+ return 0;
997
+ throw err;
998
+ }
999
+ let reindexed = 0;
1000
+ for (const row of rows) {
1001
+ const episode = {
1002
+ id: row.id,
1003
+ ts: row.ts,
1004
+ sessionId: row.session_id,
1005
+ task: row.task,
1006
+ input: row.input ?? undefined,
1007
+ output: row.output ?? undefined,
1008
+ critique: row.critique ?? undefined,
1009
+ reward: row.reward,
1010
+ success: row.success === 1,
1011
+ latencyMs: row.latency_ms ?? undefined,
1012
+ tokensUsed: row.tokens_used ?? undefined,
1013
+ tags: row.tags ? JSON.parse(row.tags) : undefined,
1014
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
1015
+ };
1016
+ // Prefer the stored embedding; fall back to recomputing if missing.
1017
+ let embedding;
1018
+ if (row.embedding) {
1019
+ const buf = row.embedding;
1020
+ embedding = new Float32Array(buf.buffer, buf.byteOffset, buf.length / 4);
1021
+ }
1022
+ else {
1023
+ embedding = await this.embedder.embed(this.buildEpisodeText(episode));
1024
+ }
1025
+ // Re-insert through the proper public APIs so the GuardedBackend
1026
+ // wrapper, graph adapter, and HNSW all stay in sync.
1027
+ if (this.vectorBackend) {
1028
+ try {
1029
+ this.vectorBackend.insert(String(row.id), embedding, {
1030
+ type: 'episode',
1031
+ sessionId: episode.sessionId,
1032
+ reward: episode.reward,
1033
+ success: episode.success,
1034
+ });
1035
+ }
1036
+ catch (err) {
1037
+ const msg = err instanceof Error ? err.message : String(err);
1038
+ // eslint-disable-next-line no-console
1039
+ console.warn(`[ReflexionMemory] rebuildIndex: vector insert failed for ${row.id}: ${msg}`);
1040
+ }
1041
+ }
1042
+ if (this.graphBackend && 'storeEpisode' in this.graphBackend) {
1043
+ const adapter = this.graphBackend;
1044
+ try {
1045
+ await adapter.storeEpisode({
1046
+ id: `episode-${row.id}`,
1047
+ sessionId: episode.sessionId,
1048
+ task: episode.task,
1049
+ reward: episode.reward,
1050
+ success: episode.success,
1051
+ input: episode.input,
1052
+ output: episode.output,
1053
+ critique: episode.critique,
1054
+ createdAt: (episode.ts ?? Date.now() / 1000) * 1000,
1055
+ tokensUsed: episode.tokensUsed,
1056
+ latencyMs: episode.latencyMs,
1057
+ }, embedding);
1058
+ }
1059
+ catch (err) {
1060
+ const msg = err instanceof Error ? err.message : String(err);
1061
+ // eslint-disable-next-line no-console
1062
+ console.warn(`[ReflexionMemory] rebuildIndex: graph store failed for ${row.id}: ${msg}`);
1063
+ }
1064
+ }
1065
+ reindexed++;
1066
+ }
1067
+ // Bust any stale read caches so the next retrieveRelevant sees the
1068
+ // freshly-rebuilt index.
1069
+ this.queryCache.invalidateCategory('episodes');
1070
+ this.queryCache.invalidateCategory('task-stats');
1071
+ return reindexed;
1072
+ }
815
1073
  }
816
1074
  //# sourceMappingURL=ReflexionMemory.js.map