@claude-flow/memory 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (253) hide show
  1. package/README.md +858 -249
  2. package/dist/agent-memory-scope.d.ts +131 -0
  3. package/dist/agent-memory-scope.d.ts.map +1 -0
  4. package/dist/agent-memory-scope.js +223 -0
  5. package/dist/agent-memory-scope.js.map +1 -0
  6. package/dist/agent-memory-scope.test.d.ts +8 -0
  7. package/dist/agent-memory-scope.test.d.ts.map +1 -0
  8. package/dist/agent-memory-scope.test.js +463 -0
  9. package/dist/agent-memory-scope.test.js.map +1 -0
  10. package/dist/agentdb-adapter.d.ts +82 -4
  11. package/dist/agentdb-adapter.d.ts.map +1 -1
  12. package/dist/agentdb-adapter.js +388 -17
  13. package/dist/agentdb-adapter.js.map +1 -1
  14. package/dist/agentdb-backend.d.ts +6 -0
  15. package/dist/agentdb-backend.d.ts.map +1 -1
  16. package/dist/agentdb-backend.js +115 -51
  17. package/dist/agentdb-backend.js.map +1 -1
  18. package/dist/auto-memory-bridge.d.ts +237 -0
  19. package/dist/auto-memory-bridge.d.ts.map +1 -0
  20. package/dist/auto-memory-bridge.js +758 -0
  21. package/dist/auto-memory-bridge.js.map +1 -0
  22. package/dist/auto-memory-bridge.test.d.ts +8 -0
  23. package/dist/auto-memory-bridge.test.d.ts.map +1 -0
  24. package/dist/auto-memory-bridge.test.js +849 -0
  25. package/dist/auto-memory-bridge.test.js.map +1 -0
  26. package/dist/benchmark.test.d.ts +2 -0
  27. package/dist/benchmark.test.d.ts.map +1 -0
  28. package/dist/benchmark.test.js +277 -0
  29. package/dist/benchmark.test.js.map +1 -0
  30. package/dist/consolidator.d.ts +96 -0
  31. package/dist/consolidator.d.ts.map +1 -0
  32. package/dist/consolidator.js +209 -0
  33. package/dist/consolidator.js.map +1 -0
  34. package/dist/consolidator.test.d.ts +17 -0
  35. package/dist/consolidator.test.d.ts.map +1 -0
  36. package/dist/consolidator.test.js +239 -0
  37. package/dist/consolidator.test.js.map +1 -0
  38. package/dist/controller-registry.d.ts +232 -0
  39. package/dist/controller-registry.d.ts.map +1 -0
  40. package/dist/controller-registry.js +1049 -0
  41. package/dist/controller-registry.js.map +1 -0
  42. package/dist/controller-registry.test.d.ts +14 -0
  43. package/dist/controller-registry.test.d.ts.map +1 -0
  44. package/dist/controller-registry.test.js +691 -0
  45. package/dist/controller-registry.test.js.map +1 -0
  46. package/dist/database-provider.d.ts +14 -2
  47. package/dist/database-provider.d.ts.map +1 -1
  48. package/dist/database-provider.js +63 -3
  49. package/dist/database-provider.js.map +1 -1
  50. package/dist/database-provider.test.js +56 -3
  51. package/dist/database-provider.test.js.map +1 -1
  52. package/dist/entity-tagger.d.ts +31 -0
  53. package/dist/entity-tagger.d.ts.map +1 -0
  54. package/dist/entity-tagger.js +80 -0
  55. package/dist/entity-tagger.js.map +1 -0
  56. package/dist/entity-tagger.test.d.ts +12 -0
  57. package/dist/entity-tagger.test.d.ts.map +1 -0
  58. package/dist/entity-tagger.test.js +70 -0
  59. package/dist/entity-tagger.test.js.map +1 -0
  60. package/dist/fts5.test.d.ts +13 -0
  61. package/dist/fts5.test.d.ts.map +1 -0
  62. package/dist/fts5.test.js +144 -0
  63. package/dist/fts5.test.js.map +1 -0
  64. package/dist/graceful-retrieval.test.d.ts +14 -0
  65. package/dist/graceful-retrieval.test.d.ts.map +1 -0
  66. package/dist/graceful-retrieval.test.js +192 -0
  67. package/dist/graceful-retrieval.test.js.map +1 -0
  68. package/dist/hnsw-index.d.ts +51 -0
  69. package/dist/hnsw-index.d.ts.map +1 -1
  70. package/dist/hnsw-index.js +396 -12
  71. package/dist/hnsw-index.js.map +1 -1
  72. package/dist/hnsw-persistence.test.d.ts +13 -0
  73. package/dist/hnsw-persistence.test.d.ts.map +1 -0
  74. package/dist/hnsw-persistence.test.js +208 -0
  75. package/dist/hnsw-persistence.test.js.map +1 -0
  76. package/dist/hybrid-backend.d.ts +28 -0
  77. package/dist/hybrid-backend.d.ts.map +1 -1
  78. package/dist/hybrid-backend.js +82 -4
  79. package/dist/hybrid-backend.js.map +1 -1
  80. package/dist/hybrid-backend.test.js +6 -5
  81. package/dist/hybrid-backend.test.js.map +1 -1
  82. package/dist/index.d.ts +167 -9
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +277 -30
  85. package/dist/index.js.map +1 -1
  86. package/dist/index.test.d.ts +10 -0
  87. package/dist/index.test.d.ts.map +1 -0
  88. package/dist/index.test.js +71 -0
  89. package/dist/index.test.js.map +1 -0
  90. package/dist/json-security.d.ts +12 -0
  91. package/dist/json-security.d.ts.map +1 -0
  92. package/dist/json-security.js +20 -0
  93. package/dist/json-security.js.map +1 -0
  94. package/dist/learning-bridge.d.ts +137 -0
  95. package/dist/learning-bridge.d.ts.map +1 -0
  96. package/dist/learning-bridge.js +335 -0
  97. package/dist/learning-bridge.js.map +1 -0
  98. package/dist/learning-bridge.test.d.ts +8 -0
  99. package/dist/learning-bridge.test.d.ts.map +1 -0
  100. package/dist/learning-bridge.test.js +578 -0
  101. package/dist/learning-bridge.test.js.map +1 -0
  102. package/dist/memory-graph.d.ts +100 -0
  103. package/dist/memory-graph.d.ts.map +1 -0
  104. package/dist/memory-graph.js +333 -0
  105. package/dist/memory-graph.js.map +1 -0
  106. package/dist/memory-graph.test.d.ts +8 -0
  107. package/dist/memory-graph.test.d.ts.map +1 -0
  108. package/dist/memory-graph.test.js +609 -0
  109. package/dist/memory-graph.test.js.map +1 -0
  110. package/dist/persistent-sona.d.ts +144 -0
  111. package/dist/persistent-sona.d.ts.map +1 -0
  112. package/dist/persistent-sona.js +332 -0
  113. package/dist/persistent-sona.js.map +1 -0
  114. package/dist/rvf-backend.d.ts +53 -0
  115. package/dist/rvf-backend.d.ts.map +1 -0
  116. package/dist/rvf-backend.js +643 -0
  117. package/dist/rvf-backend.js.map +1 -0
  118. package/dist/rvf-learning-store.d.ts +139 -0
  119. package/dist/rvf-learning-store.d.ts.map +1 -0
  120. package/dist/rvf-learning-store.js +295 -0
  121. package/dist/rvf-learning-store.js.map +1 -0
  122. package/dist/rvf-migration.d.ts +45 -0
  123. package/dist/rvf-migration.d.ts.map +1 -0
  124. package/dist/rvf-migration.js +254 -0
  125. package/dist/rvf-migration.js.map +1 -0
  126. package/dist/smart-retrieval.d.ts +118 -0
  127. package/dist/smart-retrieval.d.ts.map +1 -0
  128. package/dist/smart-retrieval.js +322 -0
  129. package/dist/smart-retrieval.js.map +1 -0
  130. package/dist/smart-retrieval.test.d.ts +2 -0
  131. package/dist/smart-retrieval.test.d.ts.map +1 -0
  132. package/dist/smart-retrieval.test.js +238 -0
  133. package/dist/smart-retrieval.test.js.map +1 -0
  134. package/dist/sqlite-backend.d.ts +10 -0
  135. package/dist/sqlite-backend.d.ts.map +1 -1
  136. package/dist/sqlite-backend.js +170 -74
  137. package/dist/sqlite-backend.js.map +1 -1
  138. package/dist/sqljs-backend.d.ts +9 -0
  139. package/dist/sqljs-backend.d.ts.map +1 -1
  140. package/dist/sqljs-backend.js +120 -29
  141. package/dist/sqljs-backend.js.map +1 -1
  142. package/dist/types.d.ts +3 -0
  143. package/dist/types.d.ts.map +1 -1
  144. package/package.json +48 -35
  145. package/.agentic-flow/intelligence.json +0 -16
  146. package/__tests__/coverage/base.css +0 -224
  147. package/__tests__/coverage/block-navigation.js +0 -87
  148. package/__tests__/coverage/coverage-final.json +0 -19
  149. package/__tests__/coverage/favicon.png +0 -0
  150. package/__tests__/coverage/index.html +0 -206
  151. package/__tests__/coverage/lcov-report/base.css +0 -224
  152. package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
  153. package/__tests__/coverage/lcov-report/favicon.png +0 -0
  154. package/__tests__/coverage/lcov-report/index.html +0 -206
  155. package/__tests__/coverage/lcov-report/prettify.css +0 -1
  156. package/__tests__/coverage/lcov-report/prettify.js +0 -2
  157. package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  158. package/__tests__/coverage/lcov-report/sorter.js +0 -210
  159. package/__tests__/coverage/lcov-report/src/agentdb-adapter.ts.html +0 -2737
  160. package/__tests__/coverage/lcov-report/src/agentdb-backend.ts.html +0 -3130
  161. package/__tests__/coverage/lcov-report/src/application/commands/delete-memory.command.ts.html +0 -601
  162. package/__tests__/coverage/lcov-report/src/application/commands/index.html +0 -131
  163. package/__tests__/coverage/lcov-report/src/application/commands/store-memory.command.ts.html +0 -394
  164. package/__tests__/coverage/lcov-report/src/application/queries/index.html +0 -116
  165. package/__tests__/coverage/lcov-report/src/application/queries/search-memory.query.ts.html +0 -796
  166. package/__tests__/coverage/lcov-report/src/application/services/index.html +0 -116
  167. package/__tests__/coverage/lcov-report/src/application/services/memory-application-service.ts.html +0 -793
  168. package/__tests__/coverage/lcov-report/src/cache-manager.ts.html +0 -1633
  169. package/__tests__/coverage/lcov-report/src/database-provider.ts.html +0 -1618
  170. package/__tests__/coverage/lcov-report/src/domain/entities/index.html +0 -116
  171. package/__tests__/coverage/lcov-report/src/domain/entities/memory-entry.ts.html +0 -952
  172. package/__tests__/coverage/lcov-report/src/domain/services/index.html +0 -116
  173. package/__tests__/coverage/lcov-report/src/domain/services/memory-domain-service.ts.html +0 -1294
  174. package/__tests__/coverage/lcov-report/src/hnsw-index.ts.html +0 -3124
  175. package/__tests__/coverage/lcov-report/src/hybrid-backend.ts.html +0 -2167
  176. package/__tests__/coverage/lcov-report/src/index.html +0 -266
  177. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  178. package/__tests__/coverage/lcov-report/src/infrastructure/repositories/index.html +0 -116
  179. package/__tests__/coverage/lcov-report/src/migration.ts.html +0 -2092
  180. package/__tests__/coverage/lcov-report/src/query-builder.ts.html +0 -1711
  181. package/__tests__/coverage/lcov-report/src/sqlite-backend.ts.html +0 -2281
  182. package/__tests__/coverage/lcov-report/src/sqljs-backend.ts.html +0 -2374
  183. package/__tests__/coverage/lcov-report/src/types.ts.html +0 -2266
  184. package/__tests__/coverage/lcov.info +0 -10238
  185. package/__tests__/coverage/prettify.css +0 -1
  186. package/__tests__/coverage/prettify.js +0 -2
  187. package/__tests__/coverage/sort-arrow-sprite.png +0 -0
  188. package/__tests__/coverage/sorter.js +0 -210
  189. package/__tests__/coverage/src/agentdb-adapter.ts.html +0 -2737
  190. package/__tests__/coverage/src/agentdb-backend.ts.html +0 -3130
  191. package/__tests__/coverage/src/application/commands/delete-memory.command.ts.html +0 -601
  192. package/__tests__/coverage/src/application/commands/index.html +0 -131
  193. package/__tests__/coverage/src/application/commands/store-memory.command.ts.html +0 -394
  194. package/__tests__/coverage/src/application/queries/index.html +0 -116
  195. package/__tests__/coverage/src/application/queries/search-memory.query.ts.html +0 -796
  196. package/__tests__/coverage/src/application/services/index.html +0 -116
  197. package/__tests__/coverage/src/application/services/memory-application-service.ts.html +0 -793
  198. package/__tests__/coverage/src/cache-manager.ts.html +0 -1633
  199. package/__tests__/coverage/src/database-provider.ts.html +0 -1618
  200. package/__tests__/coverage/src/domain/entities/index.html +0 -116
  201. package/__tests__/coverage/src/domain/entities/memory-entry.ts.html +0 -952
  202. package/__tests__/coverage/src/domain/services/index.html +0 -116
  203. package/__tests__/coverage/src/domain/services/memory-domain-service.ts.html +0 -1294
  204. package/__tests__/coverage/src/hnsw-index.ts.html +0 -3124
  205. package/__tests__/coverage/src/hybrid-backend.ts.html +0 -2167
  206. package/__tests__/coverage/src/index.html +0 -266
  207. package/__tests__/coverage/src/infrastructure/repositories/hybrid-memory-repository.ts.html +0 -1633
  208. package/__tests__/coverage/src/infrastructure/repositories/index.html +0 -116
  209. package/__tests__/coverage/src/migration.ts.html +0 -2092
  210. package/__tests__/coverage/src/query-builder.ts.html +0 -1711
  211. package/__tests__/coverage/src/sqlite-backend.ts.html +0 -2281
  212. package/__tests__/coverage/src/sqljs-backend.ts.html +0 -2374
  213. package/__tests__/coverage/src/types.ts.html +0 -2266
  214. package/benchmarks/cache-hit-rate.bench.ts +0 -535
  215. package/benchmarks/hnsw-indexing.bench.ts +0 -552
  216. package/benchmarks/memory-write.bench.ts +0 -469
  217. package/benchmarks/vector-search.bench.ts +0 -449
  218. package/docs/AGENTDB-INTEGRATION.md +0 -388
  219. package/docs/CROSS_PLATFORM.md +0 -505
  220. package/docs/WINDOWS_SUPPORT.md +0 -422
  221. package/examples/agentdb-example.ts +0 -345
  222. package/examples/cross-platform-usage.ts +0 -326
  223. package/framework/benchmark.ts +0 -112
  224. package/src/agentdb-adapter.ts +0 -884
  225. package/src/agentdb-backend.test.ts +0 -339
  226. package/src/agentdb-backend.ts +0 -1016
  227. package/src/application/commands/delete-memory.command.ts +0 -172
  228. package/src/application/commands/store-memory.command.ts +0 -103
  229. package/src/application/index.ts +0 -36
  230. package/src/application/queries/search-memory.query.ts +0 -237
  231. package/src/application/services/memory-application-service.ts +0 -236
  232. package/src/cache-manager.ts +0 -516
  233. package/src/database-provider.test.ts +0 -364
  234. package/src/database-provider.ts +0 -511
  235. package/src/domain/entities/memory-entry.ts +0 -289
  236. package/src/domain/index.ts +0 -35
  237. package/src/domain/repositories/memory-repository.interface.ts +0 -120
  238. package/src/domain/services/memory-domain-service.ts +0 -403
  239. package/src/hnsw-index.ts +0 -1013
  240. package/src/hybrid-backend.test.ts +0 -399
  241. package/src/hybrid-backend.ts +0 -694
  242. package/src/index.ts +0 -515
  243. package/src/infrastructure/index.ts +0 -23
  244. package/src/infrastructure/repositories/hybrid-memory-repository.ts +0 -516
  245. package/src/migration.ts +0 -669
  246. package/src/query-builder.ts +0 -542
  247. package/src/sqlite-backend.ts +0 -732
  248. package/src/sqljs-backend.ts +0 -763
  249. package/src/types.ts +0 -727
  250. package/tmp.json +0 -0
  251. package/tsconfig.json +0 -9
  252. package/tsconfig.tsbuildinfo +0 -1
  253. package/verify-cross-platform.ts +0 -170
@@ -1,403 +0,0 @@
1
- /**
2
- * Memory Domain Service - Domain Layer
3
- *
4
- * Contains domain logic that doesn't naturally fit within a single entity.
5
- * Coordinates between multiple memory entries and enforces domain rules.
6
- *
7
- * @module v3/memory/domain/services
8
- */
9
-
10
- import { MemoryEntry, MemoryType, MemoryEntryProps } from '../entities/memory-entry.js';
11
- import { IMemoryRepository, VectorSearchResult } from '../repositories/memory-repository.interface.js';
12
-
13
- /**
14
- * Memory consolidation strategy
15
- */
16
- export type ConsolidationStrategy = 'merge' | 'dedupe' | 'prune' | 'summarize';
17
-
18
- /**
19
- * Memory consolidation options
20
- */
21
- export interface ConsolidationOptions {
22
- strategy: ConsolidationStrategy;
23
- namespace?: string;
24
- threshold?: number;
25
- maxAge?: number; // Maximum age in milliseconds
26
- keepHot?: boolean; // Keep frequently accessed memories
27
- }
28
-
29
- /**
30
- * Consolidation result
31
- */
32
- export interface ConsolidationResult {
33
- processed: number;
34
- consolidated: number;
35
- removed: number;
36
- newEntries: MemoryEntry[];
37
- }
38
-
39
- /**
40
- * Memory deduplication result
41
- */
42
- export interface DeduplicationResult {
43
- duplicatesFound: number;
44
- duplicatesRemoved: number;
45
- groupsProcessed: number;
46
- }
47
-
48
- /**
49
- * Memory namespace statistics
50
- */
51
- export interface NamespaceAnalysis {
52
- namespace: string;
53
- totalEntries: number;
54
- activeEntries: number;
55
- totalSize: number;
56
- averageAccessCount: number;
57
- oldestEntry: Date;
58
- newestEntry: Date;
59
- typeDistribution: Record<MemoryType, number>;
60
- }
61
-
62
- /**
63
- * Memory Domain Service
64
- *
65
- * Provides domain-level operations that span multiple entities.
66
- * Implements business rules for memory management.
67
- */
68
- export class MemoryDomainService {
69
- constructor(private readonly repository: IMemoryRepository) {}
70
-
71
- /**
72
- * Store a new memory with automatic type detection
73
- */
74
- async storeWithTypeDetection(
75
- namespace: string,
76
- key: string,
77
- value: unknown,
78
- vector?: Float32Array
79
- ): Promise<MemoryEntry> {
80
- const type = this.detectMemoryType(value);
81
- const entry = MemoryEntry.create({
82
- namespace,
83
- key,
84
- value,
85
- type,
86
- vector,
87
- });
88
- await this.repository.save(entry);
89
- return entry;
90
- }
91
-
92
- /**
93
- * Retrieve and record access
94
- */
95
- async retrieveWithAccessTracking(
96
- namespace: string,
97
- key: string
98
- ): Promise<MemoryEntry | null> {
99
- const entry = await this.repository.findByKey(namespace, key);
100
- if (entry && entry.isAccessible()) {
101
- entry.recordAccess();
102
- await this.repository.save(entry);
103
- }
104
- return entry;
105
- }
106
-
107
- /**
108
- * Search for similar memories and record access
109
- */
110
- async searchSimilarWithTracking(
111
- vector: Float32Array,
112
- namespace?: string,
113
- limit: number = 10
114
- ): Promise<VectorSearchResult[]> {
115
- const results = await this.repository.searchByVector({
116
- vector,
117
- namespace,
118
- limit,
119
- });
120
-
121
- // Record access for all returned entries
122
- await Promise.all(
123
- results.map(async (result) => {
124
- result.entry.recordAccess();
125
- await this.repository.save(result.entry);
126
- })
127
- );
128
-
129
- return results;
130
- }
131
-
132
- /**
133
- * Consolidate memories based on strategy
134
- */
135
- async consolidate(options: ConsolidationOptions): Promise<ConsolidationResult> {
136
- const entries = await this.repository.findByNamespace(
137
- options.namespace ?? 'default',
138
- { status: 'active' }
139
- );
140
-
141
- let result: ConsolidationResult = {
142
- processed: entries.length,
143
- consolidated: 0,
144
- removed: 0,
145
- newEntries: [],
146
- };
147
-
148
- switch (options.strategy) {
149
- case 'prune':
150
- result = await this.pruneOldMemories(entries, options);
151
- break;
152
- case 'dedupe':
153
- const dedupeResult = await this.deduplicateMemories(entries, options);
154
- result.removed = dedupeResult.duplicatesRemoved;
155
- break;
156
- case 'merge':
157
- result = await this.mergeRelatedMemories(entries, options);
158
- break;
159
- default:
160
- // No-op for unknown strategies
161
- }
162
-
163
- return result;
164
- }
165
-
166
- /**
167
- * Detect memory type based on value structure
168
- */
169
- private detectMemoryType(value: unknown): MemoryType {
170
- if (typeof value === 'string') {
171
- // Long text is likely semantic
172
- if (value.length > 500) return 'semantic';
173
- // Short instructions are procedural
174
- if (value.includes('->') || value.includes('then')) return 'procedural';
175
- }
176
-
177
- if (typeof value === 'object' && value !== null) {
178
- const obj = value as Record<string, unknown>;
179
- // Objects with timestamps are episodic
180
- if ('timestamp' in obj || 'when' in obj || 'date' in obj) return 'episodic';
181
- // Objects with steps are procedural
182
- if ('steps' in obj || 'actions' in obj) return 'procedural';
183
- }
184
-
185
- // Default to working memory for short-term storage
186
- return 'working';
187
- }
188
-
189
- /**
190
- * Prune old, rarely accessed memories
191
- */
192
- private async pruneOldMemories(
193
- entries: MemoryEntry[],
194
- options: ConsolidationOptions
195
- ): Promise<ConsolidationResult> {
196
- const maxAge = options.maxAge ?? 7 * 24 * 60 * 60 * 1000; // 7 days default
197
- const threshold = options.threshold ?? 5; // Minimum access count to keep
198
- const now = Date.now();
199
- const toRemove: string[] = [];
200
-
201
- for (const entry of entries) {
202
- const age = now - entry.createdAt.getTime();
203
- const isOld = age > maxAge;
204
- const isRarelyAccessed = entry.accessCount < threshold;
205
-
206
- // Keep hot memories if requested
207
- if (options.keepHot && entry.isHot()) continue;
208
-
209
- if (isOld && isRarelyAccessed) {
210
- entry.archive();
211
- toRemove.push(entry.id);
212
- }
213
- }
214
-
215
- if (toRemove.length > 0) {
216
- await this.repository.deleteMany(toRemove);
217
- }
218
-
219
- return {
220
- processed: entries.length,
221
- consolidated: 0,
222
- removed: toRemove.length,
223
- newEntries: [],
224
- };
225
- }
226
-
227
- /**
228
- * Find and remove duplicate memories
229
- */
230
- private async deduplicateMemories(
231
- entries: MemoryEntry[],
232
- options: ConsolidationOptions
233
- ): Promise<DeduplicationResult> {
234
- const threshold = options.threshold ?? 0.95; // Similarity threshold
235
- const duplicates: string[] = [];
236
- const processed = new Set<string>();
237
-
238
- for (let i = 0; i < entries.length; i++) {
239
- if (processed.has(entries[i].id)) continue;
240
-
241
- const entry = entries[i];
242
- if (!entry.vector) continue;
243
-
244
- // Find similar entries
245
- const similar = await this.repository.searchByVector({
246
- vector: entry.vector,
247
- namespace: entry.namespace,
248
- limit: 10,
249
- threshold,
250
- });
251
-
252
- // Mark duplicates (keep the one with highest access count)
253
- const group = similar
254
- .filter((s) => s.entry.id !== entry.id && s.similarity >= threshold)
255
- .sort((a, b) => b.entry.accessCount - a.entry.accessCount);
256
-
257
- for (const dup of group.slice(1)) {
258
- duplicates.push(dup.entry.id);
259
- processed.add(dup.entry.id);
260
- }
261
-
262
- processed.add(entry.id);
263
- }
264
-
265
- if (duplicates.length > 0) {
266
- await this.repository.deleteMany(duplicates);
267
- }
268
-
269
- return {
270
- duplicatesFound: duplicates.length,
271
- duplicatesRemoved: duplicates.length,
272
- groupsProcessed: processed.size,
273
- };
274
- }
275
-
276
- /**
277
- * Merge related memories into consolidated entries
278
- */
279
- private async mergeRelatedMemories(
280
- entries: MemoryEntry[],
281
- options: ConsolidationOptions
282
- ): Promise<ConsolidationResult> {
283
- const threshold = options.threshold ?? 0.8;
284
- const newEntries: MemoryEntry[] = [];
285
- const toRemove: string[] = [];
286
- const processed = new Set<string>();
287
-
288
- for (const entry of entries) {
289
- if (processed.has(entry.id)) continue;
290
- if (!entry.vector) {
291
- processed.add(entry.id);
292
- continue;
293
- }
294
-
295
- // Find related entries
296
- const related = await this.repository.searchByVector({
297
- vector: entry.vector,
298
- namespace: entry.namespace,
299
- limit: 5,
300
- threshold,
301
- });
302
-
303
- if (related.length > 1) {
304
- // Merge related entries
305
- const merged = this.mergeEntries(related.map((r) => r.entry));
306
- newEntries.push(merged);
307
-
308
- for (const r of related) {
309
- toRemove.push(r.entry.id);
310
- processed.add(r.entry.id);
311
- }
312
- } else {
313
- processed.add(entry.id);
314
- }
315
- }
316
-
317
- // Remove old entries and save merged ones
318
- if (toRemove.length > 0) {
319
- await this.repository.deleteMany(toRemove);
320
- }
321
- if (newEntries.length > 0) {
322
- await this.repository.saveMany(newEntries);
323
- }
324
-
325
- return {
326
- processed: entries.length,
327
- consolidated: newEntries.length,
328
- removed: toRemove.length,
329
- newEntries,
330
- };
331
- }
332
-
333
- /**
334
- * Merge multiple entries into one
335
- */
336
- private mergeEntries(entries: MemoryEntry[]): MemoryEntry {
337
- // Sort by access count to prioritize most accessed
338
- const sorted = [...entries].sort((a, b) => b.accessCount - a.accessCount);
339
- const primary = sorted[0];
340
-
341
- // Combine metadata
342
- const combinedMetadata: Record<string, unknown> = {};
343
- for (const entry of entries) {
344
- Object.assign(combinedMetadata, entry.metadata);
345
- }
346
- combinedMetadata.mergedFrom = entries.map((e) => e.id);
347
- combinedMetadata.mergedAt = new Date().toISOString();
348
-
349
- // Create merged entry
350
- return MemoryEntry.create({
351
- namespace: primary.namespace,
352
- key: `merged_${Date.now()}`,
353
- value: {
354
- primary: primary.value,
355
- related: sorted.slice(1).map((e) => e.value),
356
- },
357
- type: primary.type,
358
- vector: primary.vector,
359
- metadata: combinedMetadata,
360
- accessCount: entries.reduce((sum, e) => sum + e.accessCount, 0),
361
- });
362
- }
363
-
364
- /**
365
- * Analyze a namespace
366
- */
367
- async analyzeNamespace(namespace: string): Promise<NamespaceAnalysis> {
368
- const entries = await this.repository.findByNamespace(namespace);
369
- const active = entries.filter((e) => e.status === 'active');
370
-
371
- const typeDistribution: Record<MemoryType, number> = {
372
- semantic: 0,
373
- episodic: 0,
374
- procedural: 0,
375
- working: 0,
376
- };
377
-
378
- let totalAccessCount = 0;
379
- let totalSize = 0;
380
- let oldestDate = new Date();
381
- let newestDate = new Date(0);
382
-
383
- for (const entry of entries) {
384
- typeDistribution[entry.type]++;
385
- totalAccessCount += entry.accessCount;
386
- totalSize += JSON.stringify(entry.value).length;
387
-
388
- if (entry.createdAt < oldestDate) oldestDate = entry.createdAt;
389
- if (entry.createdAt > newestDate) newestDate = entry.createdAt;
390
- }
391
-
392
- return {
393
- namespace,
394
- totalEntries: entries.length,
395
- activeEntries: active.length,
396
- totalSize,
397
- averageAccessCount: entries.length > 0 ? totalAccessCount / entries.length : 0,
398
- oldestEntry: oldestDate,
399
- newestEntry: newestDate,
400
- typeDistribution,
401
- };
402
- }
403
- }