agentdb 3.1.0 → 3.3.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 +13 -0
- package/dist/src/controllers/ReasoningBank.d.ts +36 -0
- package/dist/src/controllers/ReasoningBank.d.ts.map +1 -1
- package/dist/src/controllers/ReasoningBank.js +123 -1
- package/dist/src/controllers/ReasoningBank.js.map +1 -1
- package/dist/src/controllers/ReflexionMemory.d.ts +75 -0
- package/dist/src/controllers/ReflexionMemory.d.ts.map +1 -1
- package/dist/src/controllers/ReflexionMemory.js +292 -10
- package/dist/src/controllers/ReflexionMemory.js.map +1 -1
- package/dist/src/controllers/SkillLibrary.d.ts +50 -0
- package/dist/src/controllers/SkillLibrary.d.ts.map +1 -1
- package/dist/src/controllers/SkillLibrary.js +220 -9
- package/dist/src/controllers/SkillLibrary.js.map +1 -1
- package/dist/src/controllers/crud-helpers.d.ts +45 -0
- package/dist/src/controllers/crud-helpers.d.ts.map +1 -0
- package/dist/src/controllers/crud-helpers.js +130 -0
- package/dist/src/controllers/crud-helpers.js.map +1 -0
- package/dist/src/controllers/episode-hybrid.d.ts +82 -0
- package/dist/src/controllers/episode-hybrid.d.ts.map +1 -0
- package/dist/src/controllers/episode-hybrid.js +140 -0
- package/dist/src/controllers/episode-hybrid.js.map +1 -0
- package/dist/src/mcp/agentdb-mcp-server.js +373 -47
- package/dist/src/mcp/agentdb-mcp-server.js.map +1 -1
- package/dist/src/search/conversation-retrieval.d.ts +61 -0
- package/dist/src/search/conversation-retrieval.d.ts.map +1 -0
- package/dist/src/search/conversation-retrieval.js +190 -0
- package/dist/src/search/conversation-retrieval.js.map +1 -0
- package/dist/src/search/cross-encoder.d.ts +17 -0
- package/dist/src/search/cross-encoder.d.ts.map +1 -0
- package/dist/src/search/cross-encoder.js +52 -0
- package/dist/src/search/cross-encoder.js.map +1 -0
- package/dist/src/security/mcp-policy.d.ts.map +1 -1
- package/dist/src/security/mcp-policy.js +13 -0
- package/dist/src/security/mcp-policy.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation-memory retrieval: hybrid dense + BM25 ranking of chunks, aggregated to the memory unit a caller
|
|
3
|
+
* asks for (a session, an episode). ADR-016.
|
|
4
|
+
*
|
|
5
|
+
* Pure functions over plain arrays, so the MCP search path and the LongMemEval harness run the same code.
|
|
6
|
+
* Every input that can come from a tool call is bounded: text is cut before tokenising, the token count per
|
|
7
|
+
* document and per query is capped, and the tokeniser regex has no nesting (linear time).
|
|
8
|
+
*/
|
|
9
|
+
/** Limits applied to untrusted text before it is tokenised. */
|
|
10
|
+
export const RETRIEVAL_LIMITS = Object.freeze({
|
|
11
|
+
maxCharsPerText: 32_768,
|
|
12
|
+
maxTokensPerDoc: 4_096,
|
|
13
|
+
maxQueryTokens: 256,
|
|
14
|
+
});
|
|
15
|
+
const STOPWORDS = new Set(('a an and are as at be been but by can could did do does doing for from had has have having he her hers him his how i if in into is it its ' +
|
|
16
|
+
'me my myself no nor not of off on once only or other our ours out over own same she should so some such than that the their theirs them ' +
|
|
17
|
+
'then there these they this those through to too under until up very was we were what when where which while who whom why will with would you ' +
|
|
18
|
+
'your yours yourself just also about any all am again against because before being below between both down during each few further here more ' +
|
|
19
|
+
'most s t don now ll re ve d m o y')
|
|
20
|
+
.split(' '));
|
|
21
|
+
/** Lower-cased word tokens without stopwords, capped at `maxTokens`. Linear in the (already capped) input. */
|
|
22
|
+
export function tokenize(text, maxTokens = RETRIEVAL_LIMITS.maxTokensPerDoc) {
|
|
23
|
+
const src = text.length > RETRIEVAL_LIMITS.maxCharsPerText ? text.slice(0, RETRIEVAL_LIMITS.maxCharsPerText) : text;
|
|
24
|
+
const out = [];
|
|
25
|
+
for (const m of src.toLowerCase().matchAll(/[\p{L}\p{N}]+/gu)) {
|
|
26
|
+
const tok = m[0];
|
|
27
|
+
if (tok.length < 2 && !/\d/.test(tok))
|
|
28
|
+
continue;
|
|
29
|
+
if (STOPWORDS.has(tok))
|
|
30
|
+
continue;
|
|
31
|
+
out.push(tok.length > 6 ? lightStem(tok) : tok);
|
|
32
|
+
if (out.length >= maxTokens)
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/** A small suffix stripper: plural and common verb endings only, so "hiking"/"hikes"/"hiked" share a term. */
|
|
38
|
+
function lightStem(tok) {
|
|
39
|
+
if (tok.endsWith('ies'))
|
|
40
|
+
return tok.slice(0, -3) + 'y';
|
|
41
|
+
if (tok.endsWith('ing'))
|
|
42
|
+
return tok.slice(0, -3);
|
|
43
|
+
if (tok.endsWith('ed'))
|
|
44
|
+
return tok.slice(0, -2);
|
|
45
|
+
if (tok.endsWith('es'))
|
|
46
|
+
return tok.slice(0, -2);
|
|
47
|
+
if (tok.endsWith('s') && !tok.endsWith('ss'))
|
|
48
|
+
return tok.slice(0, -1);
|
|
49
|
+
return tok;
|
|
50
|
+
}
|
|
51
|
+
/** Okapi BM25 over a document set that can grow by appending (`add`). */
|
|
52
|
+
export class Bm25Index {
|
|
53
|
+
postings = new Map();
|
|
54
|
+
lengths = [];
|
|
55
|
+
total = 0;
|
|
56
|
+
k1;
|
|
57
|
+
b;
|
|
58
|
+
constructor(docs = [], k1 = 1.2, b = 0.75) {
|
|
59
|
+
this.k1 = k1;
|
|
60
|
+
this.b = b;
|
|
61
|
+
for (const tokens of docs)
|
|
62
|
+
this.add(tokens);
|
|
63
|
+
}
|
|
64
|
+
get size() {
|
|
65
|
+
return this.lengths.length;
|
|
66
|
+
}
|
|
67
|
+
/** Appends a document; its index is the previous `size`. */
|
|
68
|
+
add(tokens) {
|
|
69
|
+
const doc = this.lengths.length;
|
|
70
|
+
this.lengths.push(tokens.length);
|
|
71
|
+
this.total += tokens.length;
|
|
72
|
+
const tf = new Map();
|
|
73
|
+
for (const t of tokens)
|
|
74
|
+
tf.set(t, (tf.get(t) ?? 0) + 1);
|
|
75
|
+
for (const [term, n] of tf) {
|
|
76
|
+
let list = this.postings.get(term);
|
|
77
|
+
if (!list)
|
|
78
|
+
this.postings.set(term, (list = []));
|
|
79
|
+
list.push({ doc, tf: n });
|
|
80
|
+
}
|
|
81
|
+
return doc;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Replace document `doc` in place. `oldTokens` must be the tokens it was indexed with: their postings
|
|
85
|
+
* are removed, the new ones added, and the length statistics adjusted. O(postings of the touched terms).
|
|
86
|
+
*/
|
|
87
|
+
replace(doc, oldTokens, newTokens) {
|
|
88
|
+
if (doc < 0 || doc >= this.lengths.length)
|
|
89
|
+
throw new RangeError(`no document ${doc}`);
|
|
90
|
+
for (const term of new Set(oldTokens)) {
|
|
91
|
+
const list = this.postings.get(term);
|
|
92
|
+
if (!list)
|
|
93
|
+
continue;
|
|
94
|
+
const kept = list.filter(p => p.doc !== doc);
|
|
95
|
+
if (kept.length)
|
|
96
|
+
this.postings.set(term, kept);
|
|
97
|
+
else
|
|
98
|
+
this.postings.delete(term);
|
|
99
|
+
}
|
|
100
|
+
this.total += newTokens.length - this.lengths[doc];
|
|
101
|
+
this.lengths[doc] = newTokens.length;
|
|
102
|
+
const tf = new Map();
|
|
103
|
+
for (const t of newTokens)
|
|
104
|
+
tf.set(t, (tf.get(t) ?? 0) + 1);
|
|
105
|
+
for (const [term, n] of tf) {
|
|
106
|
+
let list = this.postings.get(term);
|
|
107
|
+
if (!list)
|
|
108
|
+
this.postings.set(term, (list = []));
|
|
109
|
+
list.push({ doc, tf: n });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** BM25 score of every document for the query tokens (0 where no term matches). */
|
|
113
|
+
score(query) {
|
|
114
|
+
const n = this.lengths.length;
|
|
115
|
+
const scores = new Float64Array(n);
|
|
116
|
+
const avgLen = n ? this.total / n || 1 : 1;
|
|
117
|
+
for (const term of new Set(query.slice(0, RETRIEVAL_LIMITS.maxQueryTokens))) {
|
|
118
|
+
const list = this.postings.get(term);
|
|
119
|
+
if (!list)
|
|
120
|
+
continue;
|
|
121
|
+
const idf = Math.log(1 + (n - list.length + 0.5) / (list.length + 0.5));
|
|
122
|
+
for (const { doc, tf } of list) {
|
|
123
|
+
const norm = tf + this.k1 * (1 - this.b + (this.b * this.lengths[doc]) / avgLen);
|
|
124
|
+
scores[doc] += idf * ((tf * (this.k1 + 1)) / norm);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return scores;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Dot product of a query vector with each row; equal to cosine when all vectors are L2-normalised. */
|
|
131
|
+
export function dotScores(query, rows) {
|
|
132
|
+
const out = new Float64Array(rows.length);
|
|
133
|
+
const d = query.length;
|
|
134
|
+
for (let r = 0; r < rows.length; r++) {
|
|
135
|
+
const row = rows[r];
|
|
136
|
+
if (row.length !== d)
|
|
137
|
+
throw new Error(`dimension mismatch: query ${d}, row ${r} ${row.length}`);
|
|
138
|
+
let s = 0;
|
|
139
|
+
for (let i = 0; i < d; i++)
|
|
140
|
+
s += query[i] * row[i];
|
|
141
|
+
out[r] = s;
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
/** 1-based rank of each entry under a descending sort; entries that must not count (score <= floor) get rank Infinity. */
|
|
146
|
+
export function ranksOf(scores, floor = -Infinity) {
|
|
147
|
+
const idx = Array.from({ length: scores.length }, (_, i) => i).filter(i => scores[i] > floor);
|
|
148
|
+
idx.sort((a, z) => scores[z] - scores[a] || a - z);
|
|
149
|
+
const ranks = new Float64Array(scores.length).fill(Infinity);
|
|
150
|
+
idx.forEach((doc, r) => (ranks[doc] = r + 1));
|
|
151
|
+
return ranks;
|
|
152
|
+
}
|
|
153
|
+
/** Weighted reciprocal-rank fusion of a dense and a lexical score list over the same documents. */
|
|
154
|
+
export function fuseHybrid(dense, lexical, opts = {}) {
|
|
155
|
+
const k = opts.rrfK ?? 60;
|
|
156
|
+
const wd = opts.denseWeight ?? 1;
|
|
157
|
+
const wl = lexical ? opts.lexicalWeight ?? 1 : 0;
|
|
158
|
+
const rd = ranksOf(dense);
|
|
159
|
+
const rl = lexical && wl > 0 ? ranksOf(lexical, 0) : null;
|
|
160
|
+
const out = new Float64Array(dense.length);
|
|
161
|
+
for (let i = 0; i < dense.length; i++) {
|
|
162
|
+
out[i] = wd / (k + rd[i]) + (rl ? wl / (k + rl[i]) : 0);
|
|
163
|
+
}
|
|
164
|
+
return out;
|
|
165
|
+
}
|
|
166
|
+
/** Rank groups (sessions, episodes) by the scores of their chunks. Ties keep first-seen order. */
|
|
167
|
+
export function rankGroups(groupOf, scores, opts = {}) {
|
|
168
|
+
const per = new Map();
|
|
169
|
+
const order = [];
|
|
170
|
+
groupOf.forEach((g, i) => {
|
|
171
|
+
let list = per.get(g);
|
|
172
|
+
if (!list) {
|
|
173
|
+
per.set(g, (list = []));
|
|
174
|
+
order.push(g);
|
|
175
|
+
}
|
|
176
|
+
list.push(scores[i]);
|
|
177
|
+
});
|
|
178
|
+
const tail = opts.tailWeight ?? 0.1;
|
|
179
|
+
const ranked = order.map((group, firstSeen) => {
|
|
180
|
+
const s = per.get(group).sort((a, z) => z - a);
|
|
181
|
+
let score = s[0];
|
|
182
|
+
if (opts.aggregation === 'max-plus')
|
|
183
|
+
for (let i = 1, w = tail; i < s.length && i < 4; i++, w /= 2)
|
|
184
|
+
score += w * s[i];
|
|
185
|
+
return { group, score, firstSeen };
|
|
186
|
+
});
|
|
187
|
+
ranked.sort((a, z) => z.score - a.score || a.firstSeen - z.firstSeen);
|
|
188
|
+
return ranked.map(({ group, score }) => ({ group, score }));
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=conversation-retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-retrieval.js","sourceRoot":"","sources":["../../../src/search/conversation-retrieval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opt-in cross-encoder reranking (ADR-016). A cross-encoder reads the query and a candidate together, so it ranks
|
|
3
|
+
* far better than either embedding similarity or BM25, at about 200 ms per 60 candidates on CPU for the default
|
|
4
|
+
* 22M-parameter model (q8). It is therefore applied only to a bounded candidate set, and only when a caller asks.
|
|
5
|
+
*
|
|
6
|
+
* The model is downloaded once by @huggingface/transformers. Every input is bounded: at most MAX_CANDIDATES
|
|
7
|
+
* candidates, each cut to MAX_CHARS before tokenising, and the tokenizer truncates pairs at 512 tokens.
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_RERANKER: string;
|
|
10
|
+
/** Two candidate lists of RERANK_DEPTH (60) each, deduplicated, fit. */
|
|
11
|
+
export declare const MAX_CANDIDATES = 128;
|
|
12
|
+
/**
|
|
13
|
+
* Relevance logits of each candidate for the query, in input order. Throws if the model cannot be loaded;
|
|
14
|
+
* callers fall back to their unreranked order.
|
|
15
|
+
*/
|
|
16
|
+
export declare function crossEncoderScores(query: string, candidates: readonly string[], modelId?: string): Promise<Float64Array>;
|
|
17
|
+
//# sourceMappingURL=cross-encoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-encoder.d.ts","sourceRoot":"","sources":["../../../src/search/cross-encoder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,gBAAgB,QAAwE,CAAC;AACtG,wEAAwE;AACxE,eAAO,MAAM,cAAc,MAAM,CAAC;AA2BlC;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,SAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAcxI"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opt-in cross-encoder reranking (ADR-016). A cross-encoder reads the query and a candidate together, so it ranks
|
|
3
|
+
* far better than either embedding similarity or BM25, at about 200 ms per 60 candidates on CPU for the default
|
|
4
|
+
* 22M-parameter model (q8). It is therefore applied only to a bounded candidate set, and only when a caller asks.
|
|
5
|
+
*
|
|
6
|
+
* The model is downloaded once by @huggingface/transformers. Every input is bounded: at most MAX_CANDIDATES
|
|
7
|
+
* candidates, each cut to MAX_CHARS before tokenising, and the tokenizer truncates pairs at 512 tokens.
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_RERANKER = process.env.AGENTDB_RERANKER_MODEL || 'Xenova/ms-marco-MiniLM-L-6-v2';
|
|
10
|
+
/** Two candidate lists of RERANK_DEPTH (60) each, deduplicated, fit. */
|
|
11
|
+
export const MAX_CANDIDATES = 128;
|
|
12
|
+
const MAX_CHARS = 4_096;
|
|
13
|
+
const BATCH = 32;
|
|
14
|
+
const loading = new Map();
|
|
15
|
+
async function load(modelId) {
|
|
16
|
+
let p = loading.get(modelId);
|
|
17
|
+
if (!p) {
|
|
18
|
+
p = (async () => {
|
|
19
|
+
const t = await import('@huggingface/transformers');
|
|
20
|
+
const tokenizer = await t.AutoTokenizer.from_pretrained(modelId);
|
|
21
|
+
const model = await t.AutoModelForSequenceClassification.from_pretrained(modelId, { dtype: 'q8' });
|
|
22
|
+
return { tokenizer: tokenizer, model: model };
|
|
23
|
+
})();
|
|
24
|
+
// A failed load is not cached, so a later call can retry (e.g. after the network returns).
|
|
25
|
+
p.catch(() => loading.delete(modelId));
|
|
26
|
+
loading.set(modelId, p);
|
|
27
|
+
}
|
|
28
|
+
return p;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Relevance logits of each candidate for the query, in input order. Throws if the model cannot be loaded;
|
|
32
|
+
* callers fall back to their unreranked order.
|
|
33
|
+
*/
|
|
34
|
+
export async function crossEncoderScores(query, candidates, modelId = DEFAULT_RERANKER) {
|
|
35
|
+
if (candidates.length > MAX_CANDIDATES)
|
|
36
|
+
throw new RangeError(`at most ${MAX_CANDIDATES} candidates`);
|
|
37
|
+
const out = new Float64Array(candidates.length);
|
|
38
|
+
if (candidates.length === 0)
|
|
39
|
+
return out;
|
|
40
|
+
const { tokenizer, model } = await load(modelId);
|
|
41
|
+
const q = query.slice(0, MAX_CHARS);
|
|
42
|
+
for (let i = 0; i < candidates.length; i += BATCH) {
|
|
43
|
+
const docs = candidates.slice(i, i + BATCH).map(d => d.slice(0, MAX_CHARS));
|
|
44
|
+
const enc = tokenizer(new Array(docs.length).fill(q), { text_pair: docs, padding: true, truncation: true, max_length: 512 });
|
|
45
|
+
const { logits } = await model(enc);
|
|
46
|
+
const width = logits.dims[1] ?? 1;
|
|
47
|
+
for (let j = 0; j < docs.length; j++)
|
|
48
|
+
out[i + j] = Number(logits.data[j * width + (width - 1)]);
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=cross-encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-encoder.js","sourceRoot":"","sources":["../../../src/search/cross-encoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-policy.d.ts","sourceRoot":"","sources":["../../../src/security/mcp-policy.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-policy.d.ts","sourceRoot":"","sources":["../../../src/security/mcp-policy.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAwDhF,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAO7C,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,mBAAmB,EAAE,iBAA8B,CAAC;AAQjE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC1B,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AASD,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,aAAa,CAqBf;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAI7E;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvD,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE,aAAa,GACpB,CAAC,EAAE,CAEL"}
|
|
@@ -13,6 +13,13 @@ const READONLY_TOOLS = [
|
|
|
13
13
|
'recall_with_certificate',
|
|
14
14
|
'reflexion_retrieve',
|
|
15
15
|
'skill_search',
|
|
16
|
+
// CRUD reads (ADR-017)
|
|
17
|
+
'agentdb_get',
|
|
18
|
+
'agentdb_list',
|
|
19
|
+
'agentdb_pattern_get',
|
|
20
|
+
'agentdb_pattern_list',
|
|
21
|
+
'skill_get',
|
|
22
|
+
'skill_list',
|
|
16
23
|
];
|
|
17
24
|
const LEARNING_TOOLS = [
|
|
18
25
|
...READONLY_TOOLS,
|
|
@@ -38,12 +45,18 @@ const LEARNING_TOOLS = [
|
|
|
38
45
|
'reflexion_store_batch',
|
|
39
46
|
'skill_create',
|
|
40
47
|
'skill_create_batch',
|
|
48
|
+
// In-place updates keep ids; deletes stay admin-only (ADR-017)
|
|
49
|
+
'agentdb_update',
|
|
50
|
+
'agentdb_pattern_update',
|
|
51
|
+
'skill_update',
|
|
41
52
|
];
|
|
42
53
|
/** Tools that reset or delete data: only the admin profile (or an explicit allow) grants them. */
|
|
43
54
|
export const ADMIN_ONLY_TOOLS = [
|
|
44
55
|
'agentdb_init',
|
|
45
56
|
'agentdb_delete',
|
|
46
57
|
'agentdb_delete_batch',
|
|
58
|
+
'agentdb_pattern_delete',
|
|
59
|
+
'skill_delete',
|
|
47
60
|
'agentdb_clear_cache',
|
|
48
61
|
];
|
|
49
62
|
/** Profile used when AGENTDB_MCP_PROFILE is unset */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-policy.js","sourceRoot":"","sources":["../../../src/security/mcp-policy.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG;IACrB,sBAAsB;IACtB,gBAAgB;IAChB,wBAAwB;IACxB,uBAAuB;IACvB,eAAe;IACf,UAAU;IACV,cAAc;IACd,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,yBAAyB;IACzB,oBAAoB;IACpB,cAAc;
|
|
1
|
+
{"version":3,"file":"mcp-policy.js","sourceRoot":"","sources":["../../../src/security/mcp-policy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentdb",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "Self-learning vector memory for AI agents — single-file .rvf cognitive container with HNSW search, episodic Reflexion memory, causal graph + Cypher, 9 RL algorithms, Thompson Sampling bandit, 41 MCP tools, hybrid (BM25 + dense) retrieval, GNN attention. 150x faster than SQLite. Up to +36% search quality from feedback. Runs in Node, browsers (WASM), edge, offline. Backs the agentic-flow / ruflo / Claude Code memory layer.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"test": "vitest",
|
|
66
66
|
"test:unit": "vitest --run",
|
|
67
67
|
"test:browser": "vitest browser-bundle-unit.test.js --run",
|
|
68
|
-
"test:ci": "npm run test:unit && npm run test:browser && npm run build && npm run verify:bundle && npm run test:mcp-stdio",
|
|
68
|
+
"test:ci": "npm run test:unit && npm run test:browser && npm run build && npm run verify:bundle && npm run test:mcp-stdio && npm run test:mcp-crud",
|
|
69
69
|
"test:mcp-stdio": "node tests/mcp-stdio-purity.mjs",
|
|
70
70
|
"verify:bundle": "node scripts/verify-bundle.js",
|
|
71
71
|
"cli": "node dist/src/cli/agentdb-cli.js",
|
|
@@ -81,7 +81,9 @@
|
|
|
81
81
|
"benchmark:adr072:fast": "vitest run tests/benchmarks/validate-adr072.test.ts",
|
|
82
82
|
"benchmark:all": "npm run benchmark:attention && npm run benchmark:backends && npm run benchmark:profile && npm run benchmark:ruvector",
|
|
83
83
|
"build:model": "node scripts/build-model-rvf.mjs",
|
|
84
|
-
"prebuild": "node scripts/inline-schemas.mjs"
|
|
84
|
+
"prebuild": "node scripts/inline-schemas.mjs",
|
|
85
|
+
"test:mcp-crud": "node tests/mcp-crud-e2e.mjs",
|
|
86
|
+
"benchmark:crud": "tsx benchmarks/crud-benchmark.mts"
|
|
85
87
|
},
|
|
86
88
|
"keywords": [
|
|
87
89
|
"agentdb",
|
|
@@ -210,7 +212,7 @@
|
|
|
210
212
|
"commander": "^12.1.0",
|
|
211
213
|
"hnswlib-node": "^3.0.0",
|
|
212
214
|
"inquirer": "^9.3.8",
|
|
213
|
-
"ruvector": "^0.
|
|
215
|
+
"ruvector": "^0.3.5",
|
|
214
216
|
"ruvector-attention-wasm": "^0.1.32",
|
|
215
217
|
"ruvector-graph-transformer-wasm": "^2.0.4"
|
|
216
218
|
},
|