@seanhogg/builderforce-memory 2026.10.3 → 2026.10.22
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/handoff/pack.d.ts +3 -2
- package/dist/handoff/pack.d.ts.map +1 -1
- package/dist/handoff/pack.js +30 -10
- package/dist/handoff/pack.js.map +1 -1
- package/dist/handoff/types.d.ts +10 -0
- package/dist/handoff/types.d.ts.map +1 -1
- package/dist/memory/MemoryStore.d.ts +4 -0
- package/dist/memory/MemoryStore.d.ts.map +1 -1
- package/dist/memory/MemoryStore.js +4 -0
- package/dist/memory/MemoryStore.js.map +1 -1
- package/dist/memory/SemanticRecall.d.ts.map +1 -1
- package/dist/memory/SemanticRecall.js +4 -1
- package/dist/memory/SemanticRecall.js.map +1 -1
- package/dist/retrieval/HybridRetriever.d.ts +21 -2
- package/dist/retrieval/HybridRetriever.d.ts.map +1 -1
- package/dist/retrieval/HybridRetriever.js +48 -14
- package/dist/retrieval/HybridRetriever.js.map +1 -1
- package/dist/wire/usage.d.ts +8 -0
- package/dist/wire/usage.d.ts.map +1 -1
- package/dist/wire/usage.js +12 -4
- package/dist/wire/usage.js.map +1 -1
- package/package.json +3 -3
- package/src/handoff/handoff.test.ts +27 -0
- package/src/handoff/pack.ts +34 -10
- package/src/handoff/types.ts +10 -0
- package/src/memory/MemoryStore.ts +4 -0
- package/src/memory/SemanticRecall.ts +4 -1
- package/src/retrieval/HybridRetriever.ts +70 -16
- package/src/wire/usage.ts +21 -4
package/dist/handoff/pack.d.ts
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Shape of the result, mirroring Builderforce's `assembleCompacted`
|
|
5
5
|
* (brain-embedded/src/workingTranscript.ts):
|
|
6
6
|
*
|
|
7
|
-
* leading system message(s) ·
|
|
8
|
-
*
|
|
7
|
+
* leading system message(s) · pinned messages that fell in the middle (`pinned`) ·
|
|
8
|
+
* ONE note for the dropped middle · the latest user directive re-injected verbatim
|
|
9
|
+
* (only when it fell in the middle) · the verbatim tail
|
|
9
10
|
*
|
|
10
11
|
* Only the LEADING run of system messages is the fixed prefix. A system message later in
|
|
11
12
|
* the conversation stays where it was: in the tail when the tail reaches it, else in the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/handoff/pack.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/handoff/pack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAkB,WAAW,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAC;AA0FhG,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CA6D/E"}
|
package/dist/handoff/pack.js
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Shape of the result, mirroring Builderforce's `assembleCompacted`
|
|
5
5
|
* (brain-embedded/src/workingTranscript.ts):
|
|
6
6
|
*
|
|
7
|
-
* leading system message(s) ·
|
|
8
|
-
*
|
|
7
|
+
* leading system message(s) · pinned messages that fell in the middle (`pinned`) ·
|
|
8
|
+
* ONE note for the dropped middle · the latest user directive re-injected verbatim
|
|
9
|
+
* (only when it fell in the middle) · the verbatim tail
|
|
9
10
|
*
|
|
10
11
|
* Only the LEADING run of system messages is the fixed prefix. A system message later in
|
|
11
12
|
* the conversation stays where it was: in the tail when the tail reaches it, else in the
|
|
@@ -42,6 +43,19 @@ function latestDirectiveIndex(convo) {
|
|
|
42
43
|
return i;
|
|
43
44
|
return -1;
|
|
44
45
|
}
|
|
46
|
+
/** Convo indices the caller pinned (pinnable roles only), excluding the directive. */
|
|
47
|
+
function pinnedIndices(convo, prefixLen, directiveIdx, pinned) {
|
|
48
|
+
if (!pinned)
|
|
49
|
+
return [];
|
|
50
|
+
const out = [];
|
|
51
|
+
for (let i = 0; i < convo.length; i++) {
|
|
52
|
+
const m = convo[i];
|
|
53
|
+
const pinnable = m.role === 'user' || (m.role === 'assistant' && !m.tool_calls);
|
|
54
|
+
if (pinnable && i !== directiveIdx && pinned(m, prefixLen + i))
|
|
55
|
+
out.push(i);
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
45
59
|
/**
|
|
46
60
|
* Longest suffix of whole segments that fits `room`, counting the directive's cost
|
|
47
61
|
* separately while it still sits before the suffix. Never leads with a `tool` result.
|
|
@@ -91,20 +105,26 @@ export async function packHandoff(input) {
|
|
|
91
105
|
const directiveIdx = latestDirectiveIndex(convo);
|
|
92
106
|
const directive = directiveIdx >= 0 ? convo[directiveIdx] : undefined;
|
|
93
107
|
const directiveTokens = directive ? messageTokens(directive, estimate) : 0;
|
|
108
|
+
// Pinned messages are charged up front (conservatively, even if the tail reaches them).
|
|
109
|
+
const pins = pinnedIndices(convo, prefixLen, directiveIdx, input.pinned);
|
|
110
|
+
const pinTokens = pins.reduce((sum, i) => sum + messageTokens(convo[i], estimate), 0);
|
|
111
|
+
const coreTokens = directiveTokens + pinTokens;
|
|
94
112
|
// The irreducible core does not fit: send it anyway and say so.
|
|
95
|
-
if (systemTokens +
|
|
96
|
-
const core =
|
|
97
|
-
return result(core, convo.length - (directive ? 1 : 0), estimate, { fits: false });
|
|
113
|
+
if (systemTokens + coreTokens > budget) {
|
|
114
|
+
const core = [...system, ...pins.map((i) => convo[i]), ...(directive ? [directive] : [])];
|
|
115
|
+
return result(core, convo.length - pins.length - (directive ? 1 : 0), estimate, { fits: false });
|
|
98
116
|
}
|
|
99
117
|
// Reserve room for the smallest note (the marker, at its widest count) when it fits.
|
|
100
118
|
const header = handoffLine(input.from, input.to);
|
|
101
119
|
const minNote = noteTokens(composeNote(header, elisionMarker(convo.length)), estimate);
|
|
102
|
-
const noteFits = systemTokens +
|
|
103
|
-
const room = budget - systemTokens - (noteFits ? minNote : 0);
|
|
120
|
+
const noteFits = systemTokens + coreTokens + minNote <= budget;
|
|
121
|
+
const room = budget - systemTokens - pinTokens - (noteFits ? minNote : 0);
|
|
104
122
|
const tail = selectTail(convo, segmentTranscript(convo, estimate), directiveIdx, directiveTokens, room);
|
|
105
123
|
const reinject = directive !== undefined && directiveIdx < tail.start;
|
|
106
|
-
const
|
|
107
|
-
const
|
|
124
|
+
const pinnedBefore = pins.filter((i) => i < tail.start);
|
|
125
|
+
const keptBefore = new Set(pinnedBefore);
|
|
126
|
+
const droppedMsgs = convo.slice(0, tail.start).filter((_, i) => !(reinject && i === directiveIdx) && !keptBefore.has(i));
|
|
127
|
+
const used = systemTokens + tail.tokens + pinTokens + (reinject ? directiveTokens : 0);
|
|
108
128
|
const note = droppedMsgs.length > 0
|
|
109
129
|
? await buildNote({
|
|
110
130
|
header,
|
|
@@ -119,7 +139,7 @@ export async function packHandoff(input) {
|
|
|
119
139
|
: null;
|
|
120
140
|
const after = reinject && directive ? [directive] : [];
|
|
121
141
|
after.push(...convo.slice(tail.start));
|
|
122
|
-
const messages = [...system];
|
|
142
|
+
const messages = [...system, ...pinnedBefore.map((i) => convo[i])];
|
|
123
143
|
if (note)
|
|
124
144
|
messages.push({ role: noteRole(after[0]), content: note.text });
|
|
125
145
|
messages.push(...after);
|
package/dist/handoff/pack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/handoff/pack.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/handoff/pack.ts"],"names":[],"mappings":"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"}
|
package/dist/handoff/types.d.ts
CHANGED
|
@@ -34,6 +34,16 @@ export interface HandoffPackInput {
|
|
|
34
34
|
* when omitted.
|
|
35
35
|
*/
|
|
36
36
|
timeoutMs?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Messages that must survive packing verbatim even when they fall in the dropped
|
|
39
|
+
* middle — e.g. the task brief (the FIRST user message), which the latest-directive
|
|
40
|
+
* rule does not protect once a nudge or steer has become the latest user turn.
|
|
41
|
+
* `index` is the position in {@link messages}. Only `user` messages and `assistant`
|
|
42
|
+
* messages without `tool_calls` can be pinned (moving a tool-call turn would split it
|
|
43
|
+
* from its results); leading system messages are always kept anyway. A pinned message
|
|
44
|
+
* that is dropped is re-injected right after the system prefix, in original order.
|
|
45
|
+
*/
|
|
46
|
+
pinned?: (message: HandoffMessage, index: number) => boolean;
|
|
37
47
|
}
|
|
38
48
|
/** The packed transcript and how it was made. */
|
|
39
49
|
export interface HandoffPack {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/handoff/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yFAAyF;AACzF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,kDAAkD;IAClD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,qCAAqC;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpE,+DAA+D;IAC/D,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/handoff/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yFAAyF;AACzF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,kDAAkD;IAClD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,qCAAqC;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpE,+DAA+D;IAC/D,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CAC9D;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,qFAAqF;IACrF,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,4FAA4F;IAC5F,IAAI,EAAE,OAAO,CAAC;CACf;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC"}
|
|
@@ -137,6 +137,10 @@ export declare class MemoryStore {
|
|
|
137
137
|
* ranker produced the ordering — `'embedding'` only when the query and the
|
|
138
138
|
* candidates really embedded, `'lexical'` when the ordering is BM25 alone.
|
|
139
139
|
* One blend implementation: the shared `hybridRetrieve` primitive.
|
|
140
|
+
*
|
|
141
|
+
* Each fact's importance and write time are handed to that primitive, so
|
|
142
|
+
* `opts.importanceWeight` / `opts.recencyHalfLifeDays` rank by them (both
|
|
143
|
+
* off by default here; the memory MCP server turns them on for recall).
|
|
140
144
|
*/
|
|
141
145
|
recallRanked(query: string, topK: number, runtime?: SSMRuntimeRef, opts?: HybridRetrieveOptions): Promise<RankedRecall>;
|
|
142
146
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStore.d.ts","sourceRoot":"","sources":["../../src/memory/MemoryStore.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MemoryStore.d.ts","sourceRoot":"","sources":["../../src/memory/MemoryStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -218,6 +218,10 @@ export class MemoryStore {
|
|
|
218
218
|
* ranker produced the ordering — `'embedding'` only when the query and the
|
|
219
219
|
* candidates really embedded, `'lexical'` when the ordering is BM25 alone.
|
|
220
220
|
* One blend implementation: the shared `hybridRetrieve` primitive.
|
|
221
|
+
*
|
|
222
|
+
* Each fact's importance and write time are handed to that primitive, so
|
|
223
|
+
* `opts.importanceWeight` / `opts.recencyHalfLifeDays` rank by them (both
|
|
224
|
+
* off by default here; the memory MCP server turns them on for recall).
|
|
221
225
|
*/
|
|
222
226
|
async recallRanked(query, topK, runtime, opts) {
|
|
223
227
|
return this._recall.ranked(await this.recallAll(), query, topK, runtime, opts);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStore.js","sourceRoot":"","sources":["../../src/memory/MemoryStore.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MemoryStore.js","sourceRoot":"","sources":["../../src/memory/MemoryStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SemanticRecall.d.ts","sourceRoot":"","sources":["../../src/memory/SemanticRecall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAmE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACpI,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,WAAW,qBAAqB;IAClC,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;CACxB;AAQD,qBAAa,cAAc;IASX,OAAO,CAAC,QAAQ,CAAC,KAAK;IARlC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;IAC/D,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,WAAW,CAA0B;IAC7C,kEAAkE;IAClE,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,aAAa,CAAiB;gBAET,KAAK,EAAE,qBAAqB;IAEzD,sEAAsE;IACtE,UAAU,IAAI,IAAI;IAKlB,oEAAoE;IACpE,UAAU,IAAI,IAAI;IAMlB;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyBhH;;;;OAIG;IACG,MAAM,CACR,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,EACvB,IAAI,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"SemanticRecall.d.ts","sourceRoot":"","sources":["../../src/memory/SemanticRecall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAmE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACpI,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,WAAW,qBAAqB;IAClC,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;CACxB;AAQD,qBAAa,cAAc;IASX,OAAO,CAAC,QAAQ,CAAC,KAAK;IARlC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;IAC/D,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;IACjE,OAAO,CAAC,WAAW,CAA0B;IAC7C,kEAAkE;IAClE,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,aAAa,CAAiB;gBAET,KAAK,EAAE,qBAAqB;IAEzD,sEAAsE;IACtE,UAAU,IAAI,IAAI;IAKlB,oEAAoE;IACpE,UAAU,IAAI,IAAI;IAMlB;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyBhH;;;;OAIG;IACG,MAAM,CACR,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,EACvB,IAAI,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC;IAuBxB,OAAO,CAAC,MAAM;IAKd;;;;OAIG;YACW,MAAM;IA6BpB;;;;;OAKG;YACW,UAAU;CAyC3B"}
|
|
@@ -78,7 +78,10 @@ export class SemanticRecall {
|
|
|
78
78
|
const candidates = [];
|
|
79
79
|
for (const entry of all) {
|
|
80
80
|
const vector = queryVec ? (await this._embed(runtime, entry.content)) ?? undefined : undefined;
|
|
81
|
-
|
|
81
|
+
// Importance + write time ride along so the caller can turn on the
|
|
82
|
+
// ranking signals (HybridRetrieveOptions.importanceWeight /
|
|
83
|
+
// recencyHalfLifeDays); they are ignored when those are off.
|
|
84
|
+
candidates.push({ id: entry.key, text: entry.content, vector, importance: entry.importance, timestamp: entry.timestamp });
|
|
82
85
|
}
|
|
83
86
|
const dense = !!queryVec && candidates.some((c) => !!c.vector);
|
|
84
87
|
const hits = hybridRetrieve({ text: query, vector: queryVec }, candidates, { topK, annThreshold: this._opts.annThreshold, ...opts });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SemanticRecall.js","sourceRoot":"","sources":["../../src/memory/SemanticRecall.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SemanticRecall.js","sourceRoot":"","sources":["../../src/memory/SemanticRecall.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
* 1. Dense: cosine over embeddings (SSM hidden-state vectors, or any embedder).
|
|
8
8
|
* 2. Sparse: BM25 lexical scoring (catches exact tokens dense search misses).
|
|
9
9
|
* 3. Fuse: Reciprocal Rank Fusion combines the two rankings.
|
|
10
|
-
* 4.
|
|
10
|
+
* 4. Signals: optional importance weighting and half-life recency decay over
|
|
11
|
+
* the fused scores (off by default; memory recall turns both on).
|
|
12
|
+
* 5. Rerank: optional MMR pass for relevance/novelty trade-off (diversity).
|
|
11
13
|
*
|
|
12
14
|
* It is storage-agnostic — give it candidates (id + text + optional vector) and a
|
|
13
15
|
* query (text + optional vector). It degrades gracefully: no query vector / no
|
|
@@ -19,6 +21,10 @@ export interface RetrievalCandidate {
|
|
|
19
21
|
text: string;
|
|
20
22
|
/** Precomputed embedding. Omit to exclude this candidate from the dense pass. */
|
|
21
23
|
vector?: Float32Array;
|
|
24
|
+
/** Importance 0–1, read only when {@link HybridRetrieveOptions.importanceWeight} is on. Default 0.5. */
|
|
25
|
+
importance?: number;
|
|
26
|
+
/** Unix-ms write time, read only when {@link HybridRetrieveOptions.recencyHalfLifeDays} is set. */
|
|
27
|
+
timestamp?: number;
|
|
22
28
|
}
|
|
23
29
|
export interface HybridQuery {
|
|
24
30
|
text: string;
|
|
@@ -45,11 +51,24 @@ export interface HybridRetrieveOptions {
|
|
|
45
51
|
* instead of an exact cosine scan (O(log N) vs O(N)). Default 256.
|
|
46
52
|
*/
|
|
47
53
|
annThreshold?: number;
|
|
54
|
+
/**
|
|
55
|
+
* Multiply each fused score by `0.5 + importance` (candidate importance,
|
|
56
|
+
* default 0.5 ⇒ ×1) — the same factor the cloud recall applies. Default false.
|
|
57
|
+
*/
|
|
58
|
+
importanceWeight?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Half-life, in days, of the recency decay applied to each fused score from
|
|
61
|
+
* the candidate's `timestamp` (see `decay.ts`). 0/unset = no decay. A
|
|
62
|
+
* candidate with no timestamp is not decayed.
|
|
63
|
+
*/
|
|
64
|
+
recencyHalfLifeDays?: number;
|
|
65
|
+
/** Clock for the recency decay (Unix ms). Default `Date.now()`. */
|
|
66
|
+
now?: number;
|
|
48
67
|
}
|
|
49
68
|
export interface HybridHit {
|
|
50
69
|
id: string;
|
|
51
70
|
text: string;
|
|
52
|
-
/** Fused RRF score (pre-rerank). */
|
|
71
|
+
/** Fused RRF score (pre-rerank), times the ranking-signal factor when signals are on. */
|
|
53
72
|
score: number;
|
|
54
73
|
}
|
|
55
74
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HybridRetriever.d.ts","sourceRoot":"","sources":["../../src/retrieval/HybridRetriever.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"HybridRetriever.d.ts","sourceRoot":"","sources":["../../src/retrieval/HybridRetriever.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAOzD,MAAM,WAAW,kBAAkB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,wGAAwG;IACxG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mGAAmG;IACnG,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IAClC,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAqBD,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC1B,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,kBAAkB,EAAE,EAChC,IAAI,GAAE,qBAA0B,GACjC,SAAS,EAAE,CAuEb"}
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
* 1. Dense: cosine over embeddings (SSM hidden-state vectors, or any embedder).
|
|
8
8
|
* 2. Sparse: BM25 lexical scoring (catches exact tokens dense search misses).
|
|
9
9
|
* 3. Fuse: Reciprocal Rank Fusion combines the two rankings.
|
|
10
|
-
* 4.
|
|
10
|
+
* 4. Signals: optional importance weighting and half-life recency decay over
|
|
11
|
+
* the fused scores (off by default; memory recall turns both on).
|
|
12
|
+
* 5. Rerank: optional MMR pass for relevance/novelty trade-off (diversity).
|
|
11
13
|
*
|
|
12
14
|
* It is storage-agnostic — give it candidates (id + text + optional vector) and a
|
|
13
15
|
* query (text + optional vector). It degrades gracefully: no query vector / no
|
|
@@ -15,8 +17,27 @@
|
|
|
15
17
|
*/
|
|
16
18
|
import { bm25Search } from './bm25.js';
|
|
17
19
|
import { reciprocalRankFusion } from './fusion.js';
|
|
18
|
-
import {
|
|
20
|
+
import { mmrSelect } from './mmr.js';
|
|
19
21
|
import { denseSearch } from './hnsw.js';
|
|
22
|
+
import { calculateTemporalDecayMultiplier } from './decay.js';
|
|
23
|
+
import { cosineSimilarity } from '../similarity/index.js';
|
|
24
|
+
const DAY_MS = 86_400_000;
|
|
25
|
+
/**
|
|
26
|
+
* The ranking-signal factor for one candidate: importance × recency decay.
|
|
27
|
+
* Exactly 1 when neither signal is enabled, so the pipeline is unchanged.
|
|
28
|
+
*/
|
|
29
|
+
function signalFactor(c, opts, now) {
|
|
30
|
+
let f = 1;
|
|
31
|
+
if (opts.importanceWeight) {
|
|
32
|
+
const imp = Number.isFinite(c.importance) ? c.importance : 0.5;
|
|
33
|
+
f *= 0.5 + Math.max(0, Math.min(1, imp));
|
|
34
|
+
}
|
|
35
|
+
const halfLife = opts.recencyHalfLifeDays ?? 0;
|
|
36
|
+
if (halfLife > 0 && Number.isFinite(c.timestamp)) {
|
|
37
|
+
f *= calculateTemporalDecayMultiplier({ ageInDays: (now - c.timestamp) / DAY_MS, halfLifeDays: halfLife });
|
|
38
|
+
}
|
|
39
|
+
return f;
|
|
40
|
+
}
|
|
20
41
|
/**
|
|
21
42
|
* Runs the full hybrid pipeline over `candidates` and returns the top-K hits.
|
|
22
43
|
* Pure given its inputs (embeddings are supplied by the caller) so it is directly
|
|
@@ -47,32 +68,45 @@ export function hybridRetrieve(query, candidates, opts = {}) {
|
|
|
47
68
|
].filter(l => l.ids.length > 0), opts.rrfK ?? 60);
|
|
48
69
|
if (fused.length === 0)
|
|
49
70
|
return [];
|
|
50
|
-
// ──
|
|
71
|
+
// ── Signals (importance × recency decay over the fused scores) ────────────
|
|
72
|
+
const now = opts.now ?? Date.now();
|
|
73
|
+
const factor = new Map(fused.map(f => [f.id, signalFactor(byId.get(f.id), opts, now)]));
|
|
74
|
+
const weighted = fused
|
|
75
|
+
.map(f => ({ id: f.id, score: f.score * factor.get(f.id) }))
|
|
76
|
+
.sort((a, b) => b.score - a.score);
|
|
77
|
+
// ── Rerank (MMR over the weighted top, using whatever vectors we have) ────
|
|
51
78
|
const rerank = opts.rerank ?? true;
|
|
52
79
|
let orderedIds;
|
|
53
80
|
if (rerank && query.vector) {
|
|
54
|
-
|
|
55
|
-
|
|
81
|
+
const queryVec = query.vector;
|
|
82
|
+
// Consider a generous window so MMR has room to diversify.
|
|
83
|
+
const window = weighted.slice(0, Math.max(topK * 4, topK));
|
|
56
84
|
const mmrCands = window
|
|
57
85
|
.map(f => byId.get(f.id))
|
|
58
|
-
.filter((c) => !!c && !!c.vector && c.vector.length > 0)
|
|
59
|
-
.map(c => ({ id: c.id, vector: c.vector }));
|
|
86
|
+
.filter((c) => !!c && !!c.vector && c.vector.length > 0);
|
|
60
87
|
if (mmrCands.length > 0) {
|
|
61
|
-
|
|
62
|
-
// MMR
|
|
88
|
+
// Relevance is cosine to the query scaled by the same signal factor, so
|
|
89
|
+
// MMR cannot undo the importance/recency weighting (factor 1 when off).
|
|
90
|
+
const reranked = mmrSelect(mmrCands, {
|
|
91
|
+
relevance: (c) => cosineSimilarity(queryVec, c.vector) * factor.get(c.id),
|
|
92
|
+
similarity: (a, b) => cosineSimilarity(a.vector, b.vector),
|
|
93
|
+
lambda: opts.mmrLambda ?? 0.7,
|
|
94
|
+
topK,
|
|
95
|
+
}).map(c => c.id);
|
|
96
|
+
// MMR only ranks the vectored subset; append any remaining ids after.
|
|
63
97
|
const seen = new Set(reranked);
|
|
64
|
-
orderedIds = [...reranked, ...
|
|
98
|
+
orderedIds = [...reranked, ...weighted.map(f => f.id).filter(id => !seen.has(id))];
|
|
65
99
|
}
|
|
66
100
|
else {
|
|
67
|
-
orderedIds =
|
|
101
|
+
orderedIds = weighted.map(f => f.id);
|
|
68
102
|
}
|
|
69
103
|
}
|
|
70
104
|
else {
|
|
71
|
-
orderedIds =
|
|
105
|
+
orderedIds = weighted.map(f => f.id);
|
|
72
106
|
}
|
|
73
|
-
const
|
|
107
|
+
const score = new Map(weighted.map(f => [f.id, f.score]));
|
|
74
108
|
return orderedIds
|
|
75
109
|
.slice(0, topK)
|
|
76
|
-
.map(id => ({ id, text: byId.get(id).text, score:
|
|
110
|
+
.map(id => ({ id, text: byId.get(id).text, score: score.get(id) }));
|
|
77
111
|
}
|
|
78
112
|
//# sourceMappingURL=HybridRetriever.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HybridRetriever.js","sourceRoot":"","sources":["../../src/retrieval/HybridRetriever.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"HybridRetriever.js","sourceRoot":"","sources":["../../src/retrieval/HybridRetriever.ts"],"names":[],"mappings":"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"}
|
package/dist/wire/usage.d.ts
CHANGED
|
@@ -25,6 +25,14 @@ export interface UsageFields {
|
|
|
25
25
|
cacheReadTokens?: number;
|
|
26
26
|
/** `cache_creation_input_tokens`. */
|
|
27
27
|
cacheCreationTokens?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Hidden reasoning tokens, a SUBSET of `completionTokens` (billed as output):
|
|
30
|
+
* `completion_tokens_details.reasoning_tokens` (OpenAI chat, OpenRouter), else
|
|
31
|
+
* `output_tokens_details.reasoning_tokens` (OpenAI Responses), else a top-level
|
|
32
|
+
* `reasoning_tokens` (some OpenRouter upstreams). Anthropic folds extended-thinking
|
|
33
|
+
* tokens into `output_tokens` and reports no split, so it reads as absent — never 0.
|
|
34
|
+
*/
|
|
35
|
+
reasoningTokens?: number;
|
|
28
36
|
}
|
|
29
37
|
/** Reads a vendor `usage` object of either shape. Anything that is not an object reads as empty. */
|
|
30
38
|
export declare function readUsageFields(u: unknown): UsageFields;
|
package/dist/wire/usage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/wire/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI3D;AAED,yFAAyF;AACzF,MAAM,WAAW,WAAW;IACxB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/wire/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI3D;AAED,yFAAyF;AACzF,MAAM,WAAW,WAAW;IACxB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AASD,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,WAAW,CAsBvD;AAED,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,2FAA2F;AAC3F,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyG;IAEhI,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAmB7B,MAAM,IAAI,oBAAoB;CAGjC"}
|
package/dist/wire/usage.js
CHANGED
|
@@ -19,6 +19,12 @@ export function finiteNumber(v) {
|
|
|
19
19
|
const n = Number(v);
|
|
20
20
|
return Number.isFinite(n) ? n : undefined;
|
|
21
21
|
}
|
|
22
|
+
/** `details[key]` when `details` is an object, else undefined. */
|
|
23
|
+
function detailNumber(details, key) {
|
|
24
|
+
return details && typeof details === 'object'
|
|
25
|
+
? finiteNumber(details[key])
|
|
26
|
+
: undefined;
|
|
27
|
+
}
|
|
22
28
|
/** Reads a vendor `usage` object of either shape. Anything that is not an object reads as empty. */
|
|
23
29
|
export function readUsageFields(u) {
|
|
24
30
|
const out = {};
|
|
@@ -34,16 +40,18 @@ export function readUsageFields(u) {
|
|
|
34
40
|
out.completionTokens = completion;
|
|
35
41
|
if (total !== undefined)
|
|
36
42
|
out.totalTokens = total;
|
|
37
|
-
const
|
|
38
|
-
const cachedFromDetails = details && typeof details === 'object'
|
|
39
|
-
? finiteNumber(details['cached_tokens'])
|
|
40
|
-
: undefined;
|
|
43
|
+
const cachedFromDetails = detailNumber(usage['prompt_tokens_details'], 'cached_tokens');
|
|
41
44
|
const cacheRead = finiteNumber(usage['cache_read_input_tokens']) ?? cachedFromDetails;
|
|
42
45
|
const cacheCreation = finiteNumber(usage['cache_creation_input_tokens']);
|
|
43
46
|
if (cacheRead !== undefined)
|
|
44
47
|
out.cacheReadTokens = cacheRead;
|
|
45
48
|
if (cacheCreation !== undefined)
|
|
46
49
|
out.cacheCreationTokens = cacheCreation;
|
|
50
|
+
const reasoning = detailNumber(usage['completion_tokens_details'], 'reasoning_tokens')
|
|
51
|
+
?? detailNumber(usage['output_tokens_details'], 'reasoning_tokens')
|
|
52
|
+
?? finiteNumber(usage['reasoning_tokens']);
|
|
53
|
+
if (reasoning !== undefined)
|
|
54
|
+
out.reasoningTokens = reasoning;
|
|
47
55
|
return out;
|
|
48
56
|
}
|
|
49
57
|
/** Folds the usage events of one Anthropic Messages stream. Feed it every parsed frame. */
|
package/dist/wire/usage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/wire/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,CAAU;IACnC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/wire/usage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seanhogg/builderforce-memory",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.22",
|
|
4
4
|
"description": "BuilderForce Agent Memory — runtime layer. SSM execution, Transformer orchestration, online distillation, enterprise RAG (ingestion pipelines, vector-store adapters, tenant/ACL-scoped hybrid retrieval), multi-agent graph orchestration, LLM telemetry and cost accounting, and persistent agent memory for BuilderForce.ai agents.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
},
|
|
100
100
|
"homepage": "https://github.com/SeanHogg/builderforce-memory/tree/main/packages/memory#readme",
|
|
101
101
|
"peerDependencies": {
|
|
102
|
-
"@seanhogg/builderforce-memory-engine": "^2026.10.
|
|
102
|
+
"@seanhogg/builderforce-memory-engine": "^2026.10.22"
|
|
103
103
|
},
|
|
104
104
|
"devDependencies": {
|
|
105
105
|
"@jest/globals": "^29.7.0",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"ts-jest": "^29.2.0",
|
|
114
114
|
"typescript": "^6.0.3",
|
|
115
115
|
"@typescript/native-preview": "7.0.0-dev.20260627.2",
|
|
116
|
-
"@seanhogg/builderforce-memory-engine": "2026.10.
|
|
116
|
+
"@seanhogg/builderforce-memory-engine": "2026.10.22"
|
|
117
117
|
},
|
|
118
118
|
"jest": {
|
|
119
119
|
"preset": "ts-jest/presets/default-esm",
|
|
@@ -230,6 +230,33 @@ describe('packHandoff', () => {
|
|
|
230
230
|
expect(noteOf(same)).toBe('S');
|
|
231
231
|
});
|
|
232
232
|
|
|
233
|
+
it('keeps a PINNED message (the task brief) verbatim after the system prefix when the middle is dropped', async () => {
|
|
234
|
+
const brief = msg('user', 'the task brief');
|
|
235
|
+
const nudge = msg('user', 'keep going');
|
|
236
|
+
const messages: HandoffMessage[] = [SYSTEM, brief, msg('assistant', 'ok'), nudge];
|
|
237
|
+
for (let i = 0; i < 10; i++) messages.push(msg('assistant', `step${i}`));
|
|
238
|
+
const pinned = (_m: HandoffMessage, i: number) => i === 1;
|
|
239
|
+
const pack = await packHandoff({ messages, ...BUDGET, pinned });
|
|
240
|
+
expectWithinBudget(pack);
|
|
241
|
+
expect(pack.messages[0]).toBe(SYSTEM);
|
|
242
|
+
expect(pack.messages[1]).toBe(brief);
|
|
243
|
+
expect(pack.messages.filter((m) => m === brief)).toHaveLength(1);
|
|
244
|
+
expect(pack.messages).toContain(nudge);
|
|
245
|
+
expect(pack.messages[pack.messages.length - 1]!.content).toBe(msg('assistant', 'step9').content);
|
|
246
|
+
|
|
247
|
+
// Without the pin the brief is summarised away.
|
|
248
|
+
const unpinned = await packHandoff({ messages, ...BUDGET });
|
|
249
|
+
expect(unpinned.messages).not.toContain(brief);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it('never pins a tool-call turn (it would split from its results)', async () => {
|
|
253
|
+
const call = { role: 'assistant' as const, content: '', tool_calls: [{ id: 'c1' }] };
|
|
254
|
+
const messages: HandoffMessage[] = [SYSTEM, msg('user', 'task'), call, { role: 'tool', content: 'r'.repeat(40), tool_call_id: 'c1' }];
|
|
255
|
+
for (let i = 0; i < 10; i++) messages.push(msg('assistant', `step${i}`));
|
|
256
|
+
const pack = await packHandoff({ messages, ...BUDGET, pinned: (m) => m === call });
|
|
257
|
+
expect(pack.messages[1]).not.toBe(call);
|
|
258
|
+
});
|
|
259
|
+
|
|
233
260
|
it('reports fits:false only when the system message + directive alone exceed the budget', async () => {
|
|
234
261
|
const big = { role: 'system' as const, content: 'q'.repeat(400) }; // 104 tokens
|
|
235
262
|
const directive = msg('user', 'do it');
|
package/src/handoff/pack.ts
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Shape of the result, mirroring Builderforce's `assembleCompacted`
|
|
5
5
|
* (brain-embedded/src/workingTranscript.ts):
|
|
6
6
|
*
|
|
7
|
-
* leading system message(s) ·
|
|
8
|
-
*
|
|
7
|
+
* leading system message(s) · pinned messages that fell in the middle (`pinned`) ·
|
|
8
|
+
* ONE note for the dropped middle · the latest user directive re-injected verbatim
|
|
9
|
+
* (only when it fell in the middle) · the verbatim tail
|
|
9
10
|
*
|
|
10
11
|
* Only the LEADING run of system messages is the fixed prefix. A system message later in
|
|
11
12
|
* the conversation stays where it was: in the tail when the tail reaches it, else in the
|
|
@@ -51,6 +52,23 @@ function latestDirectiveIndex(convo: readonly HandoffMessage[]): number {
|
|
|
51
52
|
return -1;
|
|
52
53
|
}
|
|
53
54
|
|
|
55
|
+
/** Convo indices the caller pinned (pinnable roles only), excluding the directive. */
|
|
56
|
+
function pinnedIndices(
|
|
57
|
+
convo: readonly HandoffMessage[],
|
|
58
|
+
prefixLen: number,
|
|
59
|
+
directiveIdx: number,
|
|
60
|
+
pinned: HandoffPackInput['pinned'],
|
|
61
|
+
): number[] {
|
|
62
|
+
if (!pinned) return [];
|
|
63
|
+
const out: number[] = [];
|
|
64
|
+
for (let i = 0; i < convo.length; i++) {
|
|
65
|
+
const m = convo[i]!;
|
|
66
|
+
const pinnable = m.role === 'user' || (m.role === 'assistant' && !m.tool_calls);
|
|
67
|
+
if (pinnable && i !== directiveIdx && pinned(m, prefixLen + i)) out.push(i);
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
|
|
54
72
|
/**
|
|
55
73
|
* Longest suffix of whole segments that fits `room`, counting the directive's cost
|
|
56
74
|
* separately while it still sits before the suffix. Never leads with a `tool` result.
|
|
@@ -113,24 +131,30 @@ export async function packHandoff(input: HandoffPackInput): Promise<HandoffPack>
|
|
|
113
131
|
const directiveIdx = latestDirectiveIndex(convo);
|
|
114
132
|
const directive = directiveIdx >= 0 ? convo[directiveIdx] : undefined;
|
|
115
133
|
const directiveTokens = directive ? messageTokens(directive, estimate) : 0;
|
|
134
|
+
// Pinned messages are charged up front (conservatively, even if the tail reaches them).
|
|
135
|
+
const pins = pinnedIndices(convo, prefixLen, directiveIdx, input.pinned);
|
|
136
|
+
const pinTokens = pins.reduce((sum, i) => sum + messageTokens(convo[i]!, estimate), 0);
|
|
137
|
+
const coreTokens = directiveTokens + pinTokens;
|
|
116
138
|
|
|
117
139
|
// The irreducible core does not fit: send it anyway and say so.
|
|
118
|
-
if (systemTokens +
|
|
119
|
-
const core =
|
|
120
|
-
return result(core, convo.length - (directive ? 1 : 0), estimate, { fits: false });
|
|
140
|
+
if (systemTokens + coreTokens > budget) {
|
|
141
|
+
const core = [...system, ...pins.map((i) => convo[i]!), ...(directive ? [directive] : [])];
|
|
142
|
+
return result(core, convo.length - pins.length - (directive ? 1 : 0), estimate, { fits: false });
|
|
121
143
|
}
|
|
122
144
|
|
|
123
145
|
// Reserve room for the smallest note (the marker, at its widest count) when it fits.
|
|
124
146
|
const header = handoffLine(input.from, input.to);
|
|
125
147
|
const minNote = noteTokens(composeNote(header, elisionMarker(convo.length)), estimate);
|
|
126
|
-
const noteFits = systemTokens +
|
|
127
|
-
const room = budget - systemTokens - (noteFits ? minNote : 0);
|
|
148
|
+
const noteFits = systemTokens + coreTokens + minNote <= budget;
|
|
149
|
+
const room = budget - systemTokens - pinTokens - (noteFits ? minNote : 0);
|
|
128
150
|
|
|
129
151
|
const tail = selectTail(convo, segmentTranscript(convo, estimate), directiveIdx, directiveTokens, room);
|
|
130
152
|
const reinject = directive !== undefined && directiveIdx < tail.start;
|
|
131
|
-
const
|
|
153
|
+
const pinnedBefore = pins.filter((i) => i < tail.start);
|
|
154
|
+
const keptBefore = new Set(pinnedBefore);
|
|
155
|
+
const droppedMsgs = convo.slice(0, tail.start).filter((_, i) => !(reinject && i === directiveIdx) && !keptBefore.has(i));
|
|
132
156
|
|
|
133
|
-
const used = systemTokens + tail.tokens + (reinject ? directiveTokens : 0);
|
|
157
|
+
const used = systemTokens + tail.tokens + pinTokens + (reinject ? directiveTokens : 0);
|
|
134
158
|
const note = droppedMsgs.length > 0
|
|
135
159
|
? await buildNote({
|
|
136
160
|
header,
|
|
@@ -146,7 +170,7 @@ export async function packHandoff(input: HandoffPackInput): Promise<HandoffPack>
|
|
|
146
170
|
|
|
147
171
|
const after: HandoffMessage[] = reinject && directive ? [directive] : [];
|
|
148
172
|
after.push(...convo.slice(tail.start));
|
|
149
|
-
const messages: HandoffMessage[] = [...system];
|
|
173
|
+
const messages: HandoffMessage[] = [...system, ...pinnedBefore.map((i) => convo[i]!)];
|
|
150
174
|
if (note) messages.push({ role: noteRole(after[0]), content: note.text });
|
|
151
175
|
messages.push(...after);
|
|
152
176
|
return result(messages, droppedMsgs.length, estimate, {
|
package/src/handoff/types.ts
CHANGED
|
@@ -36,6 +36,16 @@ export interface HandoffPackInput {
|
|
|
36
36
|
* when omitted.
|
|
37
37
|
*/
|
|
38
38
|
timeoutMs?: number;
|
|
39
|
+
/**
|
|
40
|
+
* Messages that must survive packing verbatim even when they fall in the dropped
|
|
41
|
+
* middle — e.g. the task brief (the FIRST user message), which the latest-directive
|
|
42
|
+
* rule does not protect once a nudge or steer has become the latest user turn.
|
|
43
|
+
* `index` is the position in {@link messages}. Only `user` messages and `assistant`
|
|
44
|
+
* messages without `tool_calls` can be pinned (moving a tool-call turn would split it
|
|
45
|
+
* from its results); leading system messages are always kept anyway. A pinned message
|
|
46
|
+
* that is dropped is re-injected right after the system prefix, in original order.
|
|
47
|
+
*/
|
|
48
|
+
pinned?: (message: HandoffMessage, index: number) => boolean;
|
|
39
49
|
}
|
|
40
50
|
|
|
41
51
|
/** The packed transcript and how it was made. */
|
|
@@ -272,6 +272,10 @@ export class MemoryStore {
|
|
|
272
272
|
* ranker produced the ordering — `'embedding'` only when the query and the
|
|
273
273
|
* candidates really embedded, `'lexical'` when the ordering is BM25 alone.
|
|
274
274
|
* One blend implementation: the shared `hybridRetrieve` primitive.
|
|
275
|
+
*
|
|
276
|
+
* Each fact's importance and write time are handed to that primitive, so
|
|
277
|
+
* `opts.importanceWeight` / `opts.recencyHalfLifeDays` rank by them (both
|
|
278
|
+
* off by default here; the memory MCP server turns them on for recall).
|
|
275
279
|
*/
|
|
276
280
|
async recallRanked(
|
|
277
281
|
query: string,
|
|
@@ -102,7 +102,10 @@ export class SemanticRecall {
|
|
|
102
102
|
const candidates: RetrievalCandidate[] = [];
|
|
103
103
|
for (const entry of all) {
|
|
104
104
|
const vector = queryVec ? (await this._embed(runtime, entry.content)) ?? undefined : undefined;
|
|
105
|
-
|
|
105
|
+
// Importance + write time ride along so the caller can turn on the
|
|
106
|
+
// ranking signals (HybridRetrieveOptions.importanceWeight /
|
|
107
|
+
// recencyHalfLifeDays); they are ignored when those are off.
|
|
108
|
+
candidates.push({ id: entry.key, text: entry.content, vector, importance: entry.importance, timestamp: entry.timestamp });
|
|
106
109
|
}
|
|
107
110
|
const dense = !!queryVec && candidates.some((c) => !!c.vector);
|
|
108
111
|
const hits = hybridRetrieve({ text: query, vector: queryVec }, candidates, { topK, annThreshold: this._opts.annThreshold, ...opts });
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
* 1. Dense: cosine over embeddings (SSM hidden-state vectors, or any embedder).
|
|
8
8
|
* 2. Sparse: BM25 lexical scoring (catches exact tokens dense search misses).
|
|
9
9
|
* 3. Fuse: Reciprocal Rank Fusion combines the two rankings.
|
|
10
|
-
* 4.
|
|
10
|
+
* 4. Signals: optional importance weighting and half-life recency decay over
|
|
11
|
+
* the fused scores (off by default; memory recall turns both on).
|
|
12
|
+
* 5. Rerank: optional MMR pass for relevance/novelty trade-off (diversity).
|
|
11
13
|
*
|
|
12
14
|
* It is storage-agnostic — give it candidates (id + text + optional vector) and a
|
|
13
15
|
* query (text + optional vector). It degrades gracefully: no query vector / no
|
|
@@ -16,14 +18,20 @@
|
|
|
16
18
|
|
|
17
19
|
import { bm25Search, type Bm25Options } from './bm25.js';
|
|
18
20
|
import { reciprocalRankFusion } from './fusion.js';
|
|
19
|
-
import {
|
|
21
|
+
import { mmrSelect } from './mmr.js';
|
|
20
22
|
import { denseSearch } from './hnsw.js';
|
|
23
|
+
import { calculateTemporalDecayMultiplier } from './decay.js';
|
|
24
|
+
import { cosineSimilarity } from '../similarity/index.js';
|
|
21
25
|
|
|
22
26
|
export interface RetrievalCandidate {
|
|
23
27
|
id: string;
|
|
24
28
|
text: string;
|
|
25
29
|
/** Precomputed embedding. Omit to exclude this candidate from the dense pass. */
|
|
26
30
|
vector?: Float32Array;
|
|
31
|
+
/** Importance 0–1, read only when {@link HybridRetrieveOptions.importanceWeight} is on. Default 0.5. */
|
|
32
|
+
importance?: number;
|
|
33
|
+
/** Unix-ms write time, read only when {@link HybridRetrieveOptions.recencyHalfLifeDays} is set. */
|
|
34
|
+
timestamp?: number;
|
|
27
35
|
}
|
|
28
36
|
|
|
29
37
|
export interface HybridQuery {
|
|
@@ -52,12 +60,44 @@ export interface HybridRetrieveOptions {
|
|
|
52
60
|
* instead of an exact cosine scan (O(log N) vs O(N)). Default 256.
|
|
53
61
|
*/
|
|
54
62
|
annThreshold?: number;
|
|
63
|
+
/**
|
|
64
|
+
* Multiply each fused score by `0.5 + importance` (candidate importance,
|
|
65
|
+
* default 0.5 ⇒ ×1) — the same factor the cloud recall applies. Default false.
|
|
66
|
+
*/
|
|
67
|
+
importanceWeight?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Half-life, in days, of the recency decay applied to each fused score from
|
|
70
|
+
* the candidate's `timestamp` (see `decay.ts`). 0/unset = no decay. A
|
|
71
|
+
* candidate with no timestamp is not decayed.
|
|
72
|
+
*/
|
|
73
|
+
recencyHalfLifeDays?: number;
|
|
74
|
+
/** Clock for the recency decay (Unix ms). Default `Date.now()`. */
|
|
75
|
+
now?: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const DAY_MS = 86_400_000;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The ranking-signal factor for one candidate: importance × recency decay.
|
|
82
|
+
* Exactly 1 when neither signal is enabled, so the pipeline is unchanged.
|
|
83
|
+
*/
|
|
84
|
+
function signalFactor(c: RetrievalCandidate, opts: HybridRetrieveOptions, now: number): number {
|
|
85
|
+
let f = 1;
|
|
86
|
+
if (opts.importanceWeight) {
|
|
87
|
+
const imp = Number.isFinite(c.importance) ? c.importance! : 0.5;
|
|
88
|
+
f *= 0.5 + Math.max(0, Math.min(1, imp));
|
|
89
|
+
}
|
|
90
|
+
const halfLife = opts.recencyHalfLifeDays ?? 0;
|
|
91
|
+
if (halfLife > 0 && Number.isFinite(c.timestamp)) {
|
|
92
|
+
f *= calculateTemporalDecayMultiplier({ ageInDays: (now - c.timestamp!) / DAY_MS, halfLifeDays: halfLife });
|
|
93
|
+
}
|
|
94
|
+
return f;
|
|
55
95
|
}
|
|
56
96
|
|
|
57
97
|
export interface HybridHit {
|
|
58
98
|
id: string;
|
|
59
99
|
text: string;
|
|
60
|
-
/** Fused RRF score (pre-rerank). */
|
|
100
|
+
/** Fused RRF score (pre-rerank), times the ranking-signal factor when signals are on. */
|
|
61
101
|
score: number;
|
|
62
102
|
}
|
|
63
103
|
|
|
@@ -101,30 +141,44 @@ export function hybridRetrieve(
|
|
|
101
141
|
);
|
|
102
142
|
if (fused.length === 0) return [];
|
|
103
143
|
|
|
104
|
-
// ──
|
|
144
|
+
// ── Signals (importance × recency decay over the fused scores) ────────────
|
|
145
|
+
const now = opts.now ?? Date.now();
|
|
146
|
+
const factor = new Map(fused.map(f => [f.id, signalFactor(byId.get(f.id)!, opts, now)]));
|
|
147
|
+
const weighted = fused
|
|
148
|
+
.map(f => ({ id: f.id, score: f.score * factor.get(f.id)! }))
|
|
149
|
+
.sort((a, b) => b.score - a.score);
|
|
150
|
+
|
|
151
|
+
// ── Rerank (MMR over the weighted top, using whatever vectors we have) ────
|
|
105
152
|
const rerank = opts.rerank ?? true;
|
|
106
153
|
let orderedIds: string[];
|
|
107
154
|
if (rerank && query.vector) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const
|
|
155
|
+
const queryVec = query.vector;
|
|
156
|
+
// Consider a generous window so MMR has room to diversify.
|
|
157
|
+
const window = weighted.slice(0, Math.max(topK * 4, topK));
|
|
158
|
+
const mmrCands = window
|
|
111
159
|
.map(f => byId.get(f.id))
|
|
112
|
-
.filter((c): c is RetrievalCandidate => !!c && !!c.vector && c.vector.length > 0)
|
|
113
|
-
.map(c => ({ id: c.id, vector: c.vector! }));
|
|
160
|
+
.filter((c): c is RetrievalCandidate & { vector: Float32Array } => !!c && !!c.vector && c.vector.length > 0);
|
|
114
161
|
if (mmrCands.length > 0) {
|
|
115
|
-
|
|
116
|
-
// MMR
|
|
162
|
+
// Relevance is cosine to the query scaled by the same signal factor, so
|
|
163
|
+
// MMR cannot undo the importance/recency weighting (factor 1 when off).
|
|
164
|
+
const reranked = mmrSelect(mmrCands, {
|
|
165
|
+
relevance: (c) => cosineSimilarity(queryVec, c.vector) * factor.get(c.id)!,
|
|
166
|
+
similarity: (a, b) => cosineSimilarity(a.vector, b.vector),
|
|
167
|
+
lambda: opts.mmrLambda ?? 0.7,
|
|
168
|
+
topK,
|
|
169
|
+
}).map(c => c.id);
|
|
170
|
+
// MMR only ranks the vectored subset; append any remaining ids after.
|
|
117
171
|
const seen = new Set(reranked);
|
|
118
|
-
orderedIds = [...reranked, ...
|
|
172
|
+
orderedIds = [...reranked, ...weighted.map(f => f.id).filter(id => !seen.has(id))];
|
|
119
173
|
} else {
|
|
120
|
-
orderedIds =
|
|
174
|
+
orderedIds = weighted.map(f => f.id);
|
|
121
175
|
}
|
|
122
176
|
} else {
|
|
123
|
-
orderedIds =
|
|
177
|
+
orderedIds = weighted.map(f => f.id);
|
|
124
178
|
}
|
|
125
179
|
|
|
126
|
-
const
|
|
180
|
+
const score = new Map(weighted.map(f => [f.id, f.score]));
|
|
127
181
|
return orderedIds
|
|
128
182
|
.slice(0, topK)
|
|
129
|
-
.map(id => ({ id, text: byId.get(id)!.text, score:
|
|
183
|
+
.map(id => ({ id, text: byId.get(id)!.text, score: score.get(id)! }));
|
|
130
184
|
}
|
package/src/wire/usage.ts
CHANGED
|
@@ -31,6 +31,21 @@ export interface UsageFields {
|
|
|
31
31
|
cacheReadTokens?: number;
|
|
32
32
|
/** `cache_creation_input_tokens`. */
|
|
33
33
|
cacheCreationTokens?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Hidden reasoning tokens, a SUBSET of `completionTokens` (billed as output):
|
|
36
|
+
* `completion_tokens_details.reasoning_tokens` (OpenAI chat, OpenRouter), else
|
|
37
|
+
* `output_tokens_details.reasoning_tokens` (OpenAI Responses), else a top-level
|
|
38
|
+
* `reasoning_tokens` (some OpenRouter upstreams). Anthropic folds extended-thinking
|
|
39
|
+
* tokens into `output_tokens` and reports no split, so it reads as absent — never 0.
|
|
40
|
+
*/
|
|
41
|
+
reasoningTokens?: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** `details[key]` when `details` is an object, else undefined. */
|
|
45
|
+
function detailNumber(details: unknown, key: string): number | undefined {
|
|
46
|
+
return details && typeof details === 'object'
|
|
47
|
+
? finiteNumber((details as Record<string, unknown>)[key])
|
|
48
|
+
: undefined;
|
|
34
49
|
}
|
|
35
50
|
|
|
36
51
|
/** Reads a vendor `usage` object of either shape. Anything that is not an object reads as empty. */
|
|
@@ -45,14 +60,16 @@ export function readUsageFields(u: unknown): UsageFields {
|
|
|
45
60
|
if (completion !== undefined) out.completionTokens = completion;
|
|
46
61
|
if (total !== undefined) out.totalTokens = total;
|
|
47
62
|
|
|
48
|
-
const
|
|
49
|
-
const cachedFromDetails = details && typeof details === 'object'
|
|
50
|
-
? finiteNumber((details as Record<string, unknown>)['cached_tokens'])
|
|
51
|
-
: undefined;
|
|
63
|
+
const cachedFromDetails = detailNumber(usage['prompt_tokens_details'], 'cached_tokens');
|
|
52
64
|
const cacheRead = finiteNumber(usage['cache_read_input_tokens']) ?? cachedFromDetails;
|
|
53
65
|
const cacheCreation = finiteNumber(usage['cache_creation_input_tokens']);
|
|
54
66
|
if (cacheRead !== undefined) out.cacheReadTokens = cacheRead;
|
|
55
67
|
if (cacheCreation !== undefined) out.cacheCreationTokens = cacheCreation;
|
|
68
|
+
|
|
69
|
+
const reasoning = detailNumber(usage['completion_tokens_details'], 'reasoning_tokens')
|
|
70
|
+
?? detailNumber(usage['output_tokens_details'], 'reasoning_tokens')
|
|
71
|
+
?? finiteNumber(usage['reasoning_tokens']);
|
|
72
|
+
if (reasoning !== undefined) out.reasoningTokens = reasoning;
|
|
56
73
|
return out;
|
|
57
74
|
}
|
|
58
75
|
|