@monoes/memory 1.0.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 (178) hide show
  1. package/README.md +902 -0
  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 +230 -0
  5. package/dist/agent-memory-scope.js.map +1 -0
  6. package/dist/agentdb-adapter.d.ts +165 -0
  7. package/dist/agentdb-adapter.d.ts.map +1 -0
  8. package/dist/agentdb-adapter.js +836 -0
  9. package/dist/agentdb-adapter.js.map +1 -0
  10. package/dist/agentdb-backend.d.ts +218 -0
  11. package/dist/agentdb-backend.d.ts.map +1 -0
  12. package/dist/agentdb-backend.js +879 -0
  13. package/dist/agentdb-backend.js.map +1 -0
  14. package/dist/auto-memory-bridge.d.ts +230 -0
  15. package/dist/auto-memory-bridge.d.ts.map +1 -0
  16. package/dist/auto-memory-bridge.js +730 -0
  17. package/dist/auto-memory-bridge.js.map +1 -0
  18. package/dist/cache-manager.d.ts +134 -0
  19. package/dist/cache-manager.d.ts.map +1 -0
  20. package/dist/cache-manager.js +410 -0
  21. package/dist/cache-manager.js.map +1 -0
  22. package/dist/checkpointer.d.ts +78 -0
  23. package/dist/checkpointer.d.ts.map +1 -0
  24. package/dist/checkpointer.js +174 -0
  25. package/dist/checkpointer.js.map +1 -0
  26. package/dist/controller-registry.d.ts +216 -0
  27. package/dist/controller-registry.d.ts.map +1 -0
  28. package/dist/controller-registry.js +897 -0
  29. package/dist/controller-registry.js.map +1 -0
  30. package/dist/database-provider.d.ts +87 -0
  31. package/dist/database-provider.d.ts.map +1 -0
  32. package/dist/database-provider.js +434 -0
  33. package/dist/database-provider.js.map +1 -0
  34. package/dist/diskann-backend.d.ts +126 -0
  35. package/dist/diskann-backend.d.ts.map +1 -0
  36. package/dist/diskann-backend.js +324 -0
  37. package/dist/diskann-backend.js.map +1 -0
  38. package/dist/episodic-store.d.ts +58 -0
  39. package/dist/episodic-store.d.ts.map +1 -0
  40. package/dist/episodic-store.js +160 -0
  41. package/dist/episodic-store.js.map +1 -0
  42. package/dist/hnsw-index.d.ts +111 -0
  43. package/dist/hnsw-index.d.ts.map +1 -0
  44. package/dist/hnsw-index.js +778 -0
  45. package/dist/hnsw-index.js.map +1 -0
  46. package/dist/hnsw-lite.d.ts +29 -0
  47. package/dist/hnsw-lite.d.ts.map +1 -0
  48. package/dist/hnsw-lite.js +236 -0
  49. package/dist/hnsw-lite.js.map +1 -0
  50. package/dist/hybrid-backend.d.ts +299 -0
  51. package/dist/hybrid-backend.d.ts.map +1 -0
  52. package/dist/hybrid-backend.js +804 -0
  53. package/dist/hybrid-backend.js.map +1 -0
  54. package/dist/index.d.ts +228 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +379 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/knowledge/document-chunker.d.ts +22 -0
  59. package/dist/knowledge/document-chunker.d.ts.map +1 -0
  60. package/dist/knowledge/document-chunker.js +52 -0
  61. package/dist/knowledge/document-chunker.js.map +1 -0
  62. package/dist/knowledge/index.d.ts +12 -0
  63. package/dist/knowledge/index.d.ts.map +1 -0
  64. package/dist/knowledge/index.js +9 -0
  65. package/dist/knowledge/index.js.map +1 -0
  66. package/dist/knowledge/knowledge-retriever.d.ts +48 -0
  67. package/dist/knowledge/knowledge-retriever.d.ts.map +1 -0
  68. package/dist/knowledge/knowledge-retriever.js +80 -0
  69. package/dist/knowledge/knowledge-retriever.js.map +1 -0
  70. package/dist/knowledge/knowledge-store.d.ts +58 -0
  71. package/dist/knowledge/knowledge-store.d.ts.map +1 -0
  72. package/dist/knowledge/knowledge-store.js +121 -0
  73. package/dist/knowledge/knowledge-store.js.map +1 -0
  74. package/dist/learning-bridge.d.ts +162 -0
  75. package/dist/learning-bridge.d.ts.map +1 -0
  76. package/dist/learning-bridge.js +522 -0
  77. package/dist/learning-bridge.js.map +1 -0
  78. package/dist/memory-graph.d.ts +123 -0
  79. package/dist/memory-graph.d.ts.map +1 -0
  80. package/dist/memory-graph.js +412 -0
  81. package/dist/memory-graph.js.map +1 -0
  82. package/dist/migration.d.ts +68 -0
  83. package/dist/migration.d.ts.map +1 -0
  84. package/dist/migration.js +513 -0
  85. package/dist/migration.js.map +1 -0
  86. package/dist/partitioned-hnsw.d.ts +65 -0
  87. package/dist/partitioned-hnsw.d.ts.map +1 -0
  88. package/dist/partitioned-hnsw.js +209 -0
  89. package/dist/partitioned-hnsw.js.map +1 -0
  90. package/dist/persistent-sona.d.ts +144 -0
  91. package/dist/persistent-sona.d.ts.map +1 -0
  92. package/dist/persistent-sona.js +333 -0
  93. package/dist/persistent-sona.js.map +1 -0
  94. package/dist/procedural/action-record.d.ts +19 -0
  95. package/dist/procedural/action-record.d.ts.map +1 -0
  96. package/dist/procedural/action-record.js +51 -0
  97. package/dist/procedural/action-record.js.map +1 -0
  98. package/dist/procedural/action-sequence-extractor.d.ts +25 -0
  99. package/dist/procedural/action-sequence-extractor.d.ts.map +1 -0
  100. package/dist/procedural/action-sequence-extractor.js +91 -0
  101. package/dist/procedural/action-sequence-extractor.js.map +1 -0
  102. package/dist/procedural/index.d.ts +14 -0
  103. package/dist/procedural/index.d.ts.map +1 -0
  104. package/dist/procedural/index.js +13 -0
  105. package/dist/procedural/index.js.map +1 -0
  106. package/dist/procedural/learned-skill.d.ts +17 -0
  107. package/dist/procedural/learned-skill.d.ts.map +1 -0
  108. package/dist/procedural/learned-skill.js +73 -0
  109. package/dist/procedural/learned-skill.js.map +1 -0
  110. package/dist/procedural/procedure-extractor-worker.d.ts +27 -0
  111. package/dist/procedural/procedure-extractor-worker.d.ts.map +1 -0
  112. package/dist/procedural/procedure-extractor-worker.js +39 -0
  113. package/dist/procedural/procedure-extractor-worker.js.map +1 -0
  114. package/dist/procedural/skill-registry.d.ts +25 -0
  115. package/dist/procedural/skill-registry.d.ts.map +1 -0
  116. package/dist/procedural/skill-registry.js +56 -0
  117. package/dist/procedural/skill-registry.js.map +1 -0
  118. package/dist/procedural/types.d.ts +67 -0
  119. package/dist/procedural/types.d.ts.map +1 -0
  120. package/dist/procedural/types.js +15 -0
  121. package/dist/procedural/types.js.map +1 -0
  122. package/dist/prompt-version-store.d.ts +59 -0
  123. package/dist/prompt-version-store.d.ts.map +1 -0
  124. package/dist/prompt-version-store.js +175 -0
  125. package/dist/prompt-version-store.js.map +1 -0
  126. package/dist/query-builder.d.ts +52 -0
  127. package/dist/query-builder.d.ts.map +1 -0
  128. package/dist/query-builder.js +134 -0
  129. package/dist/query-builder.js.map +1 -0
  130. package/dist/rvf-backend.d.ts +51 -0
  131. package/dist/rvf-backend.d.ts.map +1 -0
  132. package/dist/rvf-backend.js +499 -0
  133. package/dist/rvf-backend.js.map +1 -0
  134. package/dist/rvf-learning-store.d.ts +141 -0
  135. package/dist/rvf-learning-store.d.ts.map +1 -0
  136. package/dist/rvf-learning-store.js +344 -0
  137. package/dist/rvf-learning-store.js.map +1 -0
  138. package/dist/rvf-migration.d.ts +45 -0
  139. package/dist/rvf-migration.d.ts.map +1 -0
  140. package/dist/rvf-migration.js +254 -0
  141. package/dist/rvf-migration.js.map +1 -0
  142. package/dist/sqlite-backend.d.ts +127 -0
  143. package/dist/sqlite-backend.d.ts.map +1 -0
  144. package/dist/sqlite-backend.js +618 -0
  145. package/dist/sqlite-backend.js.map +1 -0
  146. package/dist/sqljs-backend.d.ts +128 -0
  147. package/dist/sqljs-backend.d.ts.map +1 -0
  148. package/dist/sqljs-backend.js +611 -0
  149. package/dist/sqljs-backend.js.map +1 -0
  150. package/dist/tier-manager.d.ts +79 -0
  151. package/dist/tier-manager.d.ts.map +1 -0
  152. package/dist/tier-manager.js +169 -0
  153. package/dist/tier-manager.js.map +1 -0
  154. package/dist/tiers/contextual.d.ts +43 -0
  155. package/dist/tiers/contextual.d.ts.map +1 -0
  156. package/dist/tiers/contextual.js +102 -0
  157. package/dist/tiers/contextual.js.map +1 -0
  158. package/dist/tiers/entity.d.ts +46 -0
  159. package/dist/tiers/entity.d.ts.map +1 -0
  160. package/dist/tiers/entity.js +106 -0
  161. package/dist/tiers/entity.js.map +1 -0
  162. package/dist/tiers/index.d.ts +4 -0
  163. package/dist/tiers/index.d.ts.map +1 -0
  164. package/dist/tiers/index.js +4 -0
  165. package/dist/tiers/index.js.map +1 -0
  166. package/dist/tiers/short-term.d.ts +42 -0
  167. package/dist/tiers/short-term.d.ts.map +1 -0
  168. package/dist/tiers/short-term.js +89 -0
  169. package/dist/tiers/short-term.js.map +1 -0
  170. package/dist/types/checkpoint.d.ts +44 -0
  171. package/dist/types/checkpoint.d.ts.map +1 -0
  172. package/dist/types/checkpoint.js +8 -0
  173. package/dist/types/checkpoint.js.map +1 -0
  174. package/dist/types.d.ts +526 -0
  175. package/dist/types.d.ts.map +1 -0
  176. package/dist/types.js +58 -0
  177. package/dist/types.js.map +1 -0
  178. package/package.json +46 -0
@@ -0,0 +1,522 @@
1
+ /**
2
+ * LearningBridge - Connects AutoMemoryBridge to NeuralLearningSystem
3
+ *
4
+ * When insights are recorded via AutoMemoryBridge, this module triggers
5
+ * neural learning trajectories so the system continuously improves from
6
+ * its own discoveries. The NeuralLearningSystem dependency is optional:
7
+ * when unavailable, all operations degrade gracefully to no-ops.
8
+ *
9
+ * @module @monomind/memory/learning-bridge
10
+ */
11
+ import { EventEmitter } from 'node:events';
12
+ const DEFAULT_CONFIG = {
13
+ sonaMode: 'balanced',
14
+ confidenceDecayRate: 0.005,
15
+ accessBoostAmount: 0.03,
16
+ maxConfidence: 1.0,
17
+ minConfidence: 0.1,
18
+ ewcLambda: 2000,
19
+ consolidationThreshold: 5,
20
+ enabled: true,
21
+ };
22
+ const MS_PER_HOUR = 3_600_000;
23
+ // ===== LearningBridge =====
24
+ /**
25
+ * Connects AutoMemoryBridge insights to the NeuralLearningSystem.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const bridge = new LearningBridge(memoryBackend);
30
+ * await bridge.onInsightRecorded(insight, entryId);
31
+ * await bridge.onInsightAccessed(entryId);
32
+ * const result = await bridge.consolidate();
33
+ * ```
34
+ */
35
+ export class LearningBridge extends EventEmitter {
36
+ neural = null;
37
+ backend;
38
+ config;
39
+ activeTrajectories = new Map();
40
+ stats = {
41
+ totalTrajectories: 0,
42
+ completedTrajectories: 0,
43
+ totalConsolidations: 0,
44
+ totalDecays: 0,
45
+ confidenceBoosts: 0,
46
+ totalBoostAmount: 0,
47
+ };
48
+ destroyed = false;
49
+ neuralInitPromise = null;
50
+ backfillInProgress = false;
51
+ constructor(backend, config) {
52
+ super();
53
+ this.backend = backend;
54
+ this.config = { ...DEFAULT_CONFIG, ...config };
55
+ }
56
+ // ===== Public API =====
57
+ /**
58
+ * Notify the bridge that an insight has been recorded in AgentDB.
59
+ * Creates a learning trajectory so the neural system can track the
60
+ * insight's lifecycle.
61
+ */
62
+ async onInsightRecorded(insight, entryId) {
63
+ if (!this.config.enabled || this.destroyed)
64
+ return;
65
+ await this.initNeural();
66
+ if (this.neural) {
67
+ try {
68
+ const trajectoryId = this.neural.beginTask(insight.summary, 'general');
69
+ this.activeTrajectories.set(entryId, trajectoryId);
70
+ this.stats.totalTrajectories++;
71
+ // V1: use real embeddings from the memory bridge rather than hash noise
72
+ const embedding = await this.createEmbedding(insight.summary);
73
+ this.neural.recordStep(trajectoryId, `record:${insight.category}`, insight.confidence, embedding);
74
+ }
75
+ catch {
76
+ // Neural system failure is non-fatal
77
+ }
78
+ }
79
+ this.emit('insight:learning-started', { entryId, category: insight.category });
80
+ }
81
+ /**
82
+ * Notify the bridge that an insight entry was accessed.
83
+ * Boosts confidence in the backend and records a step in the
84
+ * trajectory if one exists.
85
+ */
86
+ async onInsightAccessed(entryId) {
87
+ if (!this.config.enabled || this.destroyed)
88
+ return;
89
+ const entry = await this.backend.get(entryId);
90
+ if (!entry)
91
+ return;
92
+ const currentConf = entry.metadata?.confidence ?? 0.5;
93
+ const newConf = Math.min(this.config.maxConfidence, currentConf + this.config.accessBoostAmount);
94
+ await this.backend.update(entryId, {
95
+ metadata: { ...entry.metadata, confidence: newConf },
96
+ });
97
+ this.stats.confidenceBoosts++;
98
+ this.stats.totalBoostAmount += this.config.accessBoostAmount;
99
+ if (this.neural && this.activeTrajectories.has(entryId)) {
100
+ try {
101
+ const trajectoryId = this.activeTrajectories.get(entryId);
102
+ const accessEmbedding = await this.createEmbedding(`access:${entryId}`);
103
+ this.neural.recordStep(trajectoryId, 'access', this.config.accessBoostAmount, accessEmbedding);
104
+ }
105
+ catch {
106
+ // Non-fatal
107
+ }
108
+ }
109
+ this.emit('insight:accessed', { entryId, newConfidence: newConf });
110
+ }
111
+ /**
112
+ * Consolidate active trajectories by completing them in the neural system.
113
+ * Only runs when there are enough active trajectories to justify the cost.
114
+ */
115
+ async consolidate() {
116
+ const startTime = Date.now();
117
+ const earlyResult = {
118
+ trajectoriesCompleted: 0,
119
+ patternsLearned: 0,
120
+ entriesUpdated: 0,
121
+ durationMs: 0,
122
+ };
123
+ if (!this.config.enabled || this.destroyed) {
124
+ return earlyResult;
125
+ }
126
+ if (!this.neural || this.activeTrajectories.size < this.config.consolidationThreshold) {
127
+ earlyResult.durationMs = Date.now() - startTime;
128
+ return earlyResult;
129
+ }
130
+ let completed = 0;
131
+ let patternsLearned = 0;
132
+ const toRemove = [];
133
+ const entries = Array.from(this.activeTrajectories.entries());
134
+ for (const [entryId, trajectoryId] of entries) {
135
+ try {
136
+ // V2: use the entry's stored confidence as quality rather than hardcoded 1.0
137
+ // so the reward signal actually reflects insight importance
138
+ let quality = 1.0;
139
+ try {
140
+ const entry = await this.backend.get(entryId);
141
+ const stored = entry?.metadata?.confidence ?? entry?.importanceScore;
142
+ if (Number.isFinite(stored) && stored >= 0 && stored <= 1)
143
+ quality = stored;
144
+ }
145
+ catch { /* use default */ }
146
+ await this.neural.completeTask(trajectoryId, quality);
147
+ completed++;
148
+ patternsLearned++;
149
+ toRemove.push(entryId);
150
+ }
151
+ catch {
152
+ // Skip failed completions
153
+ }
154
+ }
155
+ for (const key of toRemove) {
156
+ this.activeTrajectories.delete(key);
157
+ }
158
+ this.stats.completedTrajectories += completed;
159
+ this.stats.totalConsolidations++;
160
+ // Pipeline A→B bridge: flush PatternLearner patterns to patterns.json so
161
+ // intelligence.ts (the routing path) can find patterns learned by the neural
162
+ // package. This closes the loop between automatic session learning and routing.
163
+ if (completed > 0 && this.neural && typeof this.neural.getLearnedPatterns === 'function') {
164
+ void this.flushNeuralPatternsToFile().catch(() => { });
165
+ }
166
+ const result = {
167
+ trajectoriesCompleted: completed,
168
+ patternsLearned,
169
+ entriesUpdated: completed,
170
+ durationMs: Date.now() - startTime,
171
+ };
172
+ this.emit('consolidation:completed', result);
173
+ return result;
174
+ }
175
+ /**
176
+ * Apply time-based confidence decay to entries in the given namespace.
177
+ * Entries not accessed for more than one hour see their confidence reduced
178
+ * proportionally to the hours elapsed, down to minConfidence.
179
+ *
180
+ * @returns number of entries whose confidence was lowered
181
+ */
182
+ async decayConfidences(namespace) {
183
+ if (!this.config.enabled || this.destroyed)
184
+ return 0;
185
+ let entries;
186
+ try {
187
+ entries = await this.backend.query({
188
+ type: 'hybrid',
189
+ namespace,
190
+ limit: 1000,
191
+ });
192
+ }
193
+ catch {
194
+ return 0;
195
+ }
196
+ const now = Date.now();
197
+ let decayed = 0;
198
+ for (const entry of entries) {
199
+ const hoursSinceUpdate = (now - entry.updatedAt) / MS_PER_HOUR;
200
+ if (hoursSinceUpdate < 1)
201
+ continue;
202
+ const currentConf = entry.metadata?.confidence ?? 0.5;
203
+ // FOREVER forgetting curve: exponential decay weighted by importanceScore
204
+ // Source: https://arxiv.org/html/2601.03938v1
205
+ const importanceScore = (entry.importanceScore ?? entry.metadata?.importanceScore) ?? currentConf;
206
+ const newConf = Math.max(this.config.minConfidence, importanceScore * Math.exp(-this.config.confidenceDecayRate * hoursSinceUpdate));
207
+ if (newConf < currentConf) {
208
+ try {
209
+ await this.backend.update(entry.id, {
210
+ metadata: { ...entry.metadata, confidence: newConf },
211
+ });
212
+ decayed++;
213
+ }
214
+ catch {
215
+ // Skip failed updates
216
+ }
217
+ }
218
+ }
219
+ this.stats.totalDecays += decayed;
220
+ return decayed;
221
+ }
222
+ /**
223
+ * Find patterns similar to the given content using the neural system.
224
+ * Returns an empty array when the neural system is unavailable.
225
+ */
226
+ async findSimilarPatterns(content, k = 5) {
227
+ if (!this.config.enabled || this.destroyed)
228
+ return [];
229
+ await this.initNeural();
230
+ if (!this.neural)
231
+ return [];
232
+ try {
233
+ const embedding = this.createHashEmbedding(content);
234
+ const results = await this.neural.findPatterns(embedding, k);
235
+ if (!Array.isArray(results))
236
+ return [];
237
+ return results.map((r) => ({
238
+ content: r.content ?? r.data ?? '',
239
+ similarity: r.similarity ?? r.score ?? 0,
240
+ category: r.category ?? 'unknown',
241
+ confidence: r.confidence ?? r.reward ?? 0,
242
+ }));
243
+ }
244
+ catch {
245
+ return [];
246
+ }
247
+ }
248
+ /** Return aggregated learning statistics */
249
+ getStats() {
250
+ const avgBoost = this.stats.confidenceBoosts > 0
251
+ ? this.stats.totalBoostAmount / this.stats.confidenceBoosts
252
+ : 0;
253
+ return {
254
+ totalTrajectories: this.stats.totalTrajectories,
255
+ completedTrajectories: this.stats.completedTrajectories,
256
+ activeTrajectories: this.activeTrajectories.size,
257
+ totalConsolidations: this.stats.totalConsolidations,
258
+ totalDecays: this.stats.totalDecays,
259
+ avgConfidenceBoost: avgBoost,
260
+ neuralAvailable: this.neural !== null,
261
+ };
262
+ }
263
+ /** Tear down the bridge. Subsequent method calls become no-ops. */
264
+ destroy() {
265
+ this.destroyed = true;
266
+ this.activeTrajectories.clear();
267
+ if (this.neural && typeof this.neural.cleanup === 'function') {
268
+ try {
269
+ this.neural.cleanup();
270
+ }
271
+ catch {
272
+ // Best-effort cleanup
273
+ }
274
+ }
275
+ this.neural = null;
276
+ this.neuralInitPromise = null;
277
+ this.removeAllListeners();
278
+ }
279
+ // ===== Private =====
280
+ /**
281
+ * Lazily attempt to load and initialize the NeuralLearningSystem.
282
+ * The promise is cached so that repeated calls do not re-attempt
283
+ * after a failure.
284
+ */
285
+ async initNeural() {
286
+ if (this.neural)
287
+ return;
288
+ if (this.neuralInitPromise) {
289
+ await this.neuralInitPromise;
290
+ return;
291
+ }
292
+ this.neuralInitPromise = this.loadNeural();
293
+ await this.neuralInitPromise;
294
+ }
295
+ async loadNeural() {
296
+ try {
297
+ if (this.config.neuralLoader) {
298
+ // Use injected loader (test / custom integrations)
299
+ this.neural = await this.config.neuralLoader();
300
+ return;
301
+ }
302
+ const mod = await import('@monomind/neural');
303
+ const NeuralLearningSystem = mod.NeuralLearningSystem ?? mod.default;
304
+ if (!NeuralLearningSystem)
305
+ return;
306
+ const instance = new NeuralLearningSystem(this.config.sonaMode);
307
+ if (typeof instance.initialize === 'function') {
308
+ await instance.initialize();
309
+ }
310
+ this.neural = instance;
311
+ }
312
+ catch {
313
+ // @monomind/neural not installed or failed to initialize.
314
+ // This is expected in many environments; degrade silently.
315
+ this.neural = null;
316
+ }
317
+ }
318
+ /**
319
+ * Write PatternLearner patterns to .monomind/neural/patterns.json so that
320
+ * intelligence.ts (Pipeline B) can find them via findSimilarPatterns / getAllPatterns.
321
+ * This is the Pipeline A→B bridge: automatic session learning → routing.
322
+ */
323
+ async flushNeuralPatternsToFile() {
324
+ const learnedRaw = this.neural.getLearnedPatterns?.() ?? [];
325
+ if (learnedRaw.length === 0)
326
+ return;
327
+ const { writeFileSync, mkdirSync, existsSync, readFileSync, renameSync } = await import('node:fs');
328
+ const { join } = await import('node:path');
329
+ const dir = join(process.cwd(), '.monomind', 'neural');
330
+ if (!existsSync(dir))
331
+ mkdirSync(dir, { recursive: true });
332
+ const patternsPath = join(dir, 'patterns.json');
333
+ let existing = [];
334
+ try {
335
+ const raw = readFileSync(patternsPath, 'utf-8');
336
+ const parsed = JSON.parse(raw);
337
+ if (Array.isArray(parsed))
338
+ existing = parsed;
339
+ }
340
+ catch { /* start fresh */ }
341
+ // Map PatternLearner domains to valid monomind agent type strings.
342
+ // Domain values ('code', 'reasoning', 'general', etc.) are not agent names;
343
+ // without this mapping every flushed pattern is rejected by the VALID_AGENT_TYPES
344
+ // filter in suggestAgentsFromIntelligence, making the A→B bridge a no-op.
345
+ const DOMAIN_TO_AGENT = {
346
+ code: 'coder',
347
+ coding: 'coder',
348
+ reasoning: 'researcher',
349
+ research: 'researcher',
350
+ testing: 'tester',
351
+ review: 'reviewer',
352
+ security: 'security-architect',
353
+ performance: 'performance-engineer',
354
+ architecture: 'architect',
355
+ creative: 'researcher',
356
+ math: 'researcher',
357
+ chat: 'coder',
358
+ general: 'coder',
359
+ };
360
+ const existingIds = new Set(existing.map(p => p['id']));
361
+ const now = Date.now();
362
+ const newEntries = learnedRaw
363
+ .filter(p => !existingIds.has(`neural:${p.id}`) && p.successRate >= 0.3)
364
+ .map(p => ({
365
+ id: `neural:${p.id}`,
366
+ type: DOMAIN_TO_AGENT[p.domain] ?? 'coder',
367
+ content: p.strategy,
368
+ confidence: p.successRate,
369
+ usageCount: p.usageCount,
370
+ embedding: [],
371
+ createdAt: now,
372
+ lastUsedAt: now,
373
+ }));
374
+ if (newEntries.length === 0)
375
+ return;
376
+ const merged = [...existing, ...newEntries];
377
+ const tmp = `${patternsPath}.${process.pid}.${now}.tmp`;
378
+ writeFileSync(tmp, JSON.stringify(merged, null, 2), 'utf-8');
379
+ renameSync(tmp, patternsPath);
380
+ void this.backfillEmbeddings(patternsPath).catch(() => { });
381
+ }
382
+ /**
383
+ * Background task: generate embeddings for patterns written with empty
384
+ * embedding arrays. Runs fire-and-forget after flushNeuralPatternsToFile.
385
+ * Non-fatal — any error is silently swallowed.
386
+ */
387
+ async backfillEmbeddings(patternsPath) {
388
+ if (this.backfillInProgress)
389
+ return;
390
+ this.backfillInProgress = true;
391
+ try {
392
+ const { readFileSync, writeFileSync, renameSync } = await import('node:fs');
393
+ const raw = readFileSync(patternsPath, 'utf-8');
394
+ const patterns = JSON.parse(raw);
395
+ if (!Array.isArray(patterns))
396
+ return;
397
+ let changed = false;
398
+ for (const entry of patterns) {
399
+ const emb = entry['embedding'];
400
+ if (Array.isArray(emb) && emb.length === 0) {
401
+ const content = typeof entry['content'] === 'string' ? entry['content'] : '';
402
+ const vec = await this.createEmbedding(content, 768);
403
+ entry['embedding'] = Array.from(vec);
404
+ changed = true;
405
+ }
406
+ }
407
+ if (!changed)
408
+ return;
409
+ // M1: re-read the file just before writing so a concurrent flush that ran
410
+ // during our embedding computation is not silently overwritten (lost-update).
411
+ // We merge: apply our computed embeddings onto the freshest on-disk snapshot.
412
+ let finalPatterns = patterns;
413
+ try {
414
+ const freshRaw = readFileSync(patternsPath, 'utf-8');
415
+ const freshPatterns = JSON.parse(freshRaw);
416
+ if (Array.isArray(freshPatterns)) {
417
+ const embeddingById = new Map(patterns.map(p => [p['id'], p['embedding']]));
418
+ finalPatterns = freshPatterns.map(p => {
419
+ const backfilledEmb = embeddingById.get(p['id']);
420
+ if (backfilledEmb && Array.isArray(backfilledEmb) && backfilledEmb.length > 0) {
421
+ return { ...p, embedding: backfilledEmb };
422
+ }
423
+ return p;
424
+ });
425
+ }
426
+ }
427
+ catch { /* use original patterns on re-read failure */ }
428
+ const now = Date.now();
429
+ const tmp = `${patternsPath}.backfill.${process.pid}.${now}.tmp`;
430
+ writeFileSync(tmp, JSON.stringify(finalPatterns, null, 2), 'utf-8');
431
+ renameSync(tmp, patternsPath);
432
+ }
433
+ catch {
434
+ // Non-fatal: backfill failure does not affect the flush result
435
+ }
436
+ finally {
437
+ this.backfillInProgress = false;
438
+ }
439
+ }
440
+ /**
441
+ * Generate a real semantic embedding via the memory bridge embedder,
442
+ * falling back to a deterministic hash embedding when unavailable.
443
+ * V1: using real embeddings is critical for meaningful LoRA weight updates.
444
+ */
445
+ async createEmbedding(text, dimensions = 768) {
446
+ // Prefer the injected embedder (CLI wires this in via LearningBridgeConfig.embedder)
447
+ // — no cross-package import needed, clean dependency boundary.
448
+ const embeddingSource = this.config.embedder;
449
+ if (embeddingSource) {
450
+ try {
451
+ const raw = await embeddingSource(text);
452
+ if (Array.isArray(raw) && raw.length > 0) {
453
+ const arr = new Float32Array(dimensions);
454
+ const copyLen = Math.min(raw.length, dimensions);
455
+ for (let i = 0; i < copyLen; i++)
456
+ arr[i] = raw[i];
457
+ let norm = 0;
458
+ for (let i = 0; i < dimensions; i++)
459
+ norm += arr[i] * arr[i];
460
+ norm = Math.sqrt(norm);
461
+ if (norm > 0)
462
+ for (let i = 0; i < dimensions; i++)
463
+ arr[i] /= norm;
464
+ return arr;
465
+ }
466
+ }
467
+ catch { /* fall through */ }
468
+ }
469
+ // Fallback: try @monomind/cli's memory-bridge when running inside the CLI process
470
+ try {
471
+ const bridge = await import('@monomind/cli/src/memory/memory-bridge.js')
472
+ .catch(() => null);
473
+ if (bridge?.bridgeGenerateEmbedding) {
474
+ const result = await bridge.bridgeGenerateEmbedding(text);
475
+ if (result?.embedding && Array.isArray(result.embedding) && result.embedding.length > 0) {
476
+ const arr = new Float32Array(dimensions);
477
+ const copyLen = Math.min(result.embedding.length, dimensions);
478
+ for (let i = 0; i < copyLen; i++)
479
+ arr[i] = result.embedding[i];
480
+ let norm = 0;
481
+ for (let i = 0; i < dimensions; i++)
482
+ norm += arr[i] * arr[i];
483
+ norm = Math.sqrt(norm);
484
+ if (norm > 0)
485
+ for (let i = 0; i < dimensions; i++)
486
+ arr[i] /= norm;
487
+ return arr;
488
+ }
489
+ }
490
+ }
491
+ catch { /* fall through to hash */ }
492
+ return this.createHashEmbedding(text, dimensions);
493
+ }
494
+ /**
495
+ * Deterministic hash-based embedding fallback.
496
+ * Used only when no real embedder is available.
497
+ */
498
+ createHashEmbedding(text, dimensions = 768) {
499
+ const embedding = new Float32Array(dimensions);
500
+ const normalized = text.toLowerCase().trim();
501
+ for (let i = 0; i < dimensions; i++) {
502
+ let hash = 0;
503
+ for (let j = 0; j < normalized.length; j++) {
504
+ hash = ((hash << 5) - hash + normalized.charCodeAt(j) * (i + 1)) | 0;
505
+ }
506
+ embedding[i] = (Math.sin(hash) + 1) / 2;
507
+ }
508
+ let norm = 0;
509
+ for (let i = 0; i < dimensions; i++) {
510
+ norm += embedding[i] * embedding[i];
511
+ }
512
+ norm = Math.sqrt(norm);
513
+ if (norm > 0) {
514
+ for (let i = 0; i < dimensions; i++) {
515
+ embedding[i] /= norm;
516
+ }
517
+ }
518
+ return embedding;
519
+ }
520
+ }
521
+ export default LearningBridge;
522
+ //# sourceMappingURL=learning-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-bridge.js","sourceRoot":"","sources":["../src/learning-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Knowledge Graph Module for @monomind/memory
3
+ *
4
+ * Builds a graph from MemoryEntry.references, computes PageRank,
5
+ * detects communities via label propagation, and provides
6
+ * graph-aware ranking for search results.
7
+ *
8
+ * Pure TypeScript - no external graph libraries.
9
+ * @module v1/memory/memory-graph
10
+ */
11
+ import { EventEmitter } from 'node:events';
12
+ import type { IMemoryBackend, MemoryEntry, SearchResult } from './types.js';
13
+ export type EdgeType = 'reference' | 'similar' | 'temporal' | 'co-accessed' | 'causal';
14
+ export interface MemoryGraphConfig {
15
+ similarityThreshold?: number;
16
+ pageRankDamping?: number;
17
+ pageRankIterations?: number;
18
+ pageRankConvergence?: number;
19
+ maxNodes?: number;
20
+ enableAutoEdges?: boolean;
21
+ communityAlgorithm?: 'louvain' | 'label-propagation';
22
+ }
23
+ export interface GraphNode {
24
+ id: string;
25
+ category: string;
26
+ confidence: number;
27
+ accessCount: number;
28
+ createdAt: number;
29
+ }
30
+ export interface GraphEdge {
31
+ targetId: string;
32
+ type: EdgeType;
33
+ weight: number;
34
+ }
35
+ export interface RankedResult {
36
+ entry: MemoryEntry;
37
+ score: number;
38
+ pageRank: number;
39
+ combinedScore: number;
40
+ community?: string;
41
+ }
42
+ export interface GraphStats {
43
+ nodeCount: number;
44
+ edgeCount: number;
45
+ avgDegree: number;
46
+ communityCount: number;
47
+ pageRankComputed: boolean;
48
+ maxPageRank: number;
49
+ minPageRank: number;
50
+ }
51
+ /**
52
+ * Knowledge graph built from memory entry references.
53
+ * Supports PageRank, community detection (label propagation),
54
+ * and graph-aware result ranking blending vector similarity with structural importance.
55
+ */
56
+ export declare class MemoryGraph extends EventEmitter {
57
+ private nodes;
58
+ private edges;
59
+ private reverseEdges;
60
+ private pageRanks;
61
+ private communities;
62
+ private config;
63
+ private dirty;
64
+ constructor(config?: MemoryGraphConfig);
65
+ /** Build graph from all entries in a backend. Creates nodes and reference edges. */
66
+ buildFromBackend(backend: IMemoryBackend, namespace?: string): Promise<void>;
67
+ /** Add a node from a MemoryEntry. Skips silently at maxNodes capacity. */
68
+ addNode(entry: MemoryEntry): void;
69
+ /** Add a directed edge. Skips if either node missing. Updates weight to max if exists. */
70
+ addEdge(sourceId: string, targetId: string, type: EdgeType, weight?: number): void;
71
+ /** Remove a node and all associated edges (both directions). */
72
+ removeNode(id: string): void;
73
+ /** Add similarity edges by searching backend. Returns count of edges added. */
74
+ addSimilarityEdges(backend: IMemoryBackend, entryId: string): Promise<number>;
75
+ /**
76
+ * Compute PageRank via power iteration with dangling node redistribution.
77
+ * Returns map of node ID to PageRank score.
78
+ */
79
+ computePageRank(): Map<string, number>;
80
+ /** Detect communities using label propagation. Returns map of nodeId to communityId. */
81
+ detectCommunities(): Map<string, string>;
82
+ /**
83
+ * Rank search results blending vector similarity and PageRank.
84
+ * @param alpha - Weight for vector score (default 0.7). PageRank weight is (1 - alpha).
85
+ */
86
+ rankWithGraph(searchResults: SearchResult[], alpha?: number): RankedResult[];
87
+ /** Get top N nodes by PageRank score. */
88
+ getTopNodes(n: number): Array<{
89
+ id: string;
90
+ pageRank: number;
91
+ community: string;
92
+ }>;
93
+ /** BFS neighbors from a node up to given depth. Excludes the start node. */
94
+ getNeighbors(id: string, depth?: number): Set<string>;
95
+ /**
96
+ * HippoRAG-style PPR re-ranking: expand one hop via MemoryEntry.references and
97
+ * boost scores of reachable neighbors.
98
+ *
99
+ * Starting from each HNSW result, walk one hop through the `references` graph.
100
+ * Neighbors receive a propagated score of (parent_score × damping × edge_weight).
101
+ * Final scores are merged using max-of-contributions per node.
102
+ *
103
+ * Source: https://arxiv.org/abs/2405.14831 (HippoRAG 2 — NeurIPS 2024)
104
+ */
105
+ pprRerank(searchResults: SearchResult[], backend: IMemoryBackend, damping?: number): Promise<RankedResult[]>;
106
+ /**
107
+ * GraphRAG community retrieval: return top-k community summary descriptors.
108
+ * These can be prepended to semantic search results for global thematic reasoning.
109
+ *
110
+ * Source: https://arxiv.org/abs/2404.16130 (GraphRAG — Microsoft)
111
+ */
112
+ getCommunitySummaries(topK?: number): Array<{
113
+ communityId: string;
114
+ nodeCount: number;
115
+ topNodeIds: string[];
116
+ avgPageRank: number;
117
+ }>;
118
+ /** Get statistics about the current graph state. */
119
+ getStats(): GraphStats;
120
+ private hasEdge;
121
+ private shuffleArray;
122
+ }
123
+ //# sourceMappingURL=memory-graph.d.ts.map