@seanhogg/builderforce-memory-mcp 2026.10.2 → 2026.10.3
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/experience/file-store.d.ts +2 -1
- package/dist/experience/file-store.d.ts.map +1 -1
- package/dist/experience/file-store.js +4 -0
- package/dist/experience/file-store.js.map +1 -1
- package/dist/experience/train.d.ts +13 -4
- package/dist/experience/train.d.ts.map +1 -1
- package/dist/experience/train.js +14 -5
- package/dist/experience/train.js.map +1 -1
- package/package.json +5 -5
- package/server.json +2 -2
- package/src/experience/file-store.ts +5 -0
- package/src/experience/train.ts +26 -9
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* implementation, so the freshness check and the loop guard are the memory store's),
|
|
9
9
|
* and each episode's screenshots live in `episodes/<id>/`, removed when it is forgotten.
|
|
10
10
|
*/
|
|
11
|
-
import type { Adaptation, Episode, EpisodeSummary, ExperienceSnapshot, ExperienceStore, InMemoryExperienceStore, Run, RunStepLog, Skill } from "@seanhogg/builderforce-memory-engine";
|
|
11
|
+
import type { Adaptation, CurationRecord, Episode, EpisodeSummary, ExperienceSnapshot, ExperienceStore, InMemoryExperienceStore, Run, RunStepLog, Skill } from "@seanhogg/builderforce-memory-engine";
|
|
12
12
|
import type { SharedJsonFile } from "../persistence/shared-json-file.js";
|
|
13
13
|
/** The filesystem calls the store makes besides the snapshot's own. */
|
|
14
14
|
export interface EpisodeFolders {
|
|
@@ -46,6 +46,7 @@ export declare class FileExperienceStore implements ExperienceStore {
|
|
|
46
46
|
getRun(id: string): Promise<Run | undefined>;
|
|
47
47
|
listRuns(limit: number): Promise<Run[]>;
|
|
48
48
|
recordAdaptation(adaptation: Adaptation): Promise<void>;
|
|
49
|
+
recordCuration(curation: CurationRecord): Promise<void>;
|
|
49
50
|
snapshot(): Promise<ExperienceSnapshot>;
|
|
50
51
|
clear(): Promise<void>;
|
|
51
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACR,UAAU,EACV,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,GAAG,EACH,UAAU,EACV,KAAK,EACR,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,qBAAa,mBAAoB,YAAW,eAAe;IAEnD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,kBAAkB,EAC3C,OAAO,EAAE,cAAc;IAG5C;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAsBP,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAIpD,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAIhD,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI9B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;IAI5C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAKvC,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
|
|
1
|
+
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACR,UAAU,EACV,cAAc,EACd,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,GAAG,EACH,UAAU,EACV,KAAK,EACR,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC3B;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,qBAAa,mBAAoB,YAAW,eAAe;IAEnD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,EAAE,uBAAuB,EAC9B,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,kBAAkB,EAC3C,OAAO,EAAE,cAAc;IAG5C;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAsBP,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAIpD,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAIhD,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAI9B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzC,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;IAI5C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAKvC,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAIvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}
|
|
@@ -104,6 +104,10 @@ export class FileExperienceStore {
|
|
|
104
104
|
this.fresh();
|
|
105
105
|
await this.inner.recordAdaptation(adaptation);
|
|
106
106
|
}
|
|
107
|
+
async recordCuration(curation) {
|
|
108
|
+
this.fresh();
|
|
109
|
+
await this.inner.recordCuration(curation);
|
|
110
|
+
}
|
|
107
111
|
async snapshot() {
|
|
108
112
|
this.fresh();
|
|
109
113
|
return this.inner.snapshot();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* re-teaches what the discarded version had learned, and a fresh base (no suffix,
|
|
14
14
|
* N = 0) — a newly downloaded Evermind — gets every procedure again.
|
|
15
15
|
*/
|
|
16
|
-
import type { adaptPackage, curatePendingExperience, experienceDocuments, packDocuments, CurationResult, EvermindTextEmbedder, ExperienceDocument, ExperienceStore } from "@seanhogg/builderforce-memory-engine";
|
|
16
|
+
import type { adaptPackage, curatePendingExperience, curationRecords, experienceDocuments, packDocuments, CurationResult, EvermindTextEmbedder, ExperienceDocument, ExperienceStore } from "@seanhogg/builderforce-memory-engine";
|
|
17
17
|
import type { LoadedEvermind } from "../model/evermind-package.js";
|
|
18
18
|
/** The engine functions training needs, passed in so the peer stays optional. */
|
|
19
19
|
export interface TrainEngine {
|
|
@@ -24,10 +24,17 @@ export interface TrainEngine {
|
|
|
24
24
|
/** The opt-in curation step and the CPU embedder it scores with (engine ≥ 2026.10.2). */
|
|
25
25
|
curatePendingExperience?: typeof curatePendingExperience;
|
|
26
26
|
EvermindTextEmbedder?: typeof EvermindTextEmbedder;
|
|
27
|
+
/** The `curated_out` records to persist for a curation (engine ≥ 2026.10.3). */
|
|
28
|
+
curationRecords?: typeof curationRecords;
|
|
27
29
|
}
|
|
28
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* What curation left out of a pass, when it ran: `dropped` this call, and
|
|
32
|
+
* `alreadyDropped` — left out by an earlier call, verdict still standing, so skipped
|
|
33
|
+
* without being embedded again.
|
|
34
|
+
*/
|
|
29
35
|
export type CurationReport = {
|
|
30
36
|
dropped: CurationResult["dropped"];
|
|
37
|
+
alreadyDropped?: CurationResult["dropped"];
|
|
31
38
|
};
|
|
32
39
|
export type TrainOutcome = {
|
|
33
40
|
status: "nothing_new";
|
|
@@ -65,8 +72,10 @@ export interface TrainExperienceOptions {
|
|
|
65
72
|
* store's run outcomes, + near-duplicate removal against the batch AND the
|
|
66
73
|
* recently learned procedures — docs/ml-task-catalog.md §4.2), scoring with the
|
|
67
74
|
* model's own CPU embedder. Default false ⇒ every pending procedure is learned,
|
|
68
|
-
* exactly as before. A procedure curation drops is NOT recorded as learned
|
|
69
|
-
*
|
|
75
|
+
* exactly as before. A procedure curation drops is NOT recorded as learned; it is
|
|
76
|
+
* recorded as `curated_out` (with the id it duplicates, or its quality score), and
|
|
77
|
+
* later curations skip it while that verdict stands — a duplicate until what it
|
|
78
|
+
* repeats is no longer learned, a low-quality one until it has new runs.
|
|
70
79
|
*/
|
|
71
80
|
curate?: boolean;
|
|
72
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACR,YAAY,EACZ,uBAAuB,EACvB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAElB,eAAe,EAClB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,iFAAiF;AACjF,MAAM,WAAW,WAAW;IACxB,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,wBAAwB,EAAE,MAAM,CAAC;IACjC,yFAAyF;IACzF,uBAAuB,CAAC,EAAE,OAAO,uBAAuB,CAAC;IACzD,oBAAoB,CAAC,EAAE,OAAO,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACR,YAAY,EACZ,uBAAuB,EACvB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAElB,eAAe,EAClB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,iFAAiF;AACjF,MAAM,WAAW,WAAW;IACxB,mBAAmB,EAAE,OAAO,mBAAmB,CAAC;IAChD,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,wBAAwB,EAAE,MAAM,CAAC;IACjC,yFAAyF;IACzF,uBAAuB,CAAC,EAAE,OAAO,uBAAuB,CAAC;IACzD,oBAAoB,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACnD,gFAAgF;IAChF,eAAe,CAAC,EAAE,OAAO,eAAe,CAAC;CAC5C;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IAAC,cAAc,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAA;CAAE,CAAC;AAEhH,MAAM,MAAM,YAAY,GAClB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,GACpF;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GACrF;IACI,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC7B,CAAC;AAIR,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAwBD,gDAAgD;AAChD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iCAEvG;AAED,MAAM,WAAW,sBAAsB;IACnC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,4EAA4E,CAAC;AAE9G,wBAAsB,eAAe,CACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,sBAA2B,GAClC,OAAO,CAAC,YAAY,CAAC,CAwDvB"}
|
package/dist/experience/train.js
CHANGED
|
@@ -61,16 +61,22 @@ export async function trainExperience(store, engine, model, modelFile, opts = {}
|
|
|
61
61
|
return { status: "nothing_new", pending: 0, version };
|
|
62
62
|
let docs = pending;
|
|
63
63
|
let curation;
|
|
64
|
+
/** The LM curation embedded with — untrained, loaded from `model.pkg` — reused by the first pass. */
|
|
65
|
+
let curationLm;
|
|
64
66
|
if (opts.curate) {
|
|
65
67
|
if (!engine.curatePendingExperience || !engine.EvermindTextEmbedder)
|
|
66
68
|
throw new Error(CURATION_UNSUPPORTED);
|
|
67
69
|
// The model being trained embeds for curation: its own notion of "the same procedure".
|
|
68
|
-
|
|
70
|
+
// Embedding never changes its weights, so the same LM is the first pass's copy.
|
|
71
|
+
curationLm = model.pkg.loadLM();
|
|
69
72
|
const codec = model.codec;
|
|
70
|
-
const embedder = new engine.EvermindTextEmbedder(
|
|
73
|
+
const embedder = new engine.EvermindTextEmbedder(curationLm, codec);
|
|
71
74
|
const r = await engine.curatePendingExperience(pending, snap, { embedder, known });
|
|
72
75
|
docs = r.kept;
|
|
73
|
-
curation = { dropped: r.dropped };
|
|
76
|
+
curation = { dropped: r.dropped, ...(r.alreadyDropped?.length ? { alreadyDropped: r.alreadyDropped } : {}) };
|
|
77
|
+
// Persist the verdicts, so the next call skips these instead of re-embedding them.
|
|
78
|
+
if (engine.curationRecords)
|
|
79
|
+
await store.recordCuration(engine.curationRecords(r, snap, Date.now()));
|
|
74
80
|
}
|
|
75
81
|
if (docs.length === 0)
|
|
76
82
|
return { status: "curated_out", pending: pending.length, version, curation: curation ?? { dropped: [] } };
|
|
@@ -81,9 +87,12 @@ export async function trainExperience(store, engine, model, modelFile, opts = {}
|
|
|
81
87
|
let lossSum = 0;
|
|
82
88
|
let passes = 0;
|
|
83
89
|
for (const pass of engine.packDocuments(docs, engine.EVERMIND_ADAPT_MAX_CHARS)) {
|
|
84
|
-
|
|
90
|
+
// Until a pass succeeds `pkg` is still `model.pkg`, so curation's untrained LM is its copy.
|
|
91
|
+
const lm = pkg === model.pkg ? curationLm : undefined;
|
|
92
|
+
const r = engine.adaptPackage(pkg, model.codec, pass.map((d) => d.text).join("\n\n"), next, lm ? { lm } : {});
|
|
85
93
|
if (!r)
|
|
86
|
-
continue;
|
|
94
|
+
continue; // no trainable window: the LM was never touched
|
|
95
|
+
curationLm = undefined; // trained in place — spent
|
|
87
96
|
pkg = r.pkg;
|
|
88
97
|
lossSum += r.loss;
|
|
89
98
|
passes++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seanhogg/builderforce-memory-mcp",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.3",
|
|
4
4
|
"mcpName": "io.github.SeanHogg/builderforce-memory",
|
|
5
5
|
"description": "BuilderForce Agent Memory — MCP transport. Exposes @seanhogg/builderforce-memory to any MCP client (Claude Agent SDK in-process, stdio, or HTTP) over a pluggable MemoryBackend, with token-saving fetch-on-demand recall.",
|
|
6
6
|
"type": "module",
|
|
@@ -56,8 +56,8 @@
|
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"@anthropic-ai/claude-agent-sdk": ">=0.1.0",
|
|
59
|
-
"@seanhogg/builderforce-memory": "^2026.10.
|
|
60
|
-
"@seanhogg/builderforce-memory-engine": "^2026.10.
|
|
59
|
+
"@seanhogg/builderforce-memory": "^2026.10.3",
|
|
60
|
+
"@seanhogg/builderforce-memory-engine": "^2026.10.3",
|
|
61
61
|
"fake-indexeddb": "^6.0.0"
|
|
62
62
|
},
|
|
63
63
|
"peerDependenciesMeta": {
|
|
@@ -83,8 +83,8 @@
|
|
|
83
83
|
"fake-indexeddb": "^6.0.0",
|
|
84
84
|
"typescript": "^6.0.3",
|
|
85
85
|
"@typescript/native-preview": "7.0.0-dev.20260627.2",
|
|
86
|
-
"@seanhogg/builderforce-memory": "2026.10.
|
|
87
|
-
"@seanhogg/builderforce-memory-engine": "2026.10.
|
|
86
|
+
"@seanhogg/builderforce-memory": "2026.10.3",
|
|
87
|
+
"@seanhogg/builderforce-memory-engine": "2026.10.3"
|
|
88
88
|
},
|
|
89
89
|
"engines": {
|
|
90
90
|
"node": ">=18.0.0"
|
package/server.json
CHANGED
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
"source": "github",
|
|
9
9
|
"subfolder": "packages/memory-mcp"
|
|
10
10
|
},
|
|
11
|
-
"version": "2026.10.
|
|
11
|
+
"version": "2026.10.3",
|
|
12
12
|
"websiteUrl": "https://builderforce.ai",
|
|
13
13
|
"packages": [
|
|
14
14
|
{
|
|
15
15
|
"registryType": "npm",
|
|
16
16
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
17
17
|
"identifier": "@seanhogg/builderforce-memory-mcp",
|
|
18
|
-
"version": "2026.10.
|
|
18
|
+
"version": "2026.10.3",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|
|
21
21
|
},
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import type {
|
|
13
13
|
Adaptation,
|
|
14
|
+
CurationRecord,
|
|
14
15
|
Episode,
|
|
15
16
|
EpisodeSummary,
|
|
16
17
|
ExperienceSnapshot,
|
|
@@ -129,6 +130,10 @@ export class FileExperienceStore implements ExperienceStore {
|
|
|
129
130
|
this.fresh();
|
|
130
131
|
await this.inner.recordAdaptation(adaptation);
|
|
131
132
|
}
|
|
133
|
+
async recordCuration(curation: CurationRecord): Promise<void> {
|
|
134
|
+
this.fresh();
|
|
135
|
+
await this.inner.recordCuration(curation);
|
|
136
|
+
}
|
|
132
137
|
|
|
133
138
|
async snapshot(): Promise<ExperienceSnapshot> {
|
|
134
139
|
this.fresh();
|
package/src/experience/train.ts
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import type {
|
|
18
18
|
adaptPackage,
|
|
19
19
|
curatePendingExperience,
|
|
20
|
+
curationRecords,
|
|
20
21
|
experienceDocuments,
|
|
21
22
|
packDocuments,
|
|
22
23
|
CurationResult,
|
|
@@ -36,10 +37,16 @@ export interface TrainEngine {
|
|
|
36
37
|
/** The opt-in curation step and the CPU embedder it scores with (engine ≥ 2026.10.2). */
|
|
37
38
|
curatePendingExperience?: typeof curatePendingExperience;
|
|
38
39
|
EvermindTextEmbedder?: typeof EvermindTextEmbedder;
|
|
40
|
+
/** The `curated_out` records to persist for a curation (engine ≥ 2026.10.3). */
|
|
41
|
+
curationRecords?: typeof curationRecords;
|
|
39
42
|
}
|
|
40
43
|
|
|
41
|
-
/**
|
|
42
|
-
|
|
44
|
+
/**
|
|
45
|
+
* What curation left out of a pass, when it ran: `dropped` this call, and
|
|
46
|
+
* `alreadyDropped` — left out by an earlier call, verdict still standing, so skipped
|
|
47
|
+
* without being embedded again.
|
|
48
|
+
*/
|
|
49
|
+
export type CurationReport = { dropped: CurationResult["dropped"]; alreadyDropped?: CurationResult["dropped"] };
|
|
43
50
|
|
|
44
51
|
export type TrainOutcome =
|
|
45
52
|
| { status: "nothing_new"; pending: 0; version: string }
|
|
@@ -103,8 +110,10 @@ export interface TrainExperienceOptions {
|
|
|
103
110
|
* store's run outcomes, + near-duplicate removal against the batch AND the
|
|
104
111
|
* recently learned procedures — docs/ml-task-catalog.md §4.2), scoring with the
|
|
105
112
|
* model's own CPU embedder. Default false ⇒ every pending procedure is learned,
|
|
106
|
-
* exactly as before. A procedure curation drops is NOT recorded as learned
|
|
107
|
-
*
|
|
113
|
+
* exactly as before. A procedure curation drops is NOT recorded as learned; it is
|
|
114
|
+
* recorded as `curated_out` (with the id it duplicates, or its quality score), and
|
|
115
|
+
* later curations skip it while that verdict stands — a duplicate until what it
|
|
116
|
+
* repeats is no longer learned, a low-quality one until it has new runs.
|
|
108
117
|
*/
|
|
109
118
|
curate?: boolean;
|
|
110
119
|
}
|
|
@@ -126,15 +135,20 @@ export async function trainExperience(
|
|
|
126
135
|
|
|
127
136
|
let docs = pending;
|
|
128
137
|
let curation: CurationReport | undefined;
|
|
138
|
+
/** The LM curation embedded with — untrained, loaded from `model.pkg` — reused by the first pass. */
|
|
139
|
+
let curationLm: ConstructorParameters<typeof EvermindTextEmbedder>[0] | undefined;
|
|
129
140
|
if (opts.curate) {
|
|
130
141
|
if (!engine.curatePendingExperience || !engine.EvermindTextEmbedder) throw new Error(CURATION_UNSUPPORTED);
|
|
131
142
|
// The model being trained embeds for curation: its own notion of "the same procedure".
|
|
132
|
-
|
|
143
|
+
// Embedding never changes its weights, so the same LM is the first pass's copy.
|
|
144
|
+
curationLm = model.pkg.loadLM() as ConstructorParameters<typeof EvermindTextEmbedder>[0];
|
|
133
145
|
const codec = model.codec as ConstructorParameters<typeof EvermindTextEmbedder>[1];
|
|
134
|
-
const embedder = new engine.EvermindTextEmbedder(
|
|
146
|
+
const embedder = new engine.EvermindTextEmbedder(curationLm, codec);
|
|
135
147
|
const r = await engine.curatePendingExperience(pending, snap, { embedder, known });
|
|
136
148
|
docs = r.kept;
|
|
137
|
-
curation = { dropped: r.dropped };
|
|
149
|
+
curation = { dropped: r.dropped, ...(r.alreadyDropped?.length ? { alreadyDropped: r.alreadyDropped } : {}) };
|
|
150
|
+
// Persist the verdicts, so the next call skips these instead of re-embedding them.
|
|
151
|
+
if (engine.curationRecords) await store.recordCuration(engine.curationRecords(r, snap, Date.now()));
|
|
138
152
|
}
|
|
139
153
|
if (docs.length === 0) return { status: "curated_out", pending: pending.length, version, curation: curation ?? { dropped: [] } };
|
|
140
154
|
|
|
@@ -145,8 +159,11 @@ export async function trainExperience(
|
|
|
145
159
|
let lossSum = 0;
|
|
146
160
|
let passes = 0;
|
|
147
161
|
for (const pass of engine.packDocuments(docs, engine.EVERMIND_ADAPT_MAX_CHARS)) {
|
|
148
|
-
|
|
149
|
-
|
|
162
|
+
// Until a pass succeeds `pkg` is still `model.pkg`, so curation's untrained LM is its copy.
|
|
163
|
+
const lm = pkg === (model.pkg as unknown) ? curationLm : undefined;
|
|
164
|
+
const r = engine.adaptPackage(pkg, model.codec, pass.map((d) => d.text).join("\n\n"), next, lm ? { lm } : {});
|
|
165
|
+
if (!r) continue; // no trainable window: the LM was never touched
|
|
166
|
+
curationLm = undefined; // trained in place — spent
|
|
150
167
|
pkg = r.pkg;
|
|
151
168
|
lossSum += r.loss;
|
|
152
169
|
passes++;
|