agentfootprint 1.12.0 → 1.13.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/dist/esm/memory/embedding/cosine.js +39 -0
- package/dist/esm/memory/embedding/cosine.js.map +1 -0
- package/dist/esm/memory/embedding/embedMessages.js +51 -0
- package/dist/esm/memory/embedding/embedMessages.js.map +1 -0
- package/dist/esm/memory/embedding/index.js +5 -0
- package/dist/esm/memory/embedding/index.js.map +1 -0
- package/dist/esm/memory/embedding/loadRelevant.js +65 -0
- package/dist/esm/memory/embedding/loadRelevant.js.map +1 -0
- package/dist/esm/memory/embedding/mockEmbedder.js +28 -0
- package/dist/esm/memory/embedding/mockEmbedder.js.map +1 -0
- package/dist/esm/memory/embedding/types.js +17 -0
- package/dist/esm/memory/embedding/types.js.map +1 -0
- package/dist/esm/memory/pipeline/index.js +1 -0
- package/dist/esm/memory/pipeline/index.js.map +1 -1
- package/dist/esm/memory/pipeline/semantic.js +96 -0
- package/dist/esm/memory/pipeline/semantic.js.map +1 -0
- package/dist/esm/memory/stages/writeMessages.js +8 -0
- package/dist/esm/memory/stages/writeMessages.js.map +1 -1
- package/dist/esm/memory/store/InMemoryStore.js +45 -0
- package/dist/esm/memory/store/InMemoryStore.js.map +1 -1
- package/dist/esm/memory/store/index.js.map +1 -1
- package/dist/esm/memory/wire/mountMemoryPipeline.js +5 -0
- package/dist/esm/memory/wire/mountMemoryPipeline.js.map +1 -1
- package/dist/esm/memory.barrel.js +3 -0
- package/dist/esm/memory.barrel.js.map +1 -1
- package/dist/memory/embedding/cosine.js +43 -0
- package/dist/memory/embedding/cosine.js.map +1 -0
- package/dist/memory/embedding/embedMessages.js +55 -0
- package/dist/memory/embedding/embedMessages.js.map +1 -0
- package/dist/memory/embedding/index.js +12 -0
- package/dist/memory/embedding/index.js.map +1 -0
- package/dist/memory/embedding/loadRelevant.js +69 -0
- package/dist/memory/embedding/loadRelevant.js.map +1 -0
- package/dist/memory/embedding/mockEmbedder.js +32 -0
- package/dist/memory/embedding/mockEmbedder.js.map +1 -0
- package/dist/memory/embedding/types.js +18 -0
- package/dist/memory/embedding/types.js.map +1 -0
- package/dist/memory/pipeline/index.js +3 -1
- package/dist/memory/pipeline/index.js.map +1 -1
- package/dist/memory/pipeline/semantic.js +100 -0
- package/dist/memory/pipeline/semantic.js.map +1 -0
- package/dist/memory/stages/writeMessages.js +8 -0
- package/dist/memory/stages/writeMessages.js.map +1 -1
- package/dist/memory/store/InMemoryStore.js +45 -0
- package/dist/memory/store/InMemoryStore.js.map +1 -1
- package/dist/memory/store/index.js.map +1 -1
- package/dist/memory/wire/mountMemoryPipeline.js +5 -0
- package/dist/memory/wire/mountMemoryPipeline.js.map +1 -1
- package/dist/memory.barrel.js +9 -1
- package/dist/memory.barrel.js.map +1 -1
- package/dist/types/memory/embedding/cosine.d.ts +19 -0
- package/dist/types/memory/embedding/cosine.d.ts.map +1 -0
- package/dist/types/memory/embedding/embedMessages.d.ts +59 -0
- package/dist/types/memory/embedding/embedMessages.d.ts.map +1 -0
- package/dist/types/memory/embedding/index.d.ts +9 -0
- package/dist/types/memory/embedding/index.d.ts.map +1 -0
- package/dist/types/memory/embedding/loadRelevant.d.ts +52 -0
- package/dist/types/memory/embedding/loadRelevant.d.ts.map +1 -0
- package/dist/types/memory/embedding/mockEmbedder.d.ts +23 -0
- package/dist/types/memory/embedding/mockEmbedder.d.ts.map +1 -0
- package/dist/types/memory/embedding/types.d.ts +47 -0
- package/dist/types/memory/embedding/types.d.ts.map +1 -0
- package/dist/types/memory/entry/types.d.ts +17 -4
- package/dist/types/memory/entry/types.d.ts.map +1 -1
- package/dist/types/memory/pipeline/index.d.ts +2 -0
- package/dist/types/memory/pipeline/index.d.ts.map +1 -1
- package/dist/types/memory/pipeline/semantic.d.ts +38 -0
- package/dist/types/memory/pipeline/semantic.d.ts.map +1 -0
- package/dist/types/memory/stages/writeMessages.d.ts.map +1 -1
- package/dist/types/memory/store/InMemoryStore.d.ts +15 -1
- package/dist/types/memory/store/InMemoryStore.d.ts.map +1 -1
- package/dist/types/memory/store/index.d.ts +1 -1
- package/dist/types/memory/store/index.d.ts.map +1 -1
- package/dist/types/memory/store/types.d.ts +52 -0
- package/dist/types/memory/store/types.d.ts.map +1 -1
- package/dist/types/memory/wire/mountMemoryPipeline.d.ts.map +1 -1
- package/dist/types/memory.barrel.d.ts +8 -0
- package/dist/types/memory.barrel.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cosineSimilarity — the similarity metric used by `store.search()`.
|
|
3
|
+
*
|
|
4
|
+
* cos(a, b) = dot(a, b) / (||a|| * ||b||)
|
|
5
|
+
*
|
|
6
|
+
* Range: [-1, 1]. Equal-direction vectors → 1. Orthogonal → 0.
|
|
7
|
+
* Opposite → -1.
|
|
8
|
+
*
|
|
9
|
+
* Zero-magnitude handling: if either vector is all-zero (or the empty
|
|
10
|
+
* vector), returns 0 — never NaN. NaN in a similarity score would
|
|
11
|
+
* poison downstream picker comparisons (NaN < x is false for all x)
|
|
12
|
+
* and silently demote the entry. Explicit 0 is safer.
|
|
13
|
+
*
|
|
14
|
+
* Length mismatch THROWS: comparing vectors of different dimensions
|
|
15
|
+
* is almost always a bug (different embedders mixed in the same store).
|
|
16
|
+
* Fail loud rather than silently truncate.
|
|
17
|
+
*/
|
|
18
|
+
export function cosineSimilarity(a, b) {
|
|
19
|
+
if (a.length !== b.length) {
|
|
20
|
+
throw new Error(`cosineSimilarity: vector length mismatch — ${a.length} vs ${b.length}. ` +
|
|
21
|
+
'Check that all entries in the store were produced by the SAME embedder instance.');
|
|
22
|
+
}
|
|
23
|
+
if (a.length === 0)
|
|
24
|
+
return 0;
|
|
25
|
+
let dot = 0;
|
|
26
|
+
let magA = 0;
|
|
27
|
+
let magB = 0;
|
|
28
|
+
for (let i = 0; i < a.length; i++) {
|
|
29
|
+
const av = a[i];
|
|
30
|
+
const bv = b[i];
|
|
31
|
+
dot += av * bv;
|
|
32
|
+
magA += av * av;
|
|
33
|
+
magB += bv * bv;
|
|
34
|
+
}
|
|
35
|
+
if (magA === 0 || magB === 0)
|
|
36
|
+
return 0;
|
|
37
|
+
return dot / (Math.sqrt(magA) * Math.sqrt(magB));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cosine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine.js","sourceRoot":"","sources":["../../../../src/memory/embedding/cosine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAoB,EAAE,CAAoB;IACzE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,8CAA8C,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,IAAI;YACvE,kFAAkF,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE7B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QACf,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Default: extract plaintext from any supported content shape. */
|
|
2
|
+
function defaultTextFrom(message) {
|
|
3
|
+
const c = message.content;
|
|
4
|
+
if (typeof c === 'string')
|
|
5
|
+
return c;
|
|
6
|
+
if (Array.isArray(c)) {
|
|
7
|
+
const parts = [];
|
|
8
|
+
for (const block of c) {
|
|
9
|
+
if (block && typeof block === 'object') {
|
|
10
|
+
const b = block;
|
|
11
|
+
if (b.type === 'text' && typeof b.text === 'string')
|
|
12
|
+
parts.push(b.text);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return parts.join(' ');
|
|
16
|
+
}
|
|
17
|
+
return '';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build the `embedMessages` stage. Prefers `embedBatch()` when the
|
|
21
|
+
* embedder implements it (one round-trip for the whole turn), otherwise
|
|
22
|
+
* falls back to N sequential `embed()` calls.
|
|
23
|
+
*/
|
|
24
|
+
export function embedMessages(config) {
|
|
25
|
+
const { embedder } = config;
|
|
26
|
+
const textFrom = config.textFrom ?? defaultTextFrom;
|
|
27
|
+
return async (scope) => {
|
|
28
|
+
const messages = (scope.newMessages ?? []);
|
|
29
|
+
if (messages.length === 0) {
|
|
30
|
+
scope.newMessageEmbeddings = [];
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const texts = messages.map(textFrom);
|
|
34
|
+
const signal = scope.$getEnv?.()?.signal;
|
|
35
|
+
let vectors;
|
|
36
|
+
if (embedder.embedBatch) {
|
|
37
|
+
vectors = (await embedder.embedBatch({
|
|
38
|
+
texts,
|
|
39
|
+
...(signal ? { signal } : {}),
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
vectors = await Promise.all(texts.map((text) => embedder.embed({ text, ...(signal ? { signal } : {}) })));
|
|
44
|
+
}
|
|
45
|
+
scope.newMessageEmbeddings = vectors;
|
|
46
|
+
if (config.embedderId !== undefined) {
|
|
47
|
+
scope.newMessageEmbeddingModel = config.embedderId;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=embedMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedMessages.js","sourceRoot":"","sources":["../../../../src/memory/embedding/embedMessages.ts"],"names":[],"mappings":"AA0DA,mEAAmE;AACnE,SAAS,eAAe,CAAC,OAAgB;IACvC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvC,MAAM,CAAC,GAAG,KAAyC,CAAC;gBACpD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;oBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,eAAe,CAAC;IAEpD,OAAO,KAAK,EAAE,KAAqC,EAAiB,EAAE;QACpE,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAuB,CAAC;QACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC;QAEzC,IAAI,OAAmB,CAAC;QACxB,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC;gBACnC,KAAK;gBACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9B,CAAC,CAAe,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CACzB,KAAK,CAAC,GAAG,CACP,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAsB,CACvF,CACF,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,oBAAoB,GAAG,OAAO,CAAC;QACrC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,wBAAwB,GAAG,MAAM,CAAC,UAAU,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/memory/embedding/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default query extractor — last user message.
|
|
3
|
+
*
|
|
4
|
+
* Inside the memory-read subflow (mounted by `mountMemoryRead`), the
|
|
5
|
+
* current turn's messages are piped in as `scope.messages` via the
|
|
6
|
+
* mount's inputMapper. Falls back to `newMessages` for custom pipelines
|
|
7
|
+
* that wire differently.
|
|
8
|
+
*/
|
|
9
|
+
function defaultQueryFrom(scope) {
|
|
10
|
+
const scopeAny = scope;
|
|
11
|
+
const incoming = scopeAny.messages ?? [];
|
|
12
|
+
const source = incoming.length > 0 ? incoming : (scope.newMessages ?? []);
|
|
13
|
+
for (let i = source.length - 1; i >= 0; i--) {
|
|
14
|
+
const m = source[i];
|
|
15
|
+
if (m.role !== 'user')
|
|
16
|
+
continue;
|
|
17
|
+
if (typeof m.content === 'string')
|
|
18
|
+
return m.content;
|
|
19
|
+
if (Array.isArray(m.content)) {
|
|
20
|
+
const parts = [];
|
|
21
|
+
for (const block of m.content) {
|
|
22
|
+
if (block && typeof block === 'object') {
|
|
23
|
+
const b = block;
|
|
24
|
+
if (b.type === 'text' && typeof b.text === 'string')
|
|
25
|
+
parts.push(b.text);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (parts.length > 0)
|
|
29
|
+
return parts.join(' ');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
export function loadRelevant(config) {
|
|
35
|
+
const { store, embedder } = config;
|
|
36
|
+
if (!store.search) {
|
|
37
|
+
throw new Error('loadRelevant: the configured store does not implement search(). ' +
|
|
38
|
+
'Use a vector-capable adapter (InMemoryStore, pgvector, Pinecone, ...).');
|
|
39
|
+
}
|
|
40
|
+
const queryFrom = config.queryFrom ?? defaultQueryFrom;
|
|
41
|
+
const k = config.k ?? 20;
|
|
42
|
+
return async (scope) => {
|
|
43
|
+
const identity = scope.identity;
|
|
44
|
+
const text = queryFrom(scope).trim();
|
|
45
|
+
if (text.length === 0) {
|
|
46
|
+
scope.loaded = [];
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const signal = scope.$getEnv?.()?.signal;
|
|
50
|
+
const queryVec = (await embedder.embed({
|
|
51
|
+
text,
|
|
52
|
+
...(signal ? { signal } : {}),
|
|
53
|
+
}));
|
|
54
|
+
const results = await store.search(identity, queryVec, {
|
|
55
|
+
k,
|
|
56
|
+
...(config.minScore !== undefined && { minScore: config.minScore }),
|
|
57
|
+
...(config.tiers && { tiers: config.tiers }),
|
|
58
|
+
...(config.embedderId !== undefined && { embedderId: config.embedderId }),
|
|
59
|
+
});
|
|
60
|
+
// Write loaded entries to scope in best-first order — downstream
|
|
61
|
+
// pickByBudget further narrows by the token budget.
|
|
62
|
+
scope.loaded = results.map((r) => r.entry);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=loadRelevant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadRelevant.js","sourceRoot":"","sources":["../../../../src/memory/embedding/loadRelevant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const DEFAULT_DIMENSIONS = 32;
|
|
2
|
+
function charFrequency(text, dims) {
|
|
3
|
+
const vec = new Array(dims).fill(0);
|
|
4
|
+
for (let i = 0; i < text.length; i++) {
|
|
5
|
+
vec[text.charCodeAt(i) % dims] += 1;
|
|
6
|
+
}
|
|
7
|
+
return vec;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build a deterministic mock embedder. Same text always yields the
|
|
11
|
+
* same vector; texts sharing characters share cosine similarity.
|
|
12
|
+
*/
|
|
13
|
+
export function mockEmbedder(options = {}) {
|
|
14
|
+
const dimensions = options.dimensions ?? DEFAULT_DIMENSIONS;
|
|
15
|
+
if (!Number.isInteger(dimensions) || dimensions <= 0) {
|
|
16
|
+
throw new Error(`mockEmbedder: dimensions must be a positive integer (got ${dimensions})`);
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
dimensions,
|
|
20
|
+
async embed({ text }) {
|
|
21
|
+
return charFrequency(text, dimensions);
|
|
22
|
+
},
|
|
23
|
+
async embedBatch({ texts }) {
|
|
24
|
+
return texts.map((text) => charFrequency(text, dimensions));
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=mockEmbedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockEmbedder.js","sourceRoot":"","sources":["../../../../src/memory/embedding/mockEmbedder.ts"],"names":[],"mappings":"AAeA,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,SAAS,aAAa,CAAC,IAAY,EAAE,IAAY;IAC/C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAMD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,UAA+B,EAAE;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,4DAA4D,UAAU,GAAG,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO;QACL,UAAU;QACV,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAa;YAC7B,OAAO,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAkB;YACxC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAC9D,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedder — text-to-vector abstraction.
|
|
3
|
+
*
|
|
4
|
+
* Pluggable interface: consumers bring their own embedding backend
|
|
5
|
+
* (OpenAI, Voyage, Cohere, Sentence Transformers, a local model, a
|
|
6
|
+
* custom rules-based hashing scheme, etc.). The library ships
|
|
7
|
+
* `mockEmbedder()` for tests — no default real embedder, since LLM
|
|
8
|
+
* providers' embedding APIs are not uniform (Anthropic doesn't
|
|
9
|
+
* publish one at all).
|
|
10
|
+
*
|
|
11
|
+
* An embedder is configured once (model + api key + dims) and reused
|
|
12
|
+
* across many turns. `dimensions` is a constant per instance — mixing
|
|
13
|
+
* embedders of different dims within the same `MemoryStore` breaks
|
|
14
|
+
* cosine similarity, so adapters should reject mismatched sizes.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/memory/embedding/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/memory/pipeline/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/memory/pipeline/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* semanticPipeline — vector-retrieval memory preset.
|
|
3
|
+
*
|
|
4
|
+
* Instead of loading the N most-recent messages, this preset embeds
|
|
5
|
+
* the user's current turn and pulls the k most semantically similar
|
|
6
|
+
* prior messages from a vector-capable store.
|
|
7
|
+
*
|
|
8
|
+
* READ : LoadRelevant → PickByBudget → FormatDefault
|
|
9
|
+
* WRITE : EmbedMessages → WriteMessages
|
|
10
|
+
*
|
|
11
|
+
* Contrast with `defaultPipeline` (recency) and `narrativePipeline`
|
|
12
|
+
* (beat-level compression). Semantic retrieval is the right tool when:
|
|
13
|
+
* - Conversations are long enough that recency misses relevant
|
|
14
|
+
* context from many turns ago.
|
|
15
|
+
* - The user asks questions that reference topics from distant
|
|
16
|
+
* history ("what did I say about X last week?").
|
|
17
|
+
* - You have a real vector store (pgvector / Pinecone / Qdrant) —
|
|
18
|
+
* `InMemoryStore`'s O(n) scan is only useful for dev / tests.
|
|
19
|
+
*
|
|
20
|
+
* You MUST supply an `Embedder`. No default. The library ships
|
|
21
|
+
* `mockEmbedder()` for tests — bring your own for production
|
|
22
|
+
* (OpenAI, Voyage, Cohere, Sentence Transformers, custom).
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { Agent, anthropic } from 'agentfootprint';
|
|
27
|
+
* import {
|
|
28
|
+
* semanticPipeline,
|
|
29
|
+
* InMemoryStore,
|
|
30
|
+
* mockEmbedder,
|
|
31
|
+
* } from 'agentfootprint/memory';
|
|
32
|
+
*
|
|
33
|
+
* const pipeline = semanticPipeline({
|
|
34
|
+
* store: new InMemoryStore(),
|
|
35
|
+
* embedder: mockEmbedder(), // swap for openaiEmbedder() etc.
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* const agent = Agent.create({ provider: anthropic('claude-sonnet-4-5') })
|
|
39
|
+
* .memoryPipeline(pipeline)
|
|
40
|
+
* .build();
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
import { flowChart } from 'footprintjs';
|
|
44
|
+
import { pickByBudget } from '../stages/pickByBudget';
|
|
45
|
+
import { formatDefault } from '../stages/formatDefault';
|
|
46
|
+
import { writeMessages } from '../stages/writeMessages';
|
|
47
|
+
import { loadRelevant } from '../embedding/loadRelevant';
|
|
48
|
+
import { embedMessages, } from '../embedding/embedMessages';
|
|
49
|
+
/**
|
|
50
|
+
* Build the semantic read + write pipelines sharing a single store.
|
|
51
|
+
* Returns `{ read, write }` ready to pass to `.memoryPipeline()`.
|
|
52
|
+
*/
|
|
53
|
+
export function semanticPipeline(config) {
|
|
54
|
+
if (!config.store.search) {
|
|
55
|
+
throw new Error('semanticPipeline: the configured store does not implement search(). ' +
|
|
56
|
+
'Pass a vector-capable adapter (InMemoryStore, pgvector, Pinecone, ...).');
|
|
57
|
+
}
|
|
58
|
+
const loadConfig = {
|
|
59
|
+
store: config.store,
|
|
60
|
+
embedder: config.embedder,
|
|
61
|
+
...(config.embedderId !== undefined && { embedderId: config.embedderId }),
|
|
62
|
+
...(config.k !== undefined && { k: config.k }),
|
|
63
|
+
...(config.minScore !== undefined && { minScore: config.minScore }),
|
|
64
|
+
...(config.tiers && { tiers: config.tiers }),
|
|
65
|
+
};
|
|
66
|
+
const pickConfig = {
|
|
67
|
+
...(config.reserveTokens !== undefined && { reserveTokens: config.reserveTokens }),
|
|
68
|
+
...(config.minimumTokens !== undefined && { minimumTokens: config.minimumTokens }),
|
|
69
|
+
...(config.maxEntries !== undefined && { maxEntries: config.maxEntries }),
|
|
70
|
+
};
|
|
71
|
+
const formatConfig = {
|
|
72
|
+
...(config.formatHeader !== undefined && { header: config.formatHeader }),
|
|
73
|
+
...(config.formatFooter !== undefined && { footer: config.formatFooter }),
|
|
74
|
+
};
|
|
75
|
+
const embedConfig = {
|
|
76
|
+
embedder: config.embedder,
|
|
77
|
+
...(config.embedderId !== undefined && { embedderId: config.embedderId }),
|
|
78
|
+
};
|
|
79
|
+
const writeConfig = {
|
|
80
|
+
store: config.store,
|
|
81
|
+
...(config.writeTier && { tier: config.writeTier }),
|
|
82
|
+
...(config.writeTtlMs !== undefined && { ttlMs: config.writeTtlMs }),
|
|
83
|
+
};
|
|
84
|
+
// ── Read subflow: LoadRelevant → PickByBudget → FormatDefault
|
|
85
|
+
let readBuilder = flowChart('LoadRelevant', loadRelevant(loadConfig), 'load-relevant', undefined, 'Embed the query + fetch top-k semantically similar entries');
|
|
86
|
+
readBuilder = pickByBudget(pickConfig)(readBuilder);
|
|
87
|
+
const read = readBuilder
|
|
88
|
+
.addFunction('Format', formatDefault(formatConfig), 'format-default', 'Render selected entries as a system message')
|
|
89
|
+
.build();
|
|
90
|
+
// ── Write subflow: EmbedMessages → WriteMessages
|
|
91
|
+
const write = flowChart('EmbedMessages', embedMessages(embedConfig), 'embed-messages', undefined, 'Embed newMessages into per-message vectors for vector search')
|
|
92
|
+
.addFunction('WriteMessages', writeMessages(writeConfig), 'write-messages', 'Batch-persist messages with embeddings via store.putMany')
|
|
93
|
+
.build();
|
|
94
|
+
return { read, write };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../../../src/memory/pipeline/semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,11 @@ export function writeMessages(config) {
|
|
|
7
7
|
const messages = scope.newMessages ?? [];
|
|
8
8
|
if (messages.length === 0)
|
|
9
9
|
return;
|
|
10
|
+
// Optional: embedMessages may have run earlier and written
|
|
11
|
+
// per-message vectors to scope. Attach them to the entries so
|
|
12
|
+
// vector-capable stores index on `embedding`.
|
|
13
|
+
const embeddings = scope.newMessageEmbeddings;
|
|
14
|
+
const embeddingModel = scope.newMessageEmbeddingModel;
|
|
10
15
|
const now = Date.now();
|
|
11
16
|
const ttl = config.ttlMs ? now + config.ttlMs : undefined;
|
|
12
17
|
// Build all entries first, then batch-write. For N messages this
|
|
@@ -16,6 +21,7 @@ export function writeMessages(config) {
|
|
|
16
21
|
const entries = [];
|
|
17
22
|
for (let i = 0; i < messages.length; i++) {
|
|
18
23
|
const message = messages[i];
|
|
24
|
+
const embedding = embeddings?.[i];
|
|
19
25
|
entries.push({
|
|
20
26
|
id: idFrom(turn, i, message),
|
|
21
27
|
value: message,
|
|
@@ -26,6 +32,8 @@ export function writeMessages(config) {
|
|
|
26
32
|
accessCount: 0,
|
|
27
33
|
...(ttl !== undefined && { ttl }),
|
|
28
34
|
...(config.tier && { tier: config.tier }),
|
|
35
|
+
...(embedding && embedding.length > 0 && { embedding: [...embedding] }),
|
|
36
|
+
...(embeddingModel && { embeddingModel }),
|
|
29
37
|
source: { turn, identity },
|
|
30
38
|
});
|
|
31
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeMessages.js","sourceRoot":"","sources":["../../../../src/memory/stages/writeMessages.ts"],"names":[],"mappings":"AAyEA,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE,CAAC,OAAO,IAAI,IAAI,KAAK,EAAE,CAAC;AAEtF,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC;IAE9C,OAAO,KAAK,EAAE,KAA8B,EAAiB,EAAE;QAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1D,iEAAiE;QACjE,8DAA8D;QAC9D,8DAA8D;QAC9D,iDAAiD;QACjD,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC;gBAC5B,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;gBACd,cAAc,EAAE,GAAG;gBACnB,WAAW,EAAE,CAAC;gBACd,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,CAAC;gBACjC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,iEAAiE;QACjE,iEAAiE;QACjE,uCAAuC;QACvC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"writeMessages.js","sourceRoot":"","sources":["../../../../src/memory/stages/writeMessages.ts"],"names":[],"mappings":"AAyEA,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,KAAa,EAAU,EAAE,CAAC,OAAO,IAAI,IAAI,KAAK,EAAE,CAAC;AAEtF,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC;IAE9C,OAAO,KAAK,EAAE,KAA8B,EAAiB,EAAE;QAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElC,2DAA2D;QAC3D,8DAA8D;QAC9D,8CAA8C;QAC9C,MAAM,UAAU,GACd,KAID,CAAC,oBAAoB,CAAC;QACvB,MAAM,cAAc,GAClB,KAGD,CAAC,wBAAwB,CAAC;QAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1D,iEAAiE;QACjE,8DAA8D;QAC9D,8DAA8D;QAC9D,iDAAiD;QACjD,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC;gBAC5B,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;gBACd,cAAc,EAAE,GAAG;gBACnB,WAAW,EAAE,CAAC;gBACd,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,CAAC;gBACjC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;gBACzC,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;gBACvE,GAAG,CAAC,cAAc,IAAI,EAAE,cAAc,EAAE,CAAC;gBACzC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,iEAAiE;QACjE,iEAAiE;QACjE,uCAAuC;QACvC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { identityNamespace } from '../identity';
|
|
2
|
+
import { cosineSimilarity } from '../embedding/cosine';
|
|
2
3
|
const DEFAULT_LIST_LIMIT = 100;
|
|
3
4
|
const MAX_LIST_LIMIT = 1000;
|
|
4
5
|
export class InMemoryStore {
|
|
@@ -147,5 +148,49 @@ export class InMemoryStore {
|
|
|
147
148
|
async forget(identity) {
|
|
148
149
|
this.namespaces.delete(identityNamespace(identity));
|
|
149
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* O(n) linear scan over identity-scoped entries. Fine for dev / tests
|
|
153
|
+
* — for production, plug in a real vector backend (pgvector, Pinecone,
|
|
154
|
+
* Qdrant) that implements the same interface.
|
|
155
|
+
*
|
|
156
|
+
* Semantics per the `MemoryStore.search?` contract:
|
|
157
|
+
* - Entries without `embedding` are skipped (ignored, not errored).
|
|
158
|
+
* - Entries with `embedding.length` mismatching the query are
|
|
159
|
+
* skipped (cosine would throw — silent-skip avoids poisoning top-k).
|
|
160
|
+
* - TTL-expired entries are omitted.
|
|
161
|
+
* - Optional `tiers` / `minScore` / `embedderId` filters applied.
|
|
162
|
+
* - Returns descending by score; ties broken by id for determinism.
|
|
163
|
+
*/
|
|
164
|
+
async search(identity, query, options) {
|
|
165
|
+
const slot = this.slot(identity);
|
|
166
|
+
const k = options?.k ?? 10;
|
|
167
|
+
const tierFilter = options?.tiers ? new Set(options.tiers) : undefined;
|
|
168
|
+
const minScore = options?.minScore;
|
|
169
|
+
const embedderId = options?.embedderId;
|
|
170
|
+
const scored = [];
|
|
171
|
+
for (const entry of slot.entries.values()) {
|
|
172
|
+
if (this.isExpired(entry))
|
|
173
|
+
continue;
|
|
174
|
+
if (tierFilter && (!entry.tier || !tierFilter.has(entry.tier)))
|
|
175
|
+
continue;
|
|
176
|
+
const emb = entry.embedding;
|
|
177
|
+
if (!emb || !Array.isArray(emb) || emb.length === 0)
|
|
178
|
+
continue;
|
|
179
|
+
if (emb.length !== query.length)
|
|
180
|
+
continue;
|
|
181
|
+
if (embedderId && entry.embeddingModel && entry.embeddingModel !== embedderId)
|
|
182
|
+
continue;
|
|
183
|
+
const score = cosineSimilarity(emb, query);
|
|
184
|
+
if (minScore !== undefined && score < minScore)
|
|
185
|
+
continue;
|
|
186
|
+
scored.push({ entry: entry, score });
|
|
187
|
+
}
|
|
188
|
+
scored.sort((a, b) => {
|
|
189
|
+
if (b.score !== a.score)
|
|
190
|
+
return b.score - a.score;
|
|
191
|
+
return a.entry.id < b.entry.id ? -1 : a.entry.id > b.entry.id ? 1 : 0;
|
|
192
|
+
});
|
|
193
|
+
return scored.slice(0, k);
|
|
194
|
+
}
|
|
150
195
|
}
|
|
151
196
|
//# sourceMappingURL=InMemoryStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryStore.js","sourceRoot":"","sources":["../../../../src/memory/store/InMemoryStore.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"InMemoryStore.js","sourceRoot":"","sources":["../../../../src/memory/store/InMemoryStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/memory/store/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/memory/store/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -36,6 +36,11 @@ export function mountMemoryRead(builder, config) {
|
|
|
36
36
|
identity: parentState[identityKey],
|
|
37
37
|
turnNumber: parentState[turnNumberKey],
|
|
38
38
|
contextTokensRemaining: parentState[contextTokensKey],
|
|
39
|
+
// Pass the current turn's messages through — semantic read stages
|
|
40
|
+
// like `loadRelevant` derive the query from the last user
|
|
41
|
+
// message here. The write-side `newMessages` field is empty
|
|
42
|
+
// during read; these are two different concerns.
|
|
43
|
+
messages: parentState.messages ?? [],
|
|
39
44
|
newMessages: [], // write side unused in read subflow
|
|
40
45
|
}),
|
|
41
46
|
outputMapper: (subflowState) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mountMemoryPipeline.js","sourceRoot":"","sources":["../../../../src/memory/wire/mountMemoryPipeline.ts"],"names":[],"mappings":"AAoFA,0BAA0B;AAC1B,yEAAyE;AACzE,yEAAyE;AACzE,gEAAgE;AAChE,oFAAoF;AACpF,wEAAwE;AACxE,gDAAgD;AAEhD,MAAM,QAAQ,GAAG;IACf,WAAW,EAAE,UAAU;IACvB,aAAa,EAAE,YAAY;IAC3B,gBAAgB,EAAE,wBAAwB;IAC1C,YAAY,EAAE,iBAAiB;IAC/B,cAAc,EAAE,aAAa;IAC7B,aAAa,EAAE,gBAAgB;IAC/B,cAAc,EAAE,iBAAiB;CACzB,CAAC;AAEX;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAsC,EACtC,MAA8C;IAE9C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC;IAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC;IACrE,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC,gBAAgB,CAAC;IAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC;IAClE,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC;IAErE,OAAO,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE;QACrF,WAAW,EAAE,CAAC,WAAoC,EAAE,EAAE,CAAC,CAAC;YACtD,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC;YAClC,UAAU,EAAE,WAAW,CAAC,aAAa,CAAC;YACtC,sBAAsB,EAAE,WAAW,CAAC,gBAAgB,CAAC;YACrD,WAAW,EAAE,EAAE,EAAE,oCAAoC;SACtD,CAAC;QACF,YAAY,EAAE,CAAC,YAAqC,EAAE,EAAE,CAAC,CAAC;YACxD,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,SAAS;SACvC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAsC,EACtC,MAA8C;IAE9C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC;IAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC;IACrE,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC,gBAAgB,CAAC;IAC9E,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc,CAAC;IACxE,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc,CAAC;IAExE,OAAO,OAAO,CAAC,mBAAmB,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE;QACvF,WAAW,EAAE,CAAC,WAAoC,EAAE,EAAE,CAAC,CAAC;YACtD,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC;YAClC,UAAU,EAAE,WAAW,CAAC,aAAa,CAAC;YACtC,sBAAsB,EAAE,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC1D,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,EAAE;SAC/C,CAAC;QACF,wDAAwD;KACzD,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAsC,EACtC,MAA8C;IAE9C,OAAO,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC"}
|
|
1
|
+
{"version":3,"file":"mountMemoryPipeline.js","sourceRoot":"","sources":["../../../../src/memory/wire/mountMemoryPipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,9 @@ export { approximateTokenCounter, countMessageTokens } from './memory/stages';
|
|
|
36
36
|
export { defaultPipeline } from './memory/pipeline';
|
|
37
37
|
export { ephemeralPipeline } from './memory/pipeline';
|
|
38
38
|
export { narrativePipeline } from './memory/pipeline';
|
|
39
|
+
export { semanticPipeline } from './memory/pipeline';
|
|
40
|
+
export { cosineSimilarity, mockEmbedder } from './memory/embedding';
|
|
41
|
+
export { embedMessages, loadRelevant } from './memory/embedding';
|
|
39
42
|
export { asImportance, isNarrativeBeat, heuristicExtractor, llmExtractor, extractBeats, writeBeats, formatAsNarrative, } from './memory/beats';
|
|
40
43
|
// ── Wire helpers (for custom flowcharts) ────────────────────
|
|
41
44
|
export { mountMemoryRead, mountMemoryWrite, mountMemoryPipeline } from './memory/wire';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.barrel.js","sourceRoot":"","sources":["../../src/memory.barrel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAUzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAK9E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.barrel.js","sourceRoot":"","sources":["../../src/memory.barrel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAUzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAK9E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAKrD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAYjE,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AASxB,+DAA+D;AAC/D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cosineSimilarity = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* cosineSimilarity — the similarity metric used by `store.search()`.
|
|
6
|
+
*
|
|
7
|
+
* cos(a, b) = dot(a, b) / (||a|| * ||b||)
|
|
8
|
+
*
|
|
9
|
+
* Range: [-1, 1]. Equal-direction vectors → 1. Orthogonal → 0.
|
|
10
|
+
* Opposite → -1.
|
|
11
|
+
*
|
|
12
|
+
* Zero-magnitude handling: if either vector is all-zero (or the empty
|
|
13
|
+
* vector), returns 0 — never NaN. NaN in a similarity score would
|
|
14
|
+
* poison downstream picker comparisons (NaN < x is false for all x)
|
|
15
|
+
* and silently demote the entry. Explicit 0 is safer.
|
|
16
|
+
*
|
|
17
|
+
* Length mismatch THROWS: comparing vectors of different dimensions
|
|
18
|
+
* is almost always a bug (different embedders mixed in the same store).
|
|
19
|
+
* Fail loud rather than silently truncate.
|
|
20
|
+
*/
|
|
21
|
+
function cosineSimilarity(a, b) {
|
|
22
|
+
if (a.length !== b.length) {
|
|
23
|
+
throw new Error(`cosineSimilarity: vector length mismatch — ${a.length} vs ${b.length}. ` +
|
|
24
|
+
'Check that all entries in the store were produced by the SAME embedder instance.');
|
|
25
|
+
}
|
|
26
|
+
if (a.length === 0)
|
|
27
|
+
return 0;
|
|
28
|
+
let dot = 0;
|
|
29
|
+
let magA = 0;
|
|
30
|
+
let magB = 0;
|
|
31
|
+
for (let i = 0; i < a.length; i++) {
|
|
32
|
+
const av = a[i];
|
|
33
|
+
const bv = b[i];
|
|
34
|
+
dot += av * bv;
|
|
35
|
+
magA += av * av;
|
|
36
|
+
magB += bv * bv;
|
|
37
|
+
}
|
|
38
|
+
if (magA === 0 || magB === 0)
|
|
39
|
+
return 0;
|
|
40
|
+
return dot / (Math.sqrt(magA) * Math.sqrt(magB));
|
|
41
|
+
}
|
|
42
|
+
exports.cosineSimilarity = cosineSimilarity;
|
|
43
|
+
//# sourceMappingURL=cosine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine.js","sourceRoot":"","sources":["../../../src/memory/embedding/cosine.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,gBAAgB,CAAC,CAAoB,EAAE,CAAoB;IACzE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,8CAA8C,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,IAAI;YACvE,kFAAkF,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAE7B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC;QACf,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;QAChB,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AArBD,4CAqBC"}
|