@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,333 @@
1
+ /**
2
+ * PersistentSonaCoordinator - SONA learning with RVF persistence
3
+ *
4
+ * Wraps RvfLearningStore to provide an in-memory pattern bank with
5
+ * brute-force cosine similarity, trajectory buffering, EWC tracking,
6
+ * and automatic periodic persistence to disk.
7
+ *
8
+ * This is intentionally decoupled from the ruvector SONA classes:
9
+ * it defines its own compatible types and delegates persistence to
10
+ * RvfLearningStore.
11
+ *
12
+ * @module @monomind/memory/persistent-sona
13
+ */
14
+ import { RvfLearningStore, } from './rvf-learning-store.js';
15
+ // ===== Constants =====
16
+ const DEFAULT_PATTERN_THRESHOLD = 0.85;
17
+ const DEFAULT_MAX_TRAJECTORY_BUFFER = 1000;
18
+ const DEFAULT_AUTO_PERSIST_MS = 30_000;
19
+ // ===== Helpers =====
20
+ /**
21
+ * Compute cosine similarity between two number arrays.
22
+ * Returns 0 when either vector has zero magnitude.
23
+ */
24
+ function cosineSimilarity(a, b) {
25
+ const len = Math.min(a.length, b.length);
26
+ let dot = 0;
27
+ let normA = 0;
28
+ let normB = 0;
29
+ // Process in groups of 4 for better throughput
30
+ let i = 0;
31
+ for (; i + 3 < len; i += 4) {
32
+ dot += a[i] * b[i] + a[i + 1] * b[i + 1] + a[i + 2] * b[i + 2] + a[i + 3] * b[i + 3];
33
+ normA += a[i] * a[i] + a[i + 1] * a[i + 1] + a[i + 2] * a[i + 2] + a[i + 3] * a[i + 3];
34
+ normB += b[i] * b[i] + b[i + 1] * b[i + 1] + b[i + 2] * b[i + 2] + b[i + 3] * b[i + 3];
35
+ }
36
+ for (; i < len; i++) {
37
+ dot += a[i] * b[i];
38
+ normA += a[i] * a[i];
39
+ normB += b[i] * b[i];
40
+ }
41
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
42
+ return denom > 0 ? dot / denom : 0;
43
+ }
44
+ function generateId(prefix) {
45
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
46
+ }
47
+ // ===== PersistentSonaCoordinator =====
48
+ /**
49
+ * Coordinates SONA learning with persistent storage.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const sona = new PersistentSonaCoordinator({
54
+ * storePath: './data/sona-learning.rvls',
55
+ * });
56
+ * await sona.initialize();
57
+ *
58
+ * // Store a pattern
59
+ * const id = sona.storePattern('query_response', embedding);
60
+ *
61
+ * // Find similar patterns
62
+ * const matches = sona.findSimilarPatterns(queryEmbedding, 5);
63
+ *
64
+ * // Record a trajectory
65
+ * sona.recordTrajectory({ id: 'traj-1', steps: [...], outcome: 'success', ... });
66
+ *
67
+ * // Periodic background learning
68
+ * const result = sona.runBackgroundLoop();
69
+ *
70
+ * await sona.shutdown();
71
+ * ```
72
+ */
73
+ export class PersistentSonaCoordinator {
74
+ store;
75
+ patterns = new Map();
76
+ trajectoryBuffer = [];
77
+ ewcState = null;
78
+ patternThreshold;
79
+ maxTrajectoryBuffer;
80
+ verbose;
81
+ initialized = false;
82
+ constructor(config) {
83
+ this.patternThreshold = config.patternThreshold ?? DEFAULT_PATTERN_THRESHOLD;
84
+ this.maxTrajectoryBuffer = config.maxTrajectoryBuffer ?? DEFAULT_MAX_TRAJECTORY_BUFFER;
85
+ this.verbose = config.verbose ?? false;
86
+ const storeConfig = {
87
+ storePath: config.storePath,
88
+ autoPersistInterval: config.autoPersistInterval ?? DEFAULT_AUTO_PERSIST_MS,
89
+ verbose: config.verbose,
90
+ };
91
+ this.store = new RvfLearningStore(storeConfig);
92
+ }
93
+ /**
94
+ * Initialize by loading persisted state from the RVF store.
95
+ */
96
+ async initialize() {
97
+ if (this.initialized)
98
+ return;
99
+ await this.store.initialize();
100
+ // Rebuild in-memory state from store
101
+ const patterns = await this.store.loadPatterns();
102
+ for (const p of patterns) {
103
+ this.patterns.set(p.id, p);
104
+ }
105
+ const ewc = await this.store.loadEwcState();
106
+ this.ewcState = ewc;
107
+ const trajectories = await this.store.getTrajectories();
108
+ // getTrajectories returns newest-first, reverse for chronological buffer
109
+ this.trajectoryBuffer = trajectories.reverse();
110
+ this.initialized = true;
111
+ this.log(`Initialized: ${this.patterns.size} patterns, ` +
112
+ `${this.trajectoryBuffer.length} trajectories, ` +
113
+ `EWC: ${this.ewcState ? 'yes' : 'no'}`);
114
+ }
115
+ // ===== Pattern operations =====
116
+ /**
117
+ * Store a new pattern and return its ID.
118
+ *
119
+ * @param type - Pattern type (e.g. 'query_response', 'routing')
120
+ * @param embedding - The pattern embedding vector
121
+ * @param metadata - Optional extra metadata (currently unused, reserved)
122
+ * @returns The generated pattern ID
123
+ */
124
+ storePattern(type, embedding, metadata) {
125
+ this.ensureInitialized();
126
+ const id = generateId('pat');
127
+ const record = {
128
+ id,
129
+ type,
130
+ embedding: [...embedding],
131
+ successRate: 1.0,
132
+ useCount: 0,
133
+ lastUsed: new Date().toISOString(),
134
+ };
135
+ this.patterns.set(id, record);
136
+ // M4: surface persist errors to logs rather than swallowing silently
137
+ void this.store.savePatterns([record]).catch(err => console.warn('[PersistentSona] Pattern persist failed:', err));
138
+ return id;
139
+ }
140
+ /**
141
+ * Find the k most similar patterns above the configured threshold.
142
+ * Uses brute-force cosine similarity (suitable for small pattern sets).
143
+ */
144
+ findSimilarPatterns(embedding, k = 5) {
145
+ this.ensureInitialized();
146
+ const results = [];
147
+ for (const record of this.patterns.values()) {
148
+ const score = cosineSimilarity(embedding, record.embedding);
149
+ if (score >= this.patternThreshold) {
150
+ results.push({ record, score });
151
+ }
152
+ }
153
+ // Sort descending by score and take top-k
154
+ results.sort((a, b) => b.score - a.score);
155
+ return results.slice(0, k).map((r) => r.record);
156
+ }
157
+ /**
158
+ * Record a pattern usage outcome. Updates the success rate using an
159
+ * exponential moving average (alpha = 0.1).
160
+ */
161
+ recordPatternUsage(patternId, success) {
162
+ this.ensureInitialized();
163
+ const pattern = this.patterns.get(patternId);
164
+ if (!pattern)
165
+ return;
166
+ pattern.useCount++;
167
+ pattern.lastUsed = new Date().toISOString();
168
+ const alpha = 0.1;
169
+ const outcome = success ? 1.0 : 0.0;
170
+ pattern.successRate = alpha * outcome + (1 - alpha) * pattern.successRate;
171
+ }
172
+ /**
173
+ * Remove patterns that have low success rates after sufficient usage.
174
+ *
175
+ * @returns The number of patterns pruned
176
+ */
177
+ prunePatterns(minSuccessRate = 0.3, minUseCount = 5) {
178
+ this.ensureInitialized();
179
+ const prunedIds = [];
180
+ for (const [id, pattern] of this.patterns) {
181
+ if (pattern.useCount >= minUseCount && pattern.successRate < minSuccessRate) {
182
+ this.patterns.delete(id);
183
+ prunedIds.push(id);
184
+ }
185
+ }
186
+ if (prunedIds.length > 0) {
187
+ this.log(`Pruned ${prunedIds.length} low-performing patterns`);
188
+ // Persist the deletion so pruned patterns don't reload on next initialize()
189
+ void this.store.deletePatterns(prunedIds).catch(() => { });
190
+ }
191
+ return prunedIds.length;
192
+ }
193
+ // ===== Trajectory tracking =====
194
+ /**
195
+ * Buffer a completed trajectory for later processing.
196
+ * When the buffer exceeds maxTrajectoryBuffer, the oldest entries
197
+ * are evicted.
198
+ */
199
+ recordTrajectory(trajectory) {
200
+ this.ensureInitialized();
201
+ const copy = { ...trajectory };
202
+ this.trajectoryBuffer.push(copy);
203
+ // Persist to store immediately so evicted entries are not lost
204
+ void this.store.appendTrajectory(copy).catch(() => { });
205
+ while (this.trajectoryBuffer.length > this.maxTrajectoryBuffer) {
206
+ this.trajectoryBuffer.shift();
207
+ }
208
+ }
209
+ // ===== Learning loop =====
210
+ /**
211
+ * Process buffered trajectories to extract new patterns.
212
+ * Successful and partial trajectories are mined for high-confidence
213
+ * steps; new patterns are stored if they are sufficiently different
214
+ * from existing ones.
215
+ *
216
+ * After processing, the trajectory buffer is cleared and low-performing
217
+ * patterns are pruned.
218
+ *
219
+ * @returns Summary of the learning pass
220
+ */
221
+ runBackgroundLoop() {
222
+ this.ensureInitialized();
223
+ let patternsLearned = 0;
224
+ const trajectoriesProcessed = this.trajectoryBuffer.length;
225
+ for (const traj of this.trajectoryBuffer) {
226
+ if (traj.outcome === 'success' || traj.outcome === 'partial') {
227
+ patternsLearned += this.extractPatternsFromTrajectory(traj);
228
+ }
229
+ }
230
+ this.prunePatterns();
231
+ this.trajectoryBuffer = [];
232
+ this.log(`Background loop: ${patternsLearned} patterns learned, ` +
233
+ `${trajectoriesProcessed} trajectories processed`);
234
+ return { patternsLearned, trajectoriesProcessed };
235
+ }
236
+ // ===== Persistence =====
237
+ /**
238
+ * Flush current in-memory state to the RVF store on disk.
239
+ */
240
+ async persist() {
241
+ const allPatterns = Array.from(this.patterns.values());
242
+ await this.store.savePatterns(allPatterns);
243
+ if (this.ewcState) {
244
+ await this.store.saveEwcState(this.ewcState);
245
+ }
246
+ // Note: trajectories are appended to the store immediately in recordTrajectory(),
247
+ // so DO NOT re-append here — doing so would write each trajectory twice and
248
+ // produce duplicate records in the sidecar after reload.
249
+ await this.store.persist();
250
+ }
251
+ /**
252
+ * Persist state and shut down the store.
253
+ */
254
+ async shutdown() {
255
+ if (!this.initialized)
256
+ return;
257
+ await this.persist();
258
+ await this.store.close();
259
+ this.initialized = false;
260
+ this.log('Shutdown complete');
261
+ }
262
+ // ===== Stats =====
263
+ /**
264
+ * Return a summary of the coordinator's current state.
265
+ */
266
+ getStats() {
267
+ let totalSuccessRate = 0;
268
+ let count = 0;
269
+ for (const p of this.patterns.values()) {
270
+ totalSuccessRate += p.successRate;
271
+ count++;
272
+ }
273
+ return {
274
+ patterns: this.patterns.size,
275
+ avgSuccessRate: count > 0 ? totalSuccessRate / count : 0,
276
+ trajectoriesBuffered: this.trajectoryBuffer.length,
277
+ ewcTasksLearned: this.ewcState?.tasksLearned ?? 0,
278
+ };
279
+ }
280
+ // ===== Private =====
281
+ /**
282
+ * Extract patterns from a trajectory's high-confidence steps.
283
+ * A step produces a new pattern only if no sufficiently similar
284
+ * pattern already exists.
285
+ */
286
+ extractPatternsFromTrajectory(trajectory) {
287
+ let extracted = 0;
288
+ for (const step of trajectory.steps) {
289
+ if (step.confidence < this.patternThreshold)
290
+ continue;
291
+ const embedding = this.createHashEmbedding(step.input + step.output);
292
+ const similar = this.findSimilarPatterns(embedding, 1);
293
+ if (similar.length === 0) {
294
+ this.storePattern(step.type, embedding);
295
+ extracted++;
296
+ }
297
+ }
298
+ return extracted;
299
+ }
300
+ /**
301
+ * Deterministic hash-based embedding for pattern extraction.
302
+ * This is a lightweight stand-in for a real embedding model,
303
+ * matching the approach used in SonaCoordinator.
304
+ */
305
+ createHashEmbedding(text, dim = 64) {
306
+ const embedding = new Array(dim).fill(0);
307
+ for (let i = 0; i < text.length; i++) {
308
+ const idx = (text.charCodeAt(i) * (i + 1)) % dim;
309
+ embedding[idx] += 0.1;
310
+ }
311
+ let norm = 0;
312
+ for (let i = 0; i < dim; i++) {
313
+ norm += embedding[i] * embedding[i];
314
+ }
315
+ norm = Math.sqrt(norm) || 1;
316
+ for (let i = 0; i < dim; i++) {
317
+ embedding[i] /= norm;
318
+ }
319
+ return embedding;
320
+ }
321
+ ensureInitialized() {
322
+ if (!this.initialized) {
323
+ throw new Error('PersistentSonaCoordinator has not been initialized. Call initialize() first.');
324
+ }
325
+ }
326
+ log(message) {
327
+ if (this.verbose) {
328
+ // eslint-disable-next-line no-console
329
+ console.log(`[PersistentSona] ${message}`);
330
+ }
331
+ }
332
+ }
333
+ //# sourceMappingURL=persistent-sona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-sona.js","sourceRoot":"","sources":["../src/persistent-sona.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ActionRecordStore — JSONL-backed append-only store for action records.
3
+ *
4
+ * Part of Task 45 — Procedural Memory.
5
+ */
6
+ import type { ActionRecord } from './types.js';
7
+ export declare class ActionRecordStore {
8
+ private filePath;
9
+ constructor(filePath: string);
10
+ /** Append a single action record to the JSONL file */
11
+ record(rec: ActionRecord): void;
12
+ /** Read all records from the JSONL file */
13
+ private readAll;
14
+ /** Query records by agent slug, optionally filtering by lookback days */
15
+ queryByAgentSlug(slug: string, lookbackDays?: number): ActionRecord[];
16
+ /** Get all records for a specific run, sorted by timestamp */
17
+ getRunSequence(runId: string): ActionRecord[];
18
+ }
19
+ //# sourceMappingURL=action-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-record.d.ts","sourceRoot":"","sources":["../../src/procedural/action-record.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAQ5B,sDAAsD;IACtD,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAI/B,2CAA2C;IAC3C,OAAO,CAAC,OAAO;IAOf,yEAAyE;IACzE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAarE,8DAA8D;IAC9D,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;CAK9C"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ActionRecordStore — JSONL-backed append-only store for action records.
3
+ *
4
+ * Part of Task 45 — Procedural Memory.
5
+ */
6
+ import { appendFileSync, readFileSync, existsSync, mkdirSync } from 'fs';
7
+ import { dirname } from 'path';
8
+ export class ActionRecordStore {
9
+ filePath;
10
+ constructor(filePath) {
11
+ this.filePath = filePath;
12
+ const dir = dirname(filePath);
13
+ if (!existsSync(dir)) {
14
+ mkdirSync(dir, { recursive: true });
15
+ }
16
+ }
17
+ /** Append a single action record to the JSONL file */
18
+ record(rec) {
19
+ appendFileSync(this.filePath, JSON.stringify(rec) + '\n', 'utf-8');
20
+ }
21
+ /** Read all records from the JSONL file */
22
+ readAll() {
23
+ if (!existsSync(this.filePath))
24
+ return [];
25
+ const content = readFileSync(this.filePath, 'utf-8').trim();
26
+ if (!content)
27
+ return [];
28
+ return content.split('\n').filter(Boolean).map((line) => JSON.parse(line));
29
+ }
30
+ /** Query records by agent slug, optionally filtering by lookback days */
31
+ queryByAgentSlug(slug, lookbackDays) {
32
+ const all = this.readAll();
33
+ const cutoff = lookbackDays
34
+ ? new Date(Date.now() - lookbackDays * 24 * 60 * 60 * 1000).toISOString()
35
+ : undefined;
36
+ return all.filter((r) => {
37
+ if (r.agentSlug !== slug)
38
+ return false;
39
+ if (cutoff && r.timestamp < cutoff)
40
+ return false;
41
+ return true;
42
+ });
43
+ }
44
+ /** Get all records for a specific run, sorted by timestamp */
45
+ getRunSequence(runId) {
46
+ return this.readAll()
47
+ .filter((r) => r.runId === runId)
48
+ .sort((a, b) => a.timestamp.localeCompare(b.timestamp));
49
+ }
50
+ }
51
+ //# sourceMappingURL=action-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-record.js","sourceRoot":"","sources":["../../src/procedural/action-record.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,OAAO,iBAAiB;IACpB,QAAQ,CAAS;IAEzB,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,CAAC,GAAiB;QACtB,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,2CAA2C;IACnC,OAAO;QACb,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC,CAAC;IAC7F,CAAC;IAED,yEAAyE;IACzE,gBAAgB,CAAC,IAAY,EAAE,YAAqB;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,YAAY;YACzB,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;YACzE,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC,CAAC,SAAS,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACvC,IAAI,MAAM,IAAI,CAAC,CAAC,SAAS,GAAG,MAAM;gBAAE,OAAO,KAAK,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8DAA8D;IAC9D,cAAc,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,OAAO,EAAE;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;aAChC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ActionSequenceExtractor — Groups action records into repeatable skill candidates.
3
+ *
4
+ * Part of Task 45 — Procedural Memory.
5
+ */
6
+ import type { ActionRecord, ExtractionConfig, ActionSequenceGroup } from './types.js';
7
+ export declare class ActionSequenceExtractor {
8
+ private config;
9
+ constructor(config?: Partial<ExtractionConfig>);
10
+ /**
11
+ * Build a fingerprint for a sequence of actions: tool names joined with " -> "
12
+ */
13
+ private fingerprint;
14
+ /**
15
+ * Extract action sequence groups from a flat list of records.
16
+ *
17
+ * 1. Group records by agentSlug
18
+ * 2. Within each agent, group by runId to get per-run sequences
19
+ * 3. Fingerprint each run sequence (toolName chain)
20
+ * 4. Group runs with identical fingerprints
21
+ * 5. Filter by minSuccessCount, minAvgQualityScore, maxSequenceLength
22
+ */
23
+ extract(allRecords: ActionRecord[]): ActionSequenceGroup[];
24
+ }
25
+ //# sourceMappingURL=action-sequence-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-sequence-extractor.d.ts","sourceRoot":"","sources":["../../src/procedural/action-sequence-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGtF,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAIlD;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,mBAAmB,EAAE;CA6E3D"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * ActionSequenceExtractor — Groups action records into repeatable skill candidates.
3
+ *
4
+ * Part of Task 45 — Procedural Memory.
5
+ */
6
+ import { DEFAULT_EXTRACTION_CONFIG } from './types.js';
7
+ export class ActionSequenceExtractor {
8
+ config;
9
+ constructor(config = {}) {
10
+ this.config = { ...DEFAULT_EXTRACTION_CONFIG, ...config };
11
+ }
12
+ /**
13
+ * Build a fingerprint for a sequence of actions: tool names joined with " -> "
14
+ */
15
+ fingerprint(records) {
16
+ return records.map((r) => r.toolName).join(' -> ');
17
+ }
18
+ /**
19
+ * Extract action sequence groups from a flat list of records.
20
+ *
21
+ * 1. Group records by agentSlug
22
+ * 2. Within each agent, group by runId to get per-run sequences
23
+ * 3. Fingerprint each run sequence (toolName chain)
24
+ * 4. Group runs with identical fingerprints
25
+ * 5. Filter by minSuccessCount, minAvgQualityScore, maxSequenceLength
26
+ */
27
+ extract(allRecords) {
28
+ // Group by agentSlug
29
+ const byAgent = new Map();
30
+ for (const r of allRecords) {
31
+ const arr = byAgent.get(r.agentSlug) ?? [];
32
+ arr.push(r);
33
+ byAgent.set(r.agentSlug, arr);
34
+ }
35
+ const results = [];
36
+ for (const [agentSlug, records] of byAgent) {
37
+ // Group by runId
38
+ const byRun = new Map();
39
+ for (const r of records) {
40
+ const arr = byRun.get(r.runId) ?? [];
41
+ arr.push(r);
42
+ byRun.set(r.runId, arr);
43
+ }
44
+ // Sort each run's records by timestamp, compute fingerprint
45
+ const fingerprintGroups = new Map();
46
+ for (const [runId, runRecords] of byRun) {
47
+ const sorted = runRecords.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
48
+ // Skip sequences that exceed max length
49
+ if (sorted.length > this.config.maxSequenceLength)
50
+ continue;
51
+ const fp = this.fingerprint(sorted);
52
+ const group = fingerprintGroups.get(fp) ?? { sequences: [], runIds: [] };
53
+ group.sequences.push(sorted);
54
+ group.runIds.push(runId);
55
+ fingerprintGroups.set(fp, group);
56
+ }
57
+ // Filter and build result groups
58
+ for (const [fp, group] of fingerprintGroups) {
59
+ // Only successful runs count
60
+ const successfulSequences = group.sequences.filter((seq) => seq.every((r) => r.outcome === 'success'));
61
+ const successCount = successfulSequences.length;
62
+ if (successCount < this.config.minSuccessCount)
63
+ continue;
64
+ // Compute average quality score across all records in successful sequences
65
+ const allQualityScores = [];
66
+ for (const seq of successfulSequences) {
67
+ for (const r of seq) {
68
+ if (r.qualityScore !== undefined) {
69
+ allQualityScores.push(r.qualityScore);
70
+ }
71
+ }
72
+ }
73
+ const avgQualityScore = allQualityScores.length > 0
74
+ ? allQualityScores.reduce((a, b) => a + b, 0) / allQualityScores.length
75
+ : 0;
76
+ if (avgQualityScore < this.config.minAvgQualityScore)
77
+ continue;
78
+ results.push({
79
+ agentSlug,
80
+ fingerprint: fp,
81
+ sequences: successfulSequences,
82
+ successCount,
83
+ avgQualityScore,
84
+ runIds: group.runIds.filter((_, i) => group.sequences[i].every((r) => r.outcome === 'success')),
85
+ });
86
+ }
87
+ }
88
+ return results;
89
+ }
90
+ }
91
+ //# sourceMappingURL=action-sequence-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-sequence-extractor.js","sourceRoot":"","sources":["../../src/procedural/action-sequence-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Procedural Memory — Learn from Successful Executions
3
+ *
4
+ * Barrel export for Task 45.
5
+ *
6
+ * @module @monomind/memory/procedural
7
+ */
8
+ export type { ActionOutcome, ActionRecord, ExtractionConfig, SkillTrigger, LearnedSkill, ActionSequenceGroup, } from './types.js';
9
+ export { DEFAULT_EXTRACTION_CONFIG } from './types.js';
10
+ export { ActionRecordStore } from './action-record.js';
11
+ export { ActionSequenceExtractor } from './action-sequence-extractor.js';
12
+ export { LearnedSkillSerializer } from './learned-skill.js';
13
+ export { SkillRegistry } from './skill-registry.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/procedural/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,YAAY,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Procedural Memory — Learn from Successful Executions
3
+ *
4
+ * Barrel export for Task 45.
5
+ *
6
+ * @module @monomind/memory/procedural
7
+ */
8
+ export { DEFAULT_EXTRACTION_CONFIG } from './types.js';
9
+ export { ActionRecordStore } from './action-record.js';
10
+ export { ActionSequenceExtractor } from './action-sequence-extractor.js';
11
+ export { LearnedSkillSerializer } from './learned-skill.js';
12
+ export { SkillRegistry } from './skill-registry.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/procedural/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * LearnedSkillSerializer — Creates and serializes LearnedSkill objects.
3
+ *
4
+ * Part of Task 45 — Procedural Memory.
5
+ */
6
+ import type { ActionRecord, LearnedSkill } from './types.js';
7
+ export declare class LearnedSkillSerializer {
8
+ /**
9
+ * Create a new LearnedSkill from extracted data.
10
+ */
11
+ static create(name: string, agentSlug: string, triggerPattern: string, actionSequence: ActionRecord[], successCount: number, avgQualityScore: number, sourceRunIds: string[]): LearnedSkill;
12
+ /**
13
+ * Serialize a LearnedSkill to a markdown string with YAML frontmatter.
14
+ */
15
+ static toMarkdown(skill: LearnedSkill): string;
16
+ }
17
+ //# sourceMappingURL=learned-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learned-skill.d.ts","sourceRoot":"","sources":["../../src/procedural/learned-skill.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7D,qBAAa,sBAAsB;IACjC;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,YAAY,EAAE,EAC9B,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EAAE,GACrB,YAAY;IAqBf;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;CAsC/C"}