@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,209 @@
1
+ /**
2
+ * PartitionedHNSW — Timestamp-partitioned HNSW sub-indexes for temporal locality
3
+ *
4
+ * Partitions the HNSW vector index into time-bucket sub-indexes so that recent
5
+ * entries are searched first, dramatically reducing average search latency for
6
+ * workloads where recency correlates with relevance.
7
+ *
8
+ * Architecture:
9
+ * - Entries are routed to a bucket based on Math.floor(createdAt / bucketMs)
10
+ * - Each bucket owns an independent HNSWIndex (lazy-created)
11
+ * - Search merges results across buckets, sorted by recency then similarity
12
+ * - Old buckets can be evicted once they exceed maxBuckets
13
+ *
14
+ * Source: ICDE 2025 Timestamp-Partitioned HNSW
15
+ *
16
+ * @module v1/memory/partitioned-hnsw
17
+ */
18
+ function cosineSim(a, b) {
19
+ if (a.length !== b.length || a.length === 0)
20
+ return 0;
21
+ let dot = 0;
22
+ for (let i = 0; i < a.length; i++)
23
+ dot += a[i] * b[i];
24
+ // Vectors are pre-normalised, so dot == cosine similarity
25
+ return dot;
26
+ }
27
+ function l2Norm(v) {
28
+ let sum = 0;
29
+ for (let i = 0; i < v.length; i++)
30
+ sum += v[i] * v[i];
31
+ const len = Math.sqrt(sum);
32
+ if (len === 0)
33
+ return v;
34
+ const out = new Float32Array(v.length);
35
+ for (let i = 0; i < v.length; i++)
36
+ out[i] = v[i] / len;
37
+ return out;
38
+ }
39
+ class TimeBucket {
40
+ entries = [];
41
+ _oldest = Infinity;
42
+ _newest = 0;
43
+ add(entry) {
44
+ const normVec = entry.embedding ? l2Norm(entry.embedding) : null;
45
+ this.entries.push({ entry, normVec });
46
+ if (entry.createdAt < this._oldest)
47
+ this._oldest = entry.createdAt;
48
+ if (entry.createdAt > this._newest)
49
+ this._newest = entry.createdAt;
50
+ }
51
+ remove(id) {
52
+ const idx = this.entries.findIndex(e => e.entry.id === id);
53
+ if (idx === -1)
54
+ return false;
55
+ const removed = this.entries.splice(idx, 1)[0];
56
+ // Recompute _oldest/_newest if the removed entry was an extremum
57
+ if (removed.entry.createdAt === this._oldest || removed.entry.createdAt === this._newest) {
58
+ this._oldest = Infinity;
59
+ this._newest = 0;
60
+ for (const e of this.entries) {
61
+ if (e.entry.createdAt < this._oldest)
62
+ this._oldest = e.entry.createdAt;
63
+ if (e.entry.createdAt > this._newest)
64
+ this._newest = e.entry.createdAt;
65
+ }
66
+ }
67
+ return true;
68
+ }
69
+ /** Approximate k-NN by brute-force within the bucket (buckets are small). */
70
+ search(queryVec, limit, textQuery) {
71
+ const scored = this.entries.map(({ entry, normVec }) => {
72
+ let score = 0;
73
+ if (queryVec && normVec) {
74
+ score = cosineSim(queryVec, normVec);
75
+ }
76
+ else if (textQuery) {
77
+ // Keyword fallback: count overlapping terms
78
+ const terms = textQuery.toLowerCase().split(/\s+/);
79
+ const content = entry.content.toLowerCase();
80
+ const hits = terms.filter(t => content.includes(t)).length;
81
+ score = hits / Math.max(terms.length, 1);
82
+ }
83
+ return { entry, score };
84
+ });
85
+ scored.sort((a, b) => b.score - a.score);
86
+ return scored.slice(0, limit);
87
+ }
88
+ get size() { return this.entries.length; }
89
+ get oldest() { return this.entries.length ? this._oldest : Infinity; }
90
+ get newest() { return this.entries.length ? this._newest : 0; }
91
+ }
92
+ // ===== PartitionedHNSW =====
93
+ export class PartitionedHNSW {
94
+ bucketMs;
95
+ maxBuckets;
96
+ k;
97
+ /** bucketKey → TimeBucket, ordered newest-first via insertion order */
98
+ buckets = new Map();
99
+ constructor(config = {}) {
100
+ this.bucketMs = config.bucketMs ?? 60 * 60 * 1000; // 1 hour default
101
+ this.maxBuckets = config.maxBuckets ?? 48; // 48 hours default retention
102
+ this.k = config.k ?? 16;
103
+ }
104
+ /** Add a memory entry to its time-bucket. */
105
+ add(entry) {
106
+ const bucketKey = this.bucketKeyFor(entry.createdAt);
107
+ if (!this.buckets.has(bucketKey)) {
108
+ this.buckets.set(bucketKey, new TimeBucket());
109
+ this.evictOldBuckets();
110
+ // After eviction the bucket we just created may have been removed
111
+ // (entry predates the retention window) — discard it silently.
112
+ if (!this.buckets.has(bucketKey))
113
+ return;
114
+ }
115
+ this.buckets.get(bucketKey).add(entry);
116
+ }
117
+ /**
118
+ * Search across partitions, newest buckets first.
119
+ * Stops early once `limit` results are collected or all buckets exhausted.
120
+ *
121
+ * @param queryEmbedding - optional query vector (cosine similarity)
122
+ * @param textQuery - optional keyword fallback
123
+ * @param limit - max results
124
+ * @param fromMs - optional lower bound on createdAt (temporal filter)
125
+ * @param toMs - optional upper bound on createdAt (temporal filter)
126
+ */
127
+ search(queryEmbedding, textQuery, limit, fromMs, toMs) {
128
+ const normQuery = queryEmbedding ? l2Norm(queryEmbedding) : null;
129
+ // Collect buckets in descending (newest-first) order
130
+ const sortedKeys = [...this.buckets.keys()].sort((a, b) => b - a);
131
+ const candidates = [];
132
+ for (const key of sortedKeys) {
133
+ // Skip buckets entirely outside the temporal filter
134
+ const bucket = this.buckets.get(key);
135
+ if (fromMs !== undefined && bucket.newest < fromMs)
136
+ continue;
137
+ if (toMs !== undefined && bucket.oldest > toMs)
138
+ continue;
139
+ const hits = bucket.search(normQuery, Math.max(limit, this.k), textQuery);
140
+ for (const h of hits) {
141
+ if (fromMs !== undefined && h.entry.createdAt < fromMs)
142
+ continue;
143
+ if (toMs !== undefined && h.entry.createdAt > toMs)
144
+ continue;
145
+ candidates.push({ ...h, bucketKey: key });
146
+ }
147
+ }
148
+ // Sort by score desc, then by recency (bucketKey desc) as tiebreak
149
+ candidates.sort((a, b) => b.score - a.score || b.bucketKey - a.bucketKey);
150
+ const seen = new Set();
151
+ const results = [];
152
+ for (const { entry } of candidates) {
153
+ if (!seen.has(entry.id)) {
154
+ seen.add(entry.id);
155
+ results.push(entry);
156
+ }
157
+ if (results.length >= limit)
158
+ break;
159
+ }
160
+ return results;
161
+ }
162
+ /**
163
+ * Remove an entry from its time-bucket by id and original createdAt timestamp.
164
+ * Returns true if the entry was found and removed, false otherwise.
165
+ */
166
+ remove(id, createdAt) {
167
+ const bucketKey = this.bucketKeyFor(createdAt);
168
+ const bucket = this.buckets.get(bucketKey);
169
+ if (!bucket)
170
+ return false;
171
+ return bucket.remove(id);
172
+ }
173
+ /** Stats per bucket for observability. */
174
+ bucketStats() {
175
+ return [...this.buckets.entries()].map(([key, bucket]) => ({
176
+ bucketKey: key,
177
+ entryCount: bucket.size,
178
+ oldestMs: bucket.oldest,
179
+ newestMs: bucket.newest,
180
+ }));
181
+ }
182
+ get totalEntries() {
183
+ let n = 0;
184
+ for (const b of this.buckets.values())
185
+ n += b.size;
186
+ return n;
187
+ }
188
+ // ------------------------------------------------------------------
189
+ // Private helpers
190
+ // ------------------------------------------------------------------
191
+ bucketKeyFor(createdAt) {
192
+ return Math.floor(createdAt / this.bucketMs);
193
+ }
194
+ /** Evict the oldest bucket(s) when we exceed maxBuckets. */
195
+ evictOldBuckets() {
196
+ while (this.buckets.size > this.maxBuckets) {
197
+ // Find the smallest bucket key (oldest in time), not first in insertion order.
198
+ // Insertion order diverges from temporal order during bulk inserts or migrations.
199
+ let oldestKey;
200
+ for (const k of this.buckets.keys()) {
201
+ if (oldestKey === undefined || k < oldestKey)
202
+ oldestKey = k;
203
+ }
204
+ if (oldestKey !== undefined)
205
+ this.buckets.delete(oldestKey);
206
+ }
207
+ }
208
+ }
209
+ //# sourceMappingURL=partitioned-hnsw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partitioned-hnsw.js","sourceRoot":"","sources":["../src/partitioned-hnsw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
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 type { PatternRecord, TrajectoryRecord } from './rvf-learning-store.js';
15
+ export interface PersistentSonaConfig {
16
+ /** Path to the RVF learning store file */
17
+ storePath: string;
18
+ /** Cosine similarity threshold for pattern matching (default: 0.85) */
19
+ patternThreshold?: number;
20
+ /** Maximum buffered trajectories before oldest are evicted (default: 1000) */
21
+ maxTrajectoryBuffer?: number;
22
+ /** Auto-persist interval in ms (default: 30000) */
23
+ autoPersistInterval?: number;
24
+ /** Enable verbose logging (default: false) */
25
+ verbose?: boolean;
26
+ }
27
+ /**
28
+ * Coordinates SONA learning with persistent storage.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const sona = new PersistentSonaCoordinator({
33
+ * storePath: './data/sona-learning.rvls',
34
+ * });
35
+ * await sona.initialize();
36
+ *
37
+ * // Store a pattern
38
+ * const id = sona.storePattern('query_response', embedding);
39
+ *
40
+ * // Find similar patterns
41
+ * const matches = sona.findSimilarPatterns(queryEmbedding, 5);
42
+ *
43
+ * // Record a trajectory
44
+ * sona.recordTrajectory({ id: 'traj-1', steps: [...], outcome: 'success', ... });
45
+ *
46
+ * // Periodic background learning
47
+ * const result = sona.runBackgroundLoop();
48
+ *
49
+ * await sona.shutdown();
50
+ * ```
51
+ */
52
+ export declare class PersistentSonaCoordinator {
53
+ private store;
54
+ private patterns;
55
+ private trajectoryBuffer;
56
+ private ewcState;
57
+ private patternThreshold;
58
+ private maxTrajectoryBuffer;
59
+ private verbose;
60
+ private initialized;
61
+ constructor(config: PersistentSonaConfig);
62
+ /**
63
+ * Initialize by loading persisted state from the RVF store.
64
+ */
65
+ initialize(): Promise<void>;
66
+ /**
67
+ * Store a new pattern and return its ID.
68
+ *
69
+ * @param type - Pattern type (e.g. 'query_response', 'routing')
70
+ * @param embedding - The pattern embedding vector
71
+ * @param metadata - Optional extra metadata (currently unused, reserved)
72
+ * @returns The generated pattern ID
73
+ */
74
+ storePattern(type: string, embedding: number[], metadata?: Record<string, unknown>): string;
75
+ /**
76
+ * Find the k most similar patterns above the configured threshold.
77
+ * Uses brute-force cosine similarity (suitable for small pattern sets).
78
+ */
79
+ findSimilarPatterns(embedding: number[], k?: number): PatternRecord[];
80
+ /**
81
+ * Record a pattern usage outcome. Updates the success rate using an
82
+ * exponential moving average (alpha = 0.1).
83
+ */
84
+ recordPatternUsage(patternId: string, success: boolean): void;
85
+ /**
86
+ * Remove patterns that have low success rates after sufficient usage.
87
+ *
88
+ * @returns The number of patterns pruned
89
+ */
90
+ prunePatterns(minSuccessRate?: number, minUseCount?: number): number;
91
+ /**
92
+ * Buffer a completed trajectory for later processing.
93
+ * When the buffer exceeds maxTrajectoryBuffer, the oldest entries
94
+ * are evicted.
95
+ */
96
+ recordTrajectory(trajectory: TrajectoryRecord): void;
97
+ /**
98
+ * Process buffered trajectories to extract new patterns.
99
+ * Successful and partial trajectories are mined for high-confidence
100
+ * steps; new patterns are stored if they are sufficiently different
101
+ * from existing ones.
102
+ *
103
+ * After processing, the trajectory buffer is cleared and low-performing
104
+ * patterns are pruned.
105
+ *
106
+ * @returns Summary of the learning pass
107
+ */
108
+ runBackgroundLoop(): {
109
+ patternsLearned: number;
110
+ trajectoriesProcessed: number;
111
+ };
112
+ /**
113
+ * Flush current in-memory state to the RVF store on disk.
114
+ */
115
+ persist(): Promise<void>;
116
+ /**
117
+ * Persist state and shut down the store.
118
+ */
119
+ shutdown(): Promise<void>;
120
+ /**
121
+ * Return a summary of the coordinator's current state.
122
+ */
123
+ getStats(): {
124
+ patterns: number;
125
+ avgSuccessRate: number;
126
+ trajectoriesBuffered: number;
127
+ ewcTasksLearned: number;
128
+ };
129
+ /**
130
+ * Extract patterns from a trajectory's high-confidence steps.
131
+ * A step produces a new pattern only if no sufficiently similar
132
+ * pattern already exists.
133
+ */
134
+ private extractPatternsFromTrajectory;
135
+ /**
136
+ * Deterministic hash-based embedding for pattern extraction.
137
+ * This is a lightweight stand-in for a real embedding model,
138
+ * matching the approach used in SonaCoordinator.
139
+ */
140
+ private createHashEmbedding;
141
+ private ensureInitialized;
142
+ private log;
143
+ }
144
+ //# sourceMappingURL=persistent-sona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistent-sona.d.ts","sourceRoot":"","sources":["../src/persistent-sona.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAEV,aAAa,EAEb,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA2CD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,oBAAoB;IAcxC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BjC;;;;;;;OAOG;IACH,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,MAAM;IAqBT;;;OAGG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,GAAE,MAAU,GAAG,aAAa,EAAE;IAkBxE;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAc7D;;;;OAIG;IACH,aAAa,CAAC,cAAc,GAAE,MAAY,EAAE,WAAW,GAAE,MAAU,GAAG,MAAM;IAsB5E;;;;OAIG;IACH,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI;IAgBpD;;;;;;;;;;OAUG;IACH,iBAAiB,IAAI;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,MAAM,CAAC;KAC/B;IAyBD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAe9B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAW/B;;OAEG;IACH,QAAQ,IAAI;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,EAAE,MAAM,CAAC;KACzB;IAkBD;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IAkBrC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,GAAG;CAMZ"}