@framers/agentos 0.2.12 → 0.3.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 (161) hide show
  1. package/dist/ingest-router/executors/EntityExtractor.d.ts +23 -0
  2. package/dist/ingest-router/executors/EntityExtractor.d.ts.map +1 -0
  3. package/dist/ingest-router/executors/EntityExtractor.js +69 -0
  4. package/dist/ingest-router/executors/EntityExtractor.js.map +1 -0
  5. package/dist/ingest-router/executors/EntityLinkingIngestExecutor.d.ts +46 -0
  6. package/dist/ingest-router/executors/EntityLinkingIngestExecutor.d.ts.map +1 -0
  7. package/dist/ingest-router/executors/EntityLinkingIngestExecutor.js +45 -0
  8. package/dist/ingest-router/executors/EntityLinkingIngestExecutor.js.map +1 -0
  9. package/dist/ingest-router/executors/entity-types.d.ts +55 -0
  10. package/dist/ingest-router/executors/entity-types.d.ts.map +1 -0
  11. package/dist/ingest-router/executors/entity-types.js +17 -0
  12. package/dist/ingest-router/executors/entity-types.js.map +1 -0
  13. package/dist/ingest-router/executors/index.d.ts +7 -0
  14. package/dist/ingest-router/executors/index.d.ts.map +1 -1
  15. package/dist/ingest-router/executors/index.js +6 -0
  16. package/dist/ingest-router/executors/index.js.map +1 -1
  17. package/dist/ingest-router/index.d.ts +2 -2
  18. package/dist/ingest-router/index.d.ts.map +1 -1
  19. package/dist/ingest-router/index.js +1 -1
  20. package/dist/ingest-router/index.js.map +1 -1
  21. package/dist/memory/AgentMemory.js +1 -1
  22. package/dist/memory/AgentMemory.js.map +1 -1
  23. package/dist/memory/CognitiveMemoryManager.js +4 -4
  24. package/dist/memory/CognitiveMemoryManager.js.map +1 -1
  25. package/dist/memory/archive/IMemoryArchive.d.ts +2 -2
  26. package/dist/memory/archive/SqlStorageMemoryArchive.d.ts +17 -13
  27. package/dist/memory/archive/SqlStorageMemoryArchive.d.ts.map +1 -1
  28. package/dist/memory/archive/SqlStorageMemoryArchive.js +36 -28
  29. package/dist/memory/archive/SqlStorageMemoryArchive.js.map +1 -1
  30. package/dist/memory/core/config.d.ts +4 -4
  31. package/dist/memory/core/config.d.ts.map +1 -1
  32. package/dist/memory/index.d.ts +3 -3
  33. package/dist/memory/index.d.ts.map +1 -1
  34. package/dist/memory/index.js +3 -3
  35. package/dist/memory/index.js.map +1 -1
  36. package/dist/memory/io/ChatGptImporter.d.ts +5 -5
  37. package/dist/memory/io/ChatGptImporter.d.ts.map +1 -1
  38. package/dist/memory/io/ChatGptImporter.js +9 -7
  39. package/dist/memory/io/ChatGptImporter.js.map +1 -1
  40. package/dist/memory/io/CsvImporter.d.ts +4 -4
  41. package/dist/memory/io/CsvImporter.d.ts.map +1 -1
  42. package/dist/memory/io/CsvImporter.js +11 -8
  43. package/dist/memory/io/CsvImporter.js.map +1 -1
  44. package/dist/memory/io/JsonExporter.d.ts +5 -5
  45. package/dist/memory/io/JsonExporter.d.ts.map +1 -1
  46. package/dist/memory/io/JsonExporter.js +13 -12
  47. package/dist/memory/io/JsonExporter.js.map +1 -1
  48. package/dist/memory/io/JsonImporter.d.ts +5 -5
  49. package/dist/memory/io/JsonImporter.d.ts.map +1 -1
  50. package/dist/memory/io/JsonImporter.js +50 -34
  51. package/dist/memory/io/JsonImporter.js.map +1 -1
  52. package/dist/memory/io/MarkdownExporter.d.ts +4 -4
  53. package/dist/memory/io/MarkdownExporter.d.ts.map +1 -1
  54. package/dist/memory/io/MarkdownExporter.js +1 -1
  55. package/dist/memory/io/MarkdownExporter.js.map +1 -1
  56. package/dist/memory/io/MarkdownImporter.d.ts +6 -6
  57. package/dist/memory/io/MarkdownImporter.d.ts.map +1 -1
  58. package/dist/memory/io/MarkdownImporter.js +8 -7
  59. package/dist/memory/io/MarkdownImporter.js.map +1 -1
  60. package/dist/memory/io/ObsidianImporter.d.ts +4 -4
  61. package/dist/memory/io/ObsidianImporter.d.ts.map +1 -1
  62. package/dist/memory/io/ObsidianImporter.js +15 -10
  63. package/dist/memory/io/ObsidianImporter.js.map +1 -1
  64. package/dist/memory/io/SqliteExporter.d.ts +5 -5
  65. package/dist/memory/io/SqliteExporter.d.ts.map +1 -1
  66. package/dist/memory/io/SqliteExporter.js +3 -3
  67. package/dist/memory/io/SqliteExporter.js.map +1 -1
  68. package/dist/memory/io/SqliteImporter.d.ts +4 -4
  69. package/dist/memory/io/SqliteImporter.d.ts.map +1 -1
  70. package/dist/memory/io/SqliteImporter.js +23 -16
  71. package/dist/memory/io/SqliteImporter.js.map +1 -1
  72. package/dist/memory/io/facade/Memory.d.ts +58 -10
  73. package/dist/memory/io/facade/Memory.d.ts.map +1 -1
  74. package/dist/memory/io/facade/Memory.js +124 -50
  75. package/dist/memory/io/facade/Memory.js.map +1 -1
  76. package/dist/memory/io/facade/types.d.ts +1 -1
  77. package/dist/memory/io/index.d.ts +2 -2
  78. package/dist/memory/io/index.js +2 -2
  79. package/dist/memory/io/tools/MemoryAddTool.d.ts +2 -2
  80. package/dist/memory/io/tools/MemoryAddTool.d.ts.map +1 -1
  81. package/dist/memory/io/tools/MemoryAddTool.js +2 -2
  82. package/dist/memory/io/tools/MemoryAddTool.js.map +1 -1
  83. package/dist/memory/io/tools/MemoryDeleteTool.d.ts +2 -2
  84. package/dist/memory/io/tools/MemoryDeleteTool.d.ts.map +1 -1
  85. package/dist/memory/io/tools/MemoryDeleteTool.js +1 -1
  86. package/dist/memory/io/tools/MemoryDeleteTool.js.map +1 -1
  87. package/dist/memory/io/tools/MemoryMergeTool.d.ts +2 -2
  88. package/dist/memory/io/tools/MemoryMergeTool.d.ts.map +1 -1
  89. package/dist/memory/io/tools/MemoryMergeTool.js +4 -3
  90. package/dist/memory/io/tools/MemoryMergeTool.js.map +1 -1
  91. package/dist/memory/io/tools/MemoryReflectTool.d.ts +2 -2
  92. package/dist/memory/io/tools/MemoryReflectTool.d.ts.map +1 -1
  93. package/dist/memory/io/tools/MemoryReflectTool.js.map +1 -1
  94. package/dist/memory/io/tools/MemorySearchTool.d.ts +2 -2
  95. package/dist/memory/io/tools/MemorySearchTool.d.ts.map +1 -1
  96. package/dist/memory/io/tools/MemorySearchTool.js.map +1 -1
  97. package/dist/memory/io/tools/MemoryUpdateTool.d.ts +2 -2
  98. package/dist/memory/io/tools/MemoryUpdateTool.d.ts.map +1 -1
  99. package/dist/memory/io/tools/MemoryUpdateTool.js +5 -4
  100. package/dist/memory/io/tools/MemoryUpdateTool.js.map +1 -1
  101. package/dist/memory/pipeline/consolidation/ConsolidationLoop.d.ts +3 -3
  102. package/dist/memory/pipeline/consolidation/ConsolidationLoop.d.ts.map +1 -1
  103. package/dist/memory/pipeline/consolidation/ConsolidationLoop.js +22 -17
  104. package/dist/memory/pipeline/consolidation/ConsolidationLoop.js.map +1 -1
  105. package/dist/memory/retrieval/feedback/RetrievalFeedbackSignal.d.ts +3 -3
  106. package/dist/memory/retrieval/feedback/RetrievalFeedbackSignal.d.ts.map +1 -1
  107. package/dist/memory/retrieval/feedback/RetrievalFeedbackSignal.js +15 -12
  108. package/dist/memory/retrieval/feedback/RetrievalFeedbackSignal.js.map +1 -1
  109. package/dist/memory/retrieval/graph/index.d.ts +0 -1
  110. package/dist/memory/retrieval/graph/index.d.ts.map +1 -1
  111. package/dist/memory/retrieval/graph/index.js +4 -1
  112. package/dist/memory/retrieval/graph/index.js.map +1 -1
  113. package/dist/memory/retrieval/store/{SqliteBrain.d.ts → Brain.d.ts} +111 -23
  114. package/dist/memory/retrieval/store/Brain.d.ts.map +1 -0
  115. package/dist/memory/retrieval/store/{SqliteBrain.js → Brain.js} +367 -76
  116. package/dist/memory/retrieval/store/Brain.js.map +1 -0
  117. package/dist/memory/retrieval/store/HnswSidecar.d.ts +1 -1
  118. package/dist/memory/retrieval/store/HnswSidecar.js +1 -1
  119. package/dist/memory/retrieval/store/MemoryStore.d.ts +6 -6
  120. package/dist/memory/retrieval/store/MemoryStore.d.ts.map +1 -1
  121. package/dist/memory/retrieval/store/MemoryStore.js +10 -9
  122. package/dist/memory/retrieval/store/MemoryStore.js.map +1 -1
  123. package/dist/memory/retrieval/store/{SqliteKnowledgeGraph.d.ts → SqlKnowledgeGraph.d.ts} +12 -12
  124. package/dist/memory/retrieval/store/SqlKnowledgeGraph.d.ts.map +1 -0
  125. package/dist/memory/retrieval/store/{SqliteKnowledgeGraph.js → SqlKnowledgeGraph.js} +83 -64
  126. package/dist/memory/retrieval/store/SqlKnowledgeGraph.js.map +1 -0
  127. package/dist/memory/retrieval/store/{SqliteMemoryGraph.d.ts → SqlMemoryGraph.d.ts} +11 -11
  128. package/dist/memory/retrieval/store/SqlMemoryGraph.d.ts.map +1 -0
  129. package/dist/memory/retrieval/store/{SqliteMemoryGraph.js → SqlMemoryGraph.js} +26 -24
  130. package/dist/memory/retrieval/store/SqlMemoryGraph.js.map +1 -0
  131. package/dist/memory/retrieval/store/migrations/v1-to-v2.d.ts +31 -0
  132. package/dist/memory/retrieval/store/migrations/v1-to-v2.d.ts.map +1 -0
  133. package/dist/memory/retrieval/store/migrations/v1-to-v2.js +423 -0
  134. package/dist/memory/retrieval/store/migrations/v1-to-v2.js.map +1 -0
  135. package/dist/memory-router/backends/EntityRetrievalRanker.d.ts +54 -0
  136. package/dist/memory-router/backends/EntityRetrievalRanker.d.ts.map +1 -0
  137. package/dist/memory-router/backends/EntityRetrievalRanker.js +39 -0
  138. package/dist/memory-router/backends/EntityRetrievalRanker.js.map +1 -0
  139. package/dist/memory-router/backends/index.d.ts +16 -0
  140. package/dist/memory-router/backends/index.d.ts.map +1 -0
  141. package/dist/memory-router/backends/index.js +16 -0
  142. package/dist/memory-router/backends/index.js.map +1 -0
  143. package/dist/memory-router/index.d.ts +2 -0
  144. package/dist/memory-router/index.d.ts.map +1 -1
  145. package/dist/memory-router/index.js +4 -0
  146. package/dist/memory-router/index.js.map +1 -1
  147. package/dist/rag/utils/vectorMath.d.ts +1 -1
  148. package/dist/rag/utils/vectorMath.js +1 -1
  149. package/dist/rag/vector-search/HnswIndexSidecar.d.ts +1 -1
  150. package/dist/rag/vector-search/HnswIndexSidecar.js +1 -1
  151. package/package.json +2 -2
  152. package/dist/memory/retrieval/graph/knowledge/SqliteKnowledgeGraph.d.ts +0 -10
  153. package/dist/memory/retrieval/graph/knowledge/SqliteKnowledgeGraph.d.ts.map +0 -1
  154. package/dist/memory/retrieval/graph/knowledge/SqliteKnowledgeGraph.js +0 -10
  155. package/dist/memory/retrieval/graph/knowledge/SqliteKnowledgeGraph.js.map +0 -1
  156. package/dist/memory/retrieval/store/SqliteBrain.d.ts.map +0 -1
  157. package/dist/memory/retrieval/store/SqliteBrain.js.map +0 -1
  158. package/dist/memory/retrieval/store/SqliteKnowledgeGraph.d.ts.map +0 -1
  159. package/dist/memory/retrieval/store/SqliteKnowledgeGraph.js.map +0 -1
  160. package/dist/memory/retrieval/store/SqliteMemoryGraph.d.ts.map +0 -1
  161. package/dist/memory/retrieval/store/SqliteMemoryGraph.js.map +0 -1
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Stores memory graph nodes in the `knowledge_nodes` table (type = 'memory_graph')
5
5
  * and memory association edges in the `knowledge_edges` table — both managed by
6
- * SqliteBrain. All node metadata is serialised into the `properties` JSON column.
6
+ * Brain. All node metadata is serialised into the `properties` JSON column.
7
7
  *
8
8
  * ## Algorithms
9
9
  *
@@ -28,7 +28,7 @@
28
28
  * The `centroidId` is chosen as the member with the highest total edge weight
29
29
  * (i.e. the most central node in the component's subgraph).
30
30
  *
31
- * @module memory/store/SqliteMemoryGraph
31
+ * @module memory/store/SqlMemoryGraph
32
32
  */
33
33
  import { sha256 } from '../../core/util/crossPlatformCrypto.js';
34
34
  // ---------------------------------------------------------------------------
@@ -53,7 +53,7 @@ const SA_DEFAULTS = {
53
53
  /** Node type discriminator stored in knowledge_nodes.type. */
54
54
  const NODE_TYPE = 'memory_graph';
55
55
  // ---------------------------------------------------------------------------
56
- // SqliteMemoryGraph
56
+ // SqlMemoryGraph
57
57
  // ---------------------------------------------------------------------------
58
58
  /**
59
59
  * SQLite-backed implementation of {@link IMemoryGraph}.
@@ -63,8 +63,8 @@ const NODE_TYPE = 'memory_graph';
63
63
  *
64
64
  * **Usage:**
65
65
  * ```ts
66
- * const brain = await SqliteBrain.open('/path/to/brain.sqlite');
67
- * const graph = new SqliteMemoryGraph(brain);
66
+ * const brain = await Brain.openSqlite('/path/to/brain.sqlite');
67
+ * const graph = new SqlMemoryGraph(brain);
68
68
  * await graph.initialize();
69
69
  *
70
70
  * await graph.addNode('mem-1', { type: 'episodic', scope: 'session', scopeId: 's1', strength: 1.0, createdAt: Date.now() });
@@ -73,14 +73,14 @@ const NODE_TYPE = 'memory_graph';
73
73
  * const activated = await graph.spreadingActivation(['mem-1']);
74
74
  * ```
75
75
  */
76
- export class SqliteMemoryGraph {
76
+ export class SqlMemoryGraph {
77
77
  // ---------------------------------------------------------------------------
78
78
  // Constructor
79
79
  // ---------------------------------------------------------------------------
80
80
  /**
81
- * @param brain - The shared SqliteBrain connection for this agent.
81
+ * @param brain - The shared Brain connection for this agent.
82
82
  * The `knowledge_nodes` and `knowledge_edges` tables must already exist
83
- * (SqliteBrain creates them in its constructor).
83
+ * (Brain creates them in its constructor).
84
84
  */
85
85
  constructor(brain) {
86
86
  this.brain = brain;
@@ -115,7 +115,7 @@ export class SqliteMemoryGraph {
115
115
  this._nodes.clear();
116
116
  this._edges.clear();
117
117
  // Load all memory graph nodes.
118
- const nodeRows = await this.brain.all(`SELECT id, properties FROM knowledge_nodes WHERE type = ?`, [NODE_TYPE]);
118
+ const nodeRows = await this.brain.all(`SELECT id, properties FROM knowledge_nodes WHERE brain_id = ? AND type = ?`, [this.brain.brainId, NODE_TYPE]);
119
119
  for (const row of nodeRows) {
120
120
  try {
121
121
  const meta = JSON.parse(row.properties);
@@ -132,10 +132,10 @@ export class SqliteMemoryGraph {
132
132
  // we can filter by the set of known types.
133
133
  const edgeRows = await this.brain.all(`SELECT id, source_id, target_id, type, weight, created_at
134
134
  FROM knowledge_edges
135
- WHERE type IN (
135
+ WHERE brain_id = ? AND type IN (
136
136
  'SHARED_ENTITY','TEMPORAL_SEQUENCE','SAME_TOPIC',
137
137
  'CONTRADICTS','SUPERSEDES','CAUSED_BY','CO_ACTIVATED','SCHEMA_INSTANCE'
138
- )`);
138
+ )`, [this.brain.brainId]);
139
139
  for (const row of edgeRows) {
140
140
  const key = `${row.source_id}:${row.target_id}`;
141
141
  this._edges.set(key, {
@@ -150,11 +150,11 @@ export class SqliteMemoryGraph {
150
150
  /**
151
151
  * Shut down the memory graph.
152
152
  *
153
- * Currently a no-op because SqliteBrain owns the DB connection lifetime.
153
+ * Currently a no-op because Brain owns the DB connection lifetime.
154
154
  * Provided for interface compliance and forward compatibility.
155
155
  */
156
156
  async shutdown() {
157
- // No-op: SqliteBrain owns the connection; callers must call brain.close().
157
+ // No-op: Brain owns the connection; callers must call brain.close().
158
158
  }
159
159
  // ---------------------------------------------------------------------------
160
160
  // Node operations
@@ -172,7 +172,8 @@ export class SqliteMemoryGraph {
172
172
  async addNode(memoryId, metadata) {
173
173
  const now = Date.now();
174
174
  const { dialect } = this.brain.features;
175
- await this.brain.run(dialect.insertOrReplace('knowledge_nodes', ['id', 'type', 'label', 'properties', 'confidence', 'source', 'created_at'], ['?', '?', '?', '?', '?', '?', '?'], 'id'), [
175
+ await this.brain.run(dialect.insertOrReplace('knowledge_nodes', ['brain_id', 'id', 'type', 'label', 'properties', 'confidence', 'source', 'created_at'], ['?', '?', '?', '?', '?', '?', '?', '?'], 'brain_id, id'), [
176
+ this.brain.brainId,
176
177
  memoryId,
177
178
  NODE_TYPE,
178
179
  memoryId,
@@ -201,13 +202,13 @@ export class SqliteMemoryGraph {
201
202
  }
202
203
  }
203
204
  if (toDelete.length > 0) {
204
- await this.brain.run(`DELETE FROM knowledge_edges WHERE source_id = ? OR target_id = ?`, [memoryId, memoryId]);
205
+ await this.brain.run(`DELETE FROM knowledge_edges WHERE brain_id = ? AND (source_id = ? OR target_id = ?)`, [this.brain.brainId, memoryId, memoryId]);
205
206
  for (const key of toDelete) {
206
207
  this._edges.delete(key);
207
208
  }
208
209
  }
209
210
  // Now delete the node itself.
210
- await this.brain.run(`DELETE FROM knowledge_nodes WHERE id = ? AND type = ?`, [memoryId, NODE_TYPE]);
211
+ await this.brain.run(`DELETE FROM knowledge_nodes WHERE brain_id = ? AND id = ? AND type = ?`, [this.brain.brainId, memoryId, NODE_TYPE]);
211
212
  this._nodes.delete(memoryId);
212
213
  }
213
214
  /**
@@ -238,7 +239,7 @@ export class SqliteMemoryGraph {
238
239
  const edgeId = await this._edgeId(edge.sourceId, edge.targetId);
239
240
  const key = `${edge.sourceId}:${edge.targetId}`;
240
241
  const { dialect } = this.brain.features;
241
- await this.brain.run(dialect.insertOrReplace('knowledge_edges', ['id', 'source_id', 'target_id', 'type', 'weight', 'bidirectional', 'metadata', 'created_at'], ['?', '?', '?', '?', '?', '0', "'{}'", '?'], 'id'), [edgeId, edge.sourceId, edge.targetId, edge.type, edge.weight, edge.createdAt]);
242
+ await this.brain.run(dialect.insertOrReplace('knowledge_edges', ['brain_id', 'id', 'source_id', 'target_id', 'type', 'weight', 'bidirectional', 'metadata', 'created_at'], ['?', '?', '?', '?', '?', '?', '0', "'{}'", '?'], 'brain_id, id'), [this.brain.brainId, edgeId, edge.sourceId, edge.targetId, edge.type, edge.weight, edge.createdAt]);
242
243
  this._edges.set(key, { ...edge });
243
244
  }
244
245
  /**
@@ -273,7 +274,7 @@ export class SqliteMemoryGraph {
273
274
  */
274
275
  async removeEdge(sourceId, targetId) {
275
276
  const edgeId = await this._edgeId(sourceId, targetId);
276
- await this.brain.run(`DELETE FROM knowledge_edges WHERE id = ?`, [edgeId]);
277
+ await this.brain.run(`DELETE FROM knowledge_edges WHERE brain_id = ? AND id = ?`, [this.brain.brainId, edgeId]);
277
278
  this._edges.delete(`${sourceId}:${targetId}`);
278
279
  }
279
280
  // ---------------------------------------------------------------------------
@@ -427,7 +428,7 @@ export class SqliteMemoryGraph {
427
428
  existing.weight = newWeight;
428
429
  // Update SQLite row weight in-place.
429
430
  const edgeId = await this._edgeId(sourceId, targetId);
430
- await this.brain.run(`UPDATE knowledge_edges SET weight = ? WHERE id = ?`, [newWeight, edgeId]);
431
+ await this.brain.run(`UPDATE knowledge_edges SET weight = ? WHERE brain_id = ? AND id = ?`, [newWeight, this.brain.brainId, edgeId]);
431
432
  }
432
433
  else {
433
434
  // Create a new CO_ACTIVATED edge.
@@ -602,14 +603,15 @@ export class SqliteMemoryGraph {
602
603
  * administrative resets only.
603
604
  */
604
605
  async clear() {
606
+ const brainId = this.brain.brainId;
605
607
  // Delete all knowledge_edges whose type is a MemoryEdgeType value.
606
- await this.brain.exec(`DELETE FROM knowledge_edges
607
- WHERE type IN (
608
+ await this.brain.run(`DELETE FROM knowledge_edges
609
+ WHERE brain_id = ? AND type IN (
608
610
  'SHARED_ENTITY','TEMPORAL_SEQUENCE','SAME_TOPIC',
609
611
  'CONTRADICTS','SUPERSEDES','CAUSED_BY','CO_ACTIVATED','SCHEMA_INSTANCE'
610
- )`);
612
+ )`, [brainId]);
611
613
  // Delete all memory_graph nodes.
612
- await this.brain.run(`DELETE FROM knowledge_nodes WHERE type = ?`, [NODE_TYPE]);
614
+ await this.brain.run(`DELETE FROM knowledge_nodes WHERE brain_id = ? AND type = ?`, [brainId, NODE_TYPE]);
613
615
  this._nodes.clear();
614
616
  this._edges.clear();
615
617
  }
@@ -633,4 +635,4 @@ export class SqliteMemoryGraph {
633
635
  return hash.slice(0, 32);
634
636
  }
635
637
  }
636
- //# sourceMappingURL=SqliteMemoryGraph.js.map
638
+ //# sourceMappingURL=SqlMemoryGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqlMemoryGraph.js","sourceRoot":"","sources":["../../../../src/memory/retrieval/store/SqlMemoryGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @file v1-to-v2.ts
3
+ * @description Schema migration v1 -> v2: add `brain_id TEXT NOT NULL` column
4
+ * to all 14 brain-owned tables and recreate composite primary keys / indexes.
5
+ *
6
+ * SQLite does not support `ALTER TABLE ADD PRIMARY KEY`, so the migration uses
7
+ * the standard recreate-table dance: rename old to `<name>_v1`, create new
8
+ * with target schema, copy rows with the brain_id default, drop the old.
9
+ *
10
+ * Postgres uses simple ALTER statements (ADD COLUMN with default, DROP CONSTRAINT,
11
+ * ADD PRIMARY KEY) since it supports those operations natively.
12
+ *
13
+ * Idempotent: detects v2 schema and returns early without touching data.
14
+ *
15
+ * @module memory/retrieval/store/migrations/v1-to-v2
16
+ */
17
+ import type { StorageAdapter, StorageFeatures } from '@framers/sql-storage-adapter';
18
+ /**
19
+ * Run the v1 -> v2 migration on the given storage adapter.
20
+ *
21
+ * Idempotent: returns immediately when schema is already v2.
22
+ *
23
+ * @param adapter - The storage adapter to migrate.
24
+ * @param features - Platform-aware feature bundle (used for dialect-specific paths).
25
+ * @param brainId - The brain identifier to assign to all existing rows.
26
+ * @returns `{ migrated: true }` if migration ran, `{ migrated: false }` if no-op.
27
+ */
28
+ export declare function migrateV1ToV2(adapter: StorageAdapter, features: StorageFeatures, brainId: string): Promise<{
29
+ migrated: boolean;
30
+ }>;
31
+ //# sourceMappingURL=v1-to-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1-to-v2.d.ts","sourceRoot":"","sources":["../../../../../src/memory/retrieval/store/migrations/v1-to-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AA2SpF;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAqChC"}
@@ -0,0 +1,423 @@
1
+ /**
2
+ * @file v1-to-v2.ts
3
+ * @description Schema migration v1 -> v2: add `brain_id TEXT NOT NULL` column
4
+ * to all 14 brain-owned tables and recreate composite primary keys / indexes.
5
+ *
6
+ * SQLite does not support `ALTER TABLE ADD PRIMARY KEY`, so the migration uses
7
+ * the standard recreate-table dance: rename old to `<name>_v1`, create new
8
+ * with target schema, copy rows with the brain_id default, drop the old.
9
+ *
10
+ * Postgres uses simple ALTER statements (ADD COLUMN with default, DROP CONSTRAINT,
11
+ * ADD PRIMARY KEY) since it supports those operations natively.
12
+ *
13
+ * Idempotent: detects v2 schema and returns early without touching data.
14
+ *
15
+ * @module memory/retrieval/store/migrations/v1-to-v2
16
+ */
17
+ /**
18
+ * The 14 tables that gain `brain_id` in v2. Order matters for FK resolution:
19
+ * documents must exist before document_chunks; conversations before messages.
20
+ */
21
+ const V2_TABLES = [
22
+ {
23
+ name: 'brain_meta',
24
+ columnsDdl: 'brain_id TEXT NOT NULL, key TEXT NOT NULL, value TEXT NOT NULL',
25
+ primaryKey: ['brain_id', 'key'],
26
+ indexes: [],
27
+ },
28
+ {
29
+ name: 'memory_traces',
30
+ columnsDdl: `
31
+ brain_id TEXT NOT NULL,
32
+ id TEXT NOT NULL,
33
+ type TEXT NOT NULL,
34
+ scope TEXT NOT NULL,
35
+ content TEXT NOT NULL,
36
+ embedding BLOB,
37
+ strength REAL NOT NULL DEFAULT 1.0,
38
+ created_at INTEGER NOT NULL,
39
+ last_accessed INTEGER,
40
+ retrieval_count INTEGER NOT NULL DEFAULT 0,
41
+ tags TEXT NOT NULL DEFAULT '[]',
42
+ emotions TEXT NOT NULL DEFAULT '{}',
43
+ metadata TEXT NOT NULL DEFAULT '{}',
44
+ deleted INTEGER NOT NULL DEFAULT 0
45
+ `,
46
+ primaryKey: ['brain_id', 'id'],
47
+ indexes: [
48
+ `CREATE INDEX IF NOT EXISTS idx_memory_traces_brain_type
49
+ ON memory_traces (brain_id, type, created_at DESC)`,
50
+ `CREATE INDEX IF NOT EXISTS idx_memory_traces_brain_scope
51
+ ON memory_traces (brain_id, scope)`,
52
+ ],
53
+ },
54
+ {
55
+ name: 'knowledge_nodes',
56
+ columnsDdl: `
57
+ brain_id TEXT NOT NULL,
58
+ id TEXT NOT NULL,
59
+ type TEXT NOT NULL,
60
+ label TEXT NOT NULL,
61
+ properties TEXT NOT NULL DEFAULT '{}',
62
+ embedding BLOB,
63
+ confidence REAL NOT NULL DEFAULT 1.0,
64
+ source TEXT NOT NULL DEFAULT '{}',
65
+ created_at INTEGER NOT NULL
66
+ `,
67
+ primaryKey: ['brain_id', 'id'],
68
+ indexes: [
69
+ `CREATE INDEX IF NOT EXISTS idx_knowledge_nodes_brain_type
70
+ ON knowledge_nodes (brain_id, type)`,
71
+ ],
72
+ },
73
+ {
74
+ name: 'knowledge_edges',
75
+ columnsDdl: `
76
+ brain_id TEXT NOT NULL,
77
+ id TEXT NOT NULL,
78
+ source_id TEXT NOT NULL,
79
+ target_id TEXT NOT NULL,
80
+ type TEXT NOT NULL,
81
+ weight REAL NOT NULL DEFAULT 1.0,
82
+ bidirectional INTEGER NOT NULL DEFAULT 0,
83
+ metadata TEXT NOT NULL DEFAULT '{}',
84
+ created_at INTEGER NOT NULL
85
+ `,
86
+ primaryKey: ['brain_id', 'id'],
87
+ foreignKeys: [
88
+ 'FOREIGN KEY (brain_id, source_id) REFERENCES knowledge_nodes(brain_id, id)',
89
+ 'FOREIGN KEY (brain_id, target_id) REFERENCES knowledge_nodes(brain_id, id)',
90
+ ],
91
+ indexes: [
92
+ `CREATE INDEX IF NOT EXISTS idx_knowledge_edges_brain_source
93
+ ON knowledge_edges (brain_id, source_id)`,
94
+ `CREATE INDEX IF NOT EXISTS idx_knowledge_edges_brain_target
95
+ ON knowledge_edges (brain_id, target_id)`,
96
+ ],
97
+ },
98
+ {
99
+ name: 'documents',
100
+ columnsDdl: `
101
+ brain_id TEXT NOT NULL,
102
+ id TEXT NOT NULL,
103
+ path TEXT NOT NULL,
104
+ format TEXT NOT NULL,
105
+ title TEXT,
106
+ content_hash TEXT NOT NULL,
107
+ chunk_count INTEGER NOT NULL DEFAULT 0,
108
+ metadata TEXT NOT NULL DEFAULT '{}',
109
+ ingested_at INTEGER NOT NULL
110
+ `,
111
+ primaryKey: ['brain_id', 'id'],
112
+ indexes: [],
113
+ },
114
+ {
115
+ name: 'document_chunks',
116
+ columnsDdl: `
117
+ brain_id TEXT NOT NULL,
118
+ id TEXT NOT NULL,
119
+ document_id TEXT NOT NULL,
120
+ trace_id TEXT,
121
+ content TEXT NOT NULL,
122
+ chunk_index INTEGER NOT NULL,
123
+ page_number INTEGER,
124
+ embedding BLOB
125
+ `,
126
+ primaryKey: ['brain_id', 'id'],
127
+ foreignKeys: [
128
+ 'FOREIGN KEY (brain_id, document_id) REFERENCES documents(brain_id, id)',
129
+ 'FOREIGN KEY (brain_id, trace_id) REFERENCES memory_traces(brain_id, id)',
130
+ ],
131
+ indexes: [
132
+ `CREATE INDEX IF NOT EXISTS idx_document_chunks_brain_document
133
+ ON document_chunks (brain_id, document_id, chunk_index)`,
134
+ ],
135
+ },
136
+ {
137
+ name: 'document_images',
138
+ columnsDdl: `
139
+ brain_id TEXT NOT NULL,
140
+ id TEXT NOT NULL,
141
+ document_id TEXT NOT NULL,
142
+ chunk_id TEXT,
143
+ data BLOB NOT NULL,
144
+ mime_type TEXT NOT NULL,
145
+ caption TEXT,
146
+ page_number INTEGER,
147
+ embedding BLOB
148
+ `,
149
+ primaryKey: ['brain_id', 'id'],
150
+ foreignKeys: [
151
+ 'FOREIGN KEY (brain_id, document_id) REFERENCES documents(brain_id, id)',
152
+ 'FOREIGN KEY (brain_id, chunk_id) REFERENCES document_chunks(brain_id, id)',
153
+ ],
154
+ indexes: [],
155
+ },
156
+ {
157
+ name: 'consolidation_log',
158
+ columnsDdl: `
159
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
160
+ brain_id TEXT NOT NULL,
161
+ ran_at INTEGER NOT NULL,
162
+ pruned INTEGER NOT NULL DEFAULT 0,
163
+ merged INTEGER NOT NULL DEFAULT 0,
164
+ derived INTEGER NOT NULL DEFAULT 0,
165
+ compacted INTEGER NOT NULL DEFAULT 0,
166
+ duration_ms INTEGER NOT NULL DEFAULT 0
167
+ `,
168
+ primaryKey: [], // AUTOINCREMENT id is global; brain_id scopes via index
169
+ autoincrementId: true,
170
+ indexes: [
171
+ `CREATE INDEX IF NOT EXISTS idx_consolidation_log_brain_time
172
+ ON consolidation_log (brain_id, ran_at DESC)`,
173
+ ],
174
+ },
175
+ {
176
+ name: 'retrieval_feedback',
177
+ columnsDdl: `
178
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
179
+ brain_id TEXT NOT NULL,
180
+ trace_id TEXT NOT NULL,
181
+ signal TEXT NOT NULL,
182
+ query TEXT,
183
+ created_at INTEGER NOT NULL
184
+ `,
185
+ primaryKey: [],
186
+ autoincrementId: true,
187
+ foreignKeys: [
188
+ 'FOREIGN KEY (brain_id, trace_id) REFERENCES memory_traces(brain_id, id)',
189
+ ],
190
+ indexes: [
191
+ `CREATE INDEX IF NOT EXISTS idx_retrieval_feedback_brain_trace
192
+ ON retrieval_feedback (brain_id, trace_id, created_at DESC)`,
193
+ ],
194
+ },
195
+ {
196
+ name: 'conversations',
197
+ columnsDdl: `
198
+ brain_id TEXT NOT NULL,
199
+ id TEXT NOT NULL,
200
+ title TEXT,
201
+ created_at INTEGER NOT NULL,
202
+ updated_at INTEGER NOT NULL,
203
+ metadata TEXT NOT NULL DEFAULT '{}'
204
+ `,
205
+ primaryKey: ['brain_id', 'id'],
206
+ indexes: [],
207
+ },
208
+ {
209
+ name: 'messages',
210
+ columnsDdl: `
211
+ brain_id TEXT NOT NULL,
212
+ id TEXT NOT NULL,
213
+ conversation_id TEXT NOT NULL,
214
+ role TEXT NOT NULL,
215
+ content TEXT NOT NULL,
216
+ created_at INTEGER NOT NULL,
217
+ metadata TEXT NOT NULL DEFAULT '{}'
218
+ `,
219
+ primaryKey: ['brain_id', 'id'],
220
+ foreignKeys: [
221
+ 'FOREIGN KEY (brain_id, conversation_id) REFERENCES conversations(brain_id, id)',
222
+ ],
223
+ indexes: [
224
+ `CREATE INDEX IF NOT EXISTS idx_messages_brain_conversation
225
+ ON messages (brain_id, conversation_id, created_at)`,
226
+ ],
227
+ },
228
+ {
229
+ name: 'prospective_items',
230
+ columnsDdl: `
231
+ brain_id TEXT NOT NULL,
232
+ id TEXT NOT NULL,
233
+ content TEXT NOT NULL,
234
+ trigger_type TEXT NOT NULL,
235
+ trigger_at INTEGER,
236
+ trigger_event TEXT,
237
+ cue_text TEXT,
238
+ cue_embedding BLOB,
239
+ similarity_threshold REAL DEFAULT 0.7,
240
+ importance REAL NOT NULL DEFAULT 0.5,
241
+ triggered INTEGER NOT NULL DEFAULT 0,
242
+ recurring INTEGER NOT NULL DEFAULT 0,
243
+ source_trace_id TEXT,
244
+ created_at INTEGER NOT NULL
245
+ `,
246
+ primaryKey: ['brain_id', 'id'],
247
+ indexes: [],
248
+ },
249
+ {
250
+ name: 'archived_traces',
251
+ columnsDdl: `
252
+ brain_id TEXT NOT NULL,
253
+ trace_id TEXT NOT NULL,
254
+ agent_id TEXT NOT NULL,
255
+ verbatim_content TEXT NOT NULL,
256
+ content_hash TEXT NOT NULL,
257
+ trace_type TEXT NOT NULL,
258
+ emotional_context TEXT NOT NULL DEFAULT '{}',
259
+ entities TEXT NOT NULL DEFAULT '[]',
260
+ tags TEXT NOT NULL DEFAULT '[]',
261
+ created_at INTEGER NOT NULL,
262
+ archived_at INTEGER NOT NULL,
263
+ archive_reason TEXT NOT NULL,
264
+ byte_size INTEGER NOT NULL DEFAULT 0
265
+ `,
266
+ primaryKey: ['brain_id', 'trace_id'],
267
+ // Migration: copy existing agent_id column into brain_id (legacy archive
268
+ // already discriminated by agent_id, which is semantically the same).
269
+ brainIdSourceColumn: 'agent_id',
270
+ indexes: [
271
+ `CREATE INDEX IF NOT EXISTS idx_archived_traces_brain_time
272
+ ON archived_traces (brain_id, archived_at)`,
273
+ `CREATE INDEX IF NOT EXISTS idx_archived_traces_brain_reason
274
+ ON archived_traces (brain_id, archive_reason)`,
275
+ ],
276
+ },
277
+ {
278
+ name: 'archive_access_log',
279
+ columnsDdl: `
280
+ brain_id TEXT NOT NULL,
281
+ trace_id TEXT NOT NULL,
282
+ accessed_at INTEGER NOT NULL,
283
+ request_context TEXT
284
+ `,
285
+ primaryKey: ['brain_id', 'trace_id', 'accessed_at'],
286
+ indexes: [
287
+ `CREATE INDEX IF NOT EXISTS idx_archive_access_recency
288
+ ON archive_access_log (brain_id, trace_id, accessed_at DESC)`,
289
+ ],
290
+ },
291
+ ];
292
+ /**
293
+ * Run the v1 -> v2 migration on the given storage adapter.
294
+ *
295
+ * Idempotent: returns immediately when schema is already v2.
296
+ *
297
+ * @param adapter - The storage adapter to migrate.
298
+ * @param features - Platform-aware feature bundle (used for dialect-specific paths).
299
+ * @param brainId - The brain identifier to assign to all existing rows.
300
+ * @returns `{ migrated: true }` if migration ran, `{ migrated: false }` if no-op.
301
+ */
302
+ export async function migrateV1ToV2(adapter, features, brainId) {
303
+ const isPostgres = adapter.kind.includes('postgres');
304
+ // Detect v2 schema via brain_meta column existence.
305
+ // If brain_meta does not exist yet, this is a fresh database; no migration needed.
306
+ const brainMetaExists = isPostgres
307
+ ? await postgresTableExists(adapter, 'brain_meta')
308
+ : await sqliteTableExists(adapter, 'brain_meta');
309
+ if (!brainMetaExists) {
310
+ // Fresh database; the upcoming _initSchema() call creates v2 directly.
311
+ return { migrated: false };
312
+ }
313
+ const hasBrainId = isPostgres
314
+ ? await postgresHasColumn(adapter, 'brain_meta', 'brain_id')
315
+ : await sqliteHasColumn(adapter, 'brain_meta', 'brain_id');
316
+ if (hasBrainId) {
317
+ return { migrated: false };
318
+ }
319
+ // Run migration. SQLite uses recreate-table dance; Postgres uses ALTER.
320
+ for (const table of V2_TABLES) {
321
+ const exists = isPostgres
322
+ ? await postgresTableExists(adapter, table.name)
323
+ : await sqliteTableExists(adapter, table.name);
324
+ if (!exists)
325
+ continue;
326
+ if (isPostgres) {
327
+ await migratePostgresTable(adapter, table, brainId);
328
+ }
329
+ else {
330
+ await migrateSqliteTable(adapter, table, brainId);
331
+ }
332
+ }
333
+ return { migrated: true };
334
+ }
335
+ async function sqliteTableExists(adapter, table) {
336
+ const row = await adapter.get(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`, [table]);
337
+ return Boolean(row);
338
+ }
339
+ async function postgresTableExists(adapter, table) {
340
+ const row = await adapter.get(`SELECT EXISTS (
341
+ SELECT 1 FROM information_schema.tables
342
+ WHERE table_schema = current_schema() AND table_name = $1
343
+ ) AS exists`, [table]);
344
+ return row?.exists ?? false;
345
+ }
346
+ async function sqliteHasColumn(adapter, table, column) {
347
+ const rows = await adapter.all(`PRAGMA table_info(${table})`);
348
+ return rows.some((r) => r.name === column);
349
+ }
350
+ async function postgresHasColumn(adapter, table, column) {
351
+ const row = await adapter.get(`SELECT EXISTS (
352
+ SELECT 1 FROM information_schema.columns
353
+ WHERE table_name = $1 AND column_name = $2
354
+ ) AS exists`, [table, column]);
355
+ return row?.exists ?? false;
356
+ }
357
+ /**
358
+ * SQLite recreate-table dance for a single table.
359
+ *
360
+ * 1. Read existing column names.
361
+ * 2. Rename table to `<name>_v1`.
362
+ * 3. Create new table with v2 schema.
363
+ * 4. Copy rows: for tables with `brainIdSourceColumn`, use that column;
364
+ * otherwise default to the supplied brainId.
365
+ * 5. Drop old table.
366
+ * 6. Apply indexes.
367
+ */
368
+ async function migrateSqliteTable(adapter, table, brainId) {
369
+ const oldColumns = (await adapter.all(`PRAGMA table_info(${table.name})`)).map((r) => r.name);
370
+ await adapter.exec(`ALTER TABLE ${table.name} RENAME TO ${table.name}_v1`);
371
+ const pkClause = table.primaryKey.length > 0 ? `, PRIMARY KEY (${table.primaryKey.join(', ')})` : '';
372
+ const fkClause = table.foreignKeys && table.foreignKeys.length > 0
373
+ ? ',\n ' + table.foreignKeys.join(',\n ')
374
+ : '';
375
+ await adapter.exec(`CREATE TABLE ${table.name} (
376
+ ${table.columnsDdl}${pkClause}${fkClause}
377
+ )`);
378
+ const oldColList = oldColumns.join(', ');
379
+ if (table.brainIdSourceColumn && oldColumns.includes(table.brainIdSourceColumn)) {
380
+ // Copy rows using the existing column as brain_id source.
381
+ await adapter.exec(`INSERT INTO ${table.name} (brain_id, ${oldColList})
382
+ SELECT ${table.brainIdSourceColumn}, ${oldColList} FROM ${table.name}_v1`);
383
+ }
384
+ else {
385
+ await adapter.run(`INSERT INTO ${table.name} (brain_id, ${oldColList})
386
+ SELECT ?, ${oldColList} FROM ${table.name}_v1`, [brainId]);
387
+ }
388
+ await adapter.exec(`DROP TABLE ${table.name}_v1`);
389
+ for (const idx of table.indexes) {
390
+ await adapter.exec(idx);
391
+ }
392
+ }
393
+ /**
394
+ * Postgres ALTER-based migration for a single table.
395
+ *
396
+ * 1. Add brain_id column with default = brainId (or copy from agent_id when present).
397
+ * 2. Drop existing primary key constraint.
398
+ * 3. Add composite primary key (or skip for AUTOINCREMENT tables).
399
+ * 4. Drop the default on brain_id (future INSERTs supply it explicitly).
400
+ * 5. Apply indexes.
401
+ */
402
+ async function migratePostgresTable(adapter, table, brainId) {
403
+ const escapedBrainId = brainId.replace(/'/g, "''");
404
+ if (table.brainIdSourceColumn) {
405
+ // Add nullable, then UPDATE from source column, then SET NOT NULL.
406
+ await adapter.exec(`ALTER TABLE ${table.name} ADD COLUMN brain_id TEXT`);
407
+ await adapter.exec(`UPDATE ${table.name} SET brain_id = ${table.brainIdSourceColumn}`);
408
+ await adapter.exec(`ALTER TABLE ${table.name} ALTER COLUMN brain_id SET NOT NULL`);
409
+ }
410
+ else {
411
+ await adapter.exec(`ALTER TABLE ${table.name} ADD COLUMN brain_id TEXT NOT NULL DEFAULT '${escapedBrainId}'`);
412
+ await adapter.exec(`ALTER TABLE ${table.name} ALTER COLUMN brain_id DROP DEFAULT`);
413
+ }
414
+ if (table.primaryKey.length > 0) {
415
+ // Drop existing PK (Postgres names it <table>_pkey by default).
416
+ await adapter.exec(`ALTER TABLE ${table.name} DROP CONSTRAINT IF EXISTS ${table.name}_pkey`);
417
+ await adapter.exec(`ALTER TABLE ${table.name} ADD PRIMARY KEY (${table.primaryKey.join(', ')})`);
418
+ }
419
+ for (const idx of table.indexes) {
420
+ await adapter.exec(idx);
421
+ }
422
+ }
423
+ //# sourceMappingURL=v1-to-v2.js.map