@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.
- package/README.md +902 -0
- package/dist/agent-memory-scope.d.ts +131 -0
- package/dist/agent-memory-scope.d.ts.map +1 -0
- package/dist/agent-memory-scope.js +230 -0
- package/dist/agent-memory-scope.js.map +1 -0
- package/dist/agentdb-adapter.d.ts +165 -0
- package/dist/agentdb-adapter.d.ts.map +1 -0
- package/dist/agentdb-adapter.js +836 -0
- package/dist/agentdb-adapter.js.map +1 -0
- package/dist/agentdb-backend.d.ts +218 -0
- package/dist/agentdb-backend.d.ts.map +1 -0
- package/dist/agentdb-backend.js +879 -0
- package/dist/agentdb-backend.js.map +1 -0
- package/dist/auto-memory-bridge.d.ts +230 -0
- package/dist/auto-memory-bridge.d.ts.map +1 -0
- package/dist/auto-memory-bridge.js +730 -0
- package/dist/auto-memory-bridge.js.map +1 -0
- package/dist/cache-manager.d.ts +134 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +410 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/checkpointer.d.ts +78 -0
- package/dist/checkpointer.d.ts.map +1 -0
- package/dist/checkpointer.js +174 -0
- package/dist/checkpointer.js.map +1 -0
- package/dist/controller-registry.d.ts +216 -0
- package/dist/controller-registry.d.ts.map +1 -0
- package/dist/controller-registry.js +897 -0
- package/dist/controller-registry.js.map +1 -0
- package/dist/database-provider.d.ts +87 -0
- package/dist/database-provider.d.ts.map +1 -0
- package/dist/database-provider.js +434 -0
- package/dist/database-provider.js.map +1 -0
- package/dist/diskann-backend.d.ts +126 -0
- package/dist/diskann-backend.d.ts.map +1 -0
- package/dist/diskann-backend.js +324 -0
- package/dist/diskann-backend.js.map +1 -0
- package/dist/episodic-store.d.ts +58 -0
- package/dist/episodic-store.d.ts.map +1 -0
- package/dist/episodic-store.js +160 -0
- package/dist/episodic-store.js.map +1 -0
- package/dist/hnsw-index.d.ts +111 -0
- package/dist/hnsw-index.d.ts.map +1 -0
- package/dist/hnsw-index.js +778 -0
- package/dist/hnsw-index.js.map +1 -0
- package/dist/hnsw-lite.d.ts +29 -0
- package/dist/hnsw-lite.d.ts.map +1 -0
- package/dist/hnsw-lite.js +236 -0
- package/dist/hnsw-lite.js.map +1 -0
- package/dist/hybrid-backend.d.ts +299 -0
- package/dist/hybrid-backend.d.ts.map +1 -0
- package/dist/hybrid-backend.js +804 -0
- package/dist/hybrid-backend.js.map +1 -0
- package/dist/index.d.ts +228 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +379 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/document-chunker.d.ts +22 -0
- package/dist/knowledge/document-chunker.d.ts.map +1 -0
- package/dist/knowledge/document-chunker.js +52 -0
- package/dist/knowledge/document-chunker.js.map +1 -0
- package/dist/knowledge/index.d.ts +12 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +9 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/knowledge-retriever.d.ts +48 -0
- package/dist/knowledge/knowledge-retriever.d.ts.map +1 -0
- package/dist/knowledge/knowledge-retriever.js +80 -0
- package/dist/knowledge/knowledge-retriever.js.map +1 -0
- package/dist/knowledge/knowledge-store.d.ts +58 -0
- package/dist/knowledge/knowledge-store.d.ts.map +1 -0
- package/dist/knowledge/knowledge-store.js +121 -0
- package/dist/knowledge/knowledge-store.js.map +1 -0
- package/dist/learning-bridge.d.ts +162 -0
- package/dist/learning-bridge.d.ts.map +1 -0
- package/dist/learning-bridge.js +522 -0
- package/dist/learning-bridge.js.map +1 -0
- package/dist/memory-graph.d.ts +123 -0
- package/dist/memory-graph.d.ts.map +1 -0
- package/dist/memory-graph.js +412 -0
- package/dist/memory-graph.js.map +1 -0
- package/dist/migration.d.ts +68 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +513 -0
- package/dist/migration.js.map +1 -0
- package/dist/partitioned-hnsw.d.ts +65 -0
- package/dist/partitioned-hnsw.d.ts.map +1 -0
- package/dist/partitioned-hnsw.js +209 -0
- package/dist/partitioned-hnsw.js.map +1 -0
- package/dist/persistent-sona.d.ts +144 -0
- package/dist/persistent-sona.d.ts.map +1 -0
- package/dist/persistent-sona.js +333 -0
- package/dist/persistent-sona.js.map +1 -0
- package/dist/procedural/action-record.d.ts +19 -0
- package/dist/procedural/action-record.d.ts.map +1 -0
- package/dist/procedural/action-record.js +51 -0
- package/dist/procedural/action-record.js.map +1 -0
- package/dist/procedural/action-sequence-extractor.d.ts +25 -0
- package/dist/procedural/action-sequence-extractor.d.ts.map +1 -0
- package/dist/procedural/action-sequence-extractor.js +91 -0
- package/dist/procedural/action-sequence-extractor.js.map +1 -0
- package/dist/procedural/index.d.ts +14 -0
- package/dist/procedural/index.d.ts.map +1 -0
- package/dist/procedural/index.js +13 -0
- package/dist/procedural/index.js.map +1 -0
- package/dist/procedural/learned-skill.d.ts +17 -0
- package/dist/procedural/learned-skill.d.ts.map +1 -0
- package/dist/procedural/learned-skill.js +73 -0
- package/dist/procedural/learned-skill.js.map +1 -0
- package/dist/procedural/procedure-extractor-worker.d.ts +27 -0
- package/dist/procedural/procedure-extractor-worker.d.ts.map +1 -0
- package/dist/procedural/procedure-extractor-worker.js +39 -0
- package/dist/procedural/procedure-extractor-worker.js.map +1 -0
- package/dist/procedural/skill-registry.d.ts +25 -0
- package/dist/procedural/skill-registry.d.ts.map +1 -0
- package/dist/procedural/skill-registry.js +56 -0
- package/dist/procedural/skill-registry.js.map +1 -0
- package/dist/procedural/types.d.ts +67 -0
- package/dist/procedural/types.d.ts.map +1 -0
- package/dist/procedural/types.js +15 -0
- package/dist/procedural/types.js.map +1 -0
- package/dist/prompt-version-store.d.ts +59 -0
- package/dist/prompt-version-store.d.ts.map +1 -0
- package/dist/prompt-version-store.js +175 -0
- package/dist/prompt-version-store.js.map +1 -0
- package/dist/query-builder.d.ts +52 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +134 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/rvf-backend.d.ts +51 -0
- package/dist/rvf-backend.d.ts.map +1 -0
- package/dist/rvf-backend.js +499 -0
- package/dist/rvf-backend.js.map +1 -0
- package/dist/rvf-learning-store.d.ts +141 -0
- package/dist/rvf-learning-store.d.ts.map +1 -0
- package/dist/rvf-learning-store.js +344 -0
- package/dist/rvf-learning-store.js.map +1 -0
- package/dist/rvf-migration.d.ts +45 -0
- package/dist/rvf-migration.d.ts.map +1 -0
- package/dist/rvf-migration.js +254 -0
- package/dist/rvf-migration.js.map +1 -0
- package/dist/sqlite-backend.d.ts +127 -0
- package/dist/sqlite-backend.d.ts.map +1 -0
- package/dist/sqlite-backend.js +618 -0
- package/dist/sqlite-backend.js.map +1 -0
- package/dist/sqljs-backend.d.ts +128 -0
- package/dist/sqljs-backend.d.ts.map +1 -0
- package/dist/sqljs-backend.js +611 -0
- package/dist/sqljs-backend.js.map +1 -0
- package/dist/tier-manager.d.ts +79 -0
- package/dist/tier-manager.d.ts.map +1 -0
- package/dist/tier-manager.js +169 -0
- package/dist/tier-manager.js.map +1 -0
- package/dist/tiers/contextual.d.ts +43 -0
- package/dist/tiers/contextual.d.ts.map +1 -0
- package/dist/tiers/contextual.js +102 -0
- package/dist/tiers/contextual.js.map +1 -0
- package/dist/tiers/entity.d.ts +46 -0
- package/dist/tiers/entity.d.ts.map +1 -0
- package/dist/tiers/entity.js +106 -0
- package/dist/tiers/entity.js.map +1 -0
- package/dist/tiers/index.d.ts +4 -0
- package/dist/tiers/index.d.ts.map +1 -0
- package/dist/tiers/index.js +4 -0
- package/dist/tiers/index.js.map +1 -0
- package/dist/tiers/short-term.d.ts +42 -0
- package/dist/tiers/short-term.d.ts.map +1 -0
- package/dist/tiers/short-term.js +89 -0
- package/dist/tiers/short-term.js.map +1 -0
- package/dist/types/checkpoint.d.ts +44 -0
- package/dist/types/checkpoint.d.ts.map +1 -0
- package/dist/types/checkpoint.js +8 -0
- package/dist/types/checkpoint.js.map +1 -0
- package/dist/types.d.ts +526 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +58 -0
- package/dist/types.js.map +1 -0
- 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"}
|