@claude-flow/memory 3.0.7 → 3.0.8
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/dist/agentdb-backend-hnsw.test.d.ts +2 -0
- package/dist/agentdb-backend-hnsw.test.d.ts.map +1 -0
- package/dist/agentdb-backend-hnsw.test.js +269 -0
- package/dist/agentdb-backend-hnsw.test.js.map +1 -0
- package/dist/agentdb-backend-optional.test.d.ts +2 -0
- package/dist/agentdb-backend-optional.test.d.ts.map +1 -0
- package/dist/agentdb-backend-optional.test.js +49 -0
- package/dist/agentdb-backend-optional.test.js.map +1 -0
- package/dist/agentdb-backend.d.ts +13 -33
- package/dist/agentdb-backend.d.ts.map +1 -1
- package/dist/agentdb-backend.js +136 -161
- package/dist/agentdb-backend.js.map +1 -1
- package/dist/agentdb-hnsw-adapter.d.ts +36 -0
- package/dist/agentdb-hnsw-adapter.d.ts.map +1 -0
- package/dist/agentdb-hnsw-adapter.js +151 -0
- package/dist/agentdb-hnsw-adapter.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
export class AgentDBHnswAdapter {
|
|
2
|
+
Index;
|
|
3
|
+
config;
|
|
4
|
+
index;
|
|
5
|
+
ids = new Map();
|
|
6
|
+
revision = 0;
|
|
7
|
+
building;
|
|
8
|
+
searching = Promise.resolve();
|
|
9
|
+
failed = false;
|
|
10
|
+
buildTime = 0;
|
|
11
|
+
constructor(Index, config) {
|
|
12
|
+
this.Index = Index;
|
|
13
|
+
this.config = config;
|
|
14
|
+
// hnswlib-node coerces these values to uint32, rather than validating them.
|
|
15
|
+
const uint = (value) => Number.isInteger(value) && value > 0 && value <= 0xffffffff;
|
|
16
|
+
this.failed = !uint(config.dimension) || !uint(config.efConstruction) ||
|
|
17
|
+
!uint(config.efSearch) || !uint(config.M) || config.M < 2 || config.M > 10000;
|
|
18
|
+
}
|
|
19
|
+
normalize(vector) {
|
|
20
|
+
// Accumulate in JS double precision: the native cosine implementation can
|
|
21
|
+
// overflow/underflow its float32 norm even when all coordinates are finite.
|
|
22
|
+
let squaredNorm = 0;
|
|
23
|
+
for (const value of vector)
|
|
24
|
+
squaredNorm += value * value;
|
|
25
|
+
const norm = Math.sqrt(squaredNorm);
|
|
26
|
+
return Float32Array.from(vector, (value) => norm === 0 ? 0 : value / norm);
|
|
27
|
+
}
|
|
28
|
+
invalidate() {
|
|
29
|
+
this.revision++;
|
|
30
|
+
// An in-flight search owns its old instance until it completes. Do not
|
|
31
|
+
// clear that instance beneath it; the revision check rejects stale results.
|
|
32
|
+
this.index = undefined;
|
|
33
|
+
this.ids = new Map();
|
|
34
|
+
}
|
|
35
|
+
async build(getEntries) {
|
|
36
|
+
if (this.failed)
|
|
37
|
+
return false;
|
|
38
|
+
if (this.index)
|
|
39
|
+
return true;
|
|
40
|
+
if (this.building)
|
|
41
|
+
return this.building;
|
|
42
|
+
const revision = this.revision;
|
|
43
|
+
const vectors = getEntries().filter((entry) => entry.embedding);
|
|
44
|
+
if (vectors.length === 0)
|
|
45
|
+
return false;
|
|
46
|
+
// Never feed malformed data to a native addon. Preserve fallback behavior
|
|
47
|
+
// for callers whose embedding dimensions do not match the configured index.
|
|
48
|
+
if (vectors.some(({ embedding }) => embedding.length !== this.config.dimension ||
|
|
49
|
+
!embedding.every(Number.isFinite)))
|
|
50
|
+
return false;
|
|
51
|
+
const ids = new Map(vectors.map((entry, id) => [id, entry.id]));
|
|
52
|
+
const rows = vectors.map((entry, id) => ({
|
|
53
|
+
id,
|
|
54
|
+
embedding: this.normalize(entry.embedding),
|
|
55
|
+
}));
|
|
56
|
+
this.building = (async () => {
|
|
57
|
+
try {
|
|
58
|
+
// HNSWIndex reads this one fixed query. No user-controlled SQL, tables,
|
|
59
|
+
// filters, native persistence sidecars, or shared AgentDB controller.
|
|
60
|
+
const db = {
|
|
61
|
+
prepare(sql) {
|
|
62
|
+
if (sql.replace(/\s+/g, ' ').trim() !==
|
|
63
|
+
'SELECT pattern_id as id, embedding FROM pattern_embeddings') {
|
|
64
|
+
throw new Error('Unsupported HNSW snapshot query');
|
|
65
|
+
}
|
|
66
|
+
return { all: () => rows };
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
const candidate = new this.Index(db, {
|
|
70
|
+
...this.config,
|
|
71
|
+
metric: 'cosine',
|
|
72
|
+
persistIndex: false,
|
|
73
|
+
// Do not preallocate the backend's million-entry default capacity.
|
|
74
|
+
maxElements: rows.length,
|
|
75
|
+
});
|
|
76
|
+
const start = performance.now();
|
|
77
|
+
await candidate.buildIndex();
|
|
78
|
+
if (revision !== this.revision || !candidate.isReady())
|
|
79
|
+
return false;
|
|
80
|
+
this.buildTime = performance.now() - start;
|
|
81
|
+
this.index = candidate;
|
|
82
|
+
this.ids = ids;
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// A missing/incompatible native addon must not break semantic search or
|
|
87
|
+
// throw/log the same exception on every request. Retry on reinitialize.
|
|
88
|
+
this.failed = true;
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
})();
|
|
92
|
+
try {
|
|
93
|
+
return await this.building;
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
this.building = undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async search(getEntries, embedding, k, ef) {
|
|
100
|
+
embedding = new Float32Array(embedding);
|
|
101
|
+
if (!Number.isInteger(k) || k <= 0 || k > 0xffffffff ||
|
|
102
|
+
embedding.length !== this.config.dimension ||
|
|
103
|
+
!embedding.every(Number.isFinite))
|
|
104
|
+
return undefined;
|
|
105
|
+
const query = this.normalize(embedding);
|
|
106
|
+
if (!await this.build(getEntries))
|
|
107
|
+
return undefined;
|
|
108
|
+
const index = this.index;
|
|
109
|
+
const ids = this.ids;
|
|
110
|
+
const revision = this.revision;
|
|
111
|
+
if (!index)
|
|
112
|
+
return undefined;
|
|
113
|
+
// Upstream search awaits initialize() before touching the native index.
|
|
114
|
+
// Serialize calls so per-query ef cannot be changed by another request.
|
|
115
|
+
const result = this.searching.then(async () => {
|
|
116
|
+
if (revision !== this.revision || this.failed)
|
|
117
|
+
return undefined;
|
|
118
|
+
try {
|
|
119
|
+
const expansion = ef ?? this.config.efSearch;
|
|
120
|
+
if (Number.isInteger(expansion) && expansion > 0 && expansion <= 0xffffffff &&
|
|
121
|
+
expansion !== index.getStats().efSearch) {
|
|
122
|
+
index.setEfSearch(expansion);
|
|
123
|
+
}
|
|
124
|
+
const results = await index.search(query, Math.min(k, ids.size));
|
|
125
|
+
if (revision !== this.revision)
|
|
126
|
+
return undefined;
|
|
127
|
+
return results.map((result) => ids.get(result.id)).filter((id) => id !== undefined);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
this.failed = true;
|
|
131
|
+
this.invalidate();
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
this.searching = result;
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
getStats() {
|
|
139
|
+
if (!this.index?.isReady() || this.failed)
|
|
140
|
+
return undefined;
|
|
141
|
+
const stats = this.index.getStats();
|
|
142
|
+
return {
|
|
143
|
+
vectorCount: stats.numElements,
|
|
144
|
+
memoryUsage: 0, // Native allocation size is not exposed by agentdb.
|
|
145
|
+
avgSearchTime: stats.avgSearchTimeMs,
|
|
146
|
+
buildTime: this.buildTime,
|
|
147
|
+
compressionRatio: 1,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=agentdb-hnsw-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentdb-hnsw-adapter.js","sourceRoot":"","sources":["../src/agentdb-hnsw-adapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED