@seanhogg/builderforce-memory-mcp 2026.9.28 → 2026.9.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/backends/memory-store.d.ts.map +1 -1
- package/dist/backends/memory-store.js +15 -68
- package/dist/backends/memory-store.js.map +1 -1
- package/dist/bin/http.d.ts +1 -0
- package/dist/bin/http.d.ts.map +1 -1
- package/dist/bin/http.js +9 -0
- package/dist/bin/http.js.map +1 -1
- package/dist/bin/stdio.d.ts +4 -0
- package/dist/bin/stdio.d.ts.map +1 -1
- package/dist/bin/stdio.js +7 -0
- package/dist/bin/stdio.js.map +1 -1
- package/dist/dynamic-import.d.ts +10 -0
- package/dist/dynamic-import.d.ts.map +1 -0
- package/dist/dynamic-import.js +13 -0
- package/dist/dynamic-import.js.map +1 -0
- package/dist/embedding/evermind-embedder.d.ts +0 -1
- package/dist/embedding/evermind-embedder.d.ts.map +1 -1
- package/dist/embedding/evermind-embedder.js +8 -44
- package/dist/embedding/evermind-embedder.js.map +1 -1
- package/dist/experience/file-store.d.ts +52 -0
- package/dist/experience/file-store.d.ts.map +1 -0
- package/dist/experience/file-store.js +119 -0
- package/dist/experience/file-store.js.map +1 -0
- package/dist/experience/host.d.ts +46 -0
- package/dist/experience/host.d.ts.map +1 -0
- package/dist/experience/host.js +57 -0
- package/dist/experience/host.js.map +1 -0
- package/dist/experience/tools.d.ts +16 -0
- package/dist/experience/tools.d.ts.map +1 -0
- package/dist/experience/tools.js +279 -0
- package/dist/experience/tools.js.map +1 -0
- package/dist/experience/train.d.ts +48 -0
- package/dist/experience/train.d.ts.map +1 -0
- package/dist/experience/train.js +72 -0
- package/dist/experience/train.js.map +1 -0
- package/dist/gateway-tools.d.ts +8 -0
- package/dist/gateway-tools.d.ts.map +1 -0
- package/dist/gateway-tools.js +71 -0
- package/dist/gateway-tools.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/install/install.d.ts.map +1 -1
- package/dist/install/install.js +2 -2
- package/dist/install/install.js.map +1 -1
- package/dist/model/evermind-package.d.ts +55 -0
- package/dist/model/evermind-package.d.ts.map +1 -0
- package/dist/model/evermind-package.js +86 -0
- package/dist/model/evermind-package.js.map +1 -0
- package/dist/persistence/shared-json-file.d.ts +65 -0
- package/dist/persistence/shared-json-file.d.ts.map +1 -0
- package/dist/persistence/shared-json-file.js +110 -0
- package/dist/persistence/shared-json-file.js.map +1 -0
- package/dist/tool-core.d.ts +28 -0
- package/dist/tool-core.d.ts.map +1 -0
- package/dist/tool-core.js +19 -0
- package/dist/tool-core.js.map +1 -0
- package/dist/tools.d.ts +9 -17
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +5 -73
- package/dist/tools.js.map +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +8 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/sdk.d.ts.map +1 -1
- package/dist/transports/sdk.js +2 -4
- package/dist/transports/sdk.js.map +1 -1
- package/package.json +6 -6
- package/server.json +3 -3
- package/src/backends/memory-store.ts +16 -85
- package/src/bin/http.ts +12 -0
- package/src/bin/stdio.ts +7 -0
- package/src/dynamic-import.ts +12 -0
- package/src/embedding/evermind-embedder.ts +11 -61
- package/src/experience/file-store.ts +143 -0
- package/src/experience/host.ts +113 -0
- package/src/experience/tools.ts +363 -0
- package/src/experience/train.ts +96 -0
- package/src/gateway-tools.ts +97 -0
- package/src/index.ts +8 -1
- package/src/install/install.ts +2 -2
- package/src/model/evermind-package.ts +127 -0
- package/src/persistence/shared-json-file.ts +131 -0
- package/src/tool-core.ts +39 -0
- package/src/tools.ts +13 -116
- package/src/transports/http.ts +8 -1
- package/src/transports/sdk.ts +2 -5
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The engine's experience store, made durable on disk.
|
|
3
|
+
*
|
|
4
|
+
* The engine owns experience — the types, Train Once, the snapshot format and the
|
|
5
|
+
* reference `InMemoryExperienceStore`. This host adds only what a pure package
|
|
6
|
+
* cannot: the snapshot lives in `experience.json` beside `memory.json`, shared by
|
|
7
|
+
* every process on the machine the same way memories are (one {@link SharedJsonFile}
|
|
8
|
+
* implementation, so the freshness check and the loop guard are the memory store's),
|
|
9
|
+
* and each episode's screenshots live in `episodes/<id>/`, removed when it is forgotten.
|
|
10
|
+
*/
|
|
11
|
+
/** Episode ids are also folder names — anything that could leave the folder is refused. */
|
|
12
|
+
export function isSafeExperienceId(id) {
|
|
13
|
+
return /^[A-Za-z0-9_-]{1,64}$/.test(id);
|
|
14
|
+
}
|
|
15
|
+
export class FileExperienceStore {
|
|
16
|
+
inner;
|
|
17
|
+
file;
|
|
18
|
+
parse;
|
|
19
|
+
folders;
|
|
20
|
+
constructor(inner, file, parse, folders) {
|
|
21
|
+
this.inner = inner;
|
|
22
|
+
this.file = file;
|
|
23
|
+
this.parse = parse;
|
|
24
|
+
this.folders = folders;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Absorb the file when another process rewrote it. Also the boot hydration. A file
|
|
28
|
+
* that does not parse is left unabsorbed (a half-written snapshot): the store keeps
|
|
29
|
+
* what it has and the next call looks again.
|
|
30
|
+
*/
|
|
31
|
+
fresh() {
|
|
32
|
+
const changed = this.file.readIfChanged();
|
|
33
|
+
if (!changed)
|
|
34
|
+
return;
|
|
35
|
+
let raw;
|
|
36
|
+
try {
|
|
37
|
+
raw = JSON.parse(changed.text);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const snapshot = this.parse(raw);
|
|
43
|
+
// A snapshot in a schema this server does not know (a newer writer) parses to
|
|
44
|
+
// empty — absorbing it would let the next write destroy it. Refuse instead.
|
|
45
|
+
const schema = raw?.schema;
|
|
46
|
+
if (typeof schema === "string" && schema !== snapshot.schema) {
|
|
47
|
+
throw new Error(`${this.file.path} is in schema "${schema}", which this server cannot read (it writes "${snapshot.schema}"). Upgrade the memory server; the file was left untouched.`);
|
|
48
|
+
}
|
|
49
|
+
this.inner.load(snapshot);
|
|
50
|
+
changed.accept();
|
|
51
|
+
}
|
|
52
|
+
async putEpisode(episode) {
|
|
53
|
+
this.fresh();
|
|
54
|
+
await this.inner.putEpisode(episode);
|
|
55
|
+
}
|
|
56
|
+
async getEpisode(id) {
|
|
57
|
+
this.fresh();
|
|
58
|
+
return this.inner.getEpisode(id);
|
|
59
|
+
}
|
|
60
|
+
async listEpisodes() {
|
|
61
|
+
this.fresh();
|
|
62
|
+
return this.inner.listEpisodes();
|
|
63
|
+
}
|
|
64
|
+
async deleteEpisode(id) {
|
|
65
|
+
this.fresh();
|
|
66
|
+
const ok = await this.inner.deleteEpisode(id);
|
|
67
|
+
if (isSafeExperienceId(id))
|
|
68
|
+
this.folders.remove(id);
|
|
69
|
+
return ok;
|
|
70
|
+
}
|
|
71
|
+
async putSkill(skill) {
|
|
72
|
+
this.fresh();
|
|
73
|
+
await this.inner.putSkill(skill);
|
|
74
|
+
}
|
|
75
|
+
async getSkill(id) {
|
|
76
|
+
this.fresh();
|
|
77
|
+
return this.inner.getSkill(id);
|
|
78
|
+
}
|
|
79
|
+
async listSkills() {
|
|
80
|
+
this.fresh();
|
|
81
|
+
return this.inner.listSkills();
|
|
82
|
+
}
|
|
83
|
+
async deleteSkill(id) {
|
|
84
|
+
this.fresh();
|
|
85
|
+
return this.inner.deleteSkill(id);
|
|
86
|
+
}
|
|
87
|
+
async putRun(run) {
|
|
88
|
+
this.fresh();
|
|
89
|
+
await this.inner.putRun(run);
|
|
90
|
+
}
|
|
91
|
+
async appendRunStep(runId, step) {
|
|
92
|
+
this.fresh();
|
|
93
|
+
return this.inner.appendRunStep(runId, step);
|
|
94
|
+
}
|
|
95
|
+
async getRun(id) {
|
|
96
|
+
this.fresh();
|
|
97
|
+
return this.inner.getRun(id);
|
|
98
|
+
}
|
|
99
|
+
async listRuns(limit) {
|
|
100
|
+
this.fresh();
|
|
101
|
+
return this.inner.listRuns(limit);
|
|
102
|
+
}
|
|
103
|
+
async recordAdaptation(adaptation) {
|
|
104
|
+
this.fresh();
|
|
105
|
+
await this.inner.recordAdaptation(adaptation);
|
|
106
|
+
}
|
|
107
|
+
async snapshot() {
|
|
108
|
+
this.fresh();
|
|
109
|
+
return this.inner.snapshot();
|
|
110
|
+
}
|
|
111
|
+
async clear() {
|
|
112
|
+
this.fresh();
|
|
113
|
+
const known = (await this.inner.snapshot()).episodes.map((e) => e.id).filter(isSafeExperienceId);
|
|
114
|
+
await this.inner.clear();
|
|
115
|
+
for (const id of known)
|
|
116
|
+
this.folders.remove(id);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=file-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/experience/file-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyBH,2FAA2F;AAC3F,MAAM,UAAU,kBAAkB,CAAC,EAAU;IACzC,OAAO,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,OAAO,mBAAmB;IAEP;IACA;IACA;IACA;IAJrB,YACqB,KAA8B,EAC9B,IAAoB,EACpB,KAA2C,EAC3C,OAAuB;QAHvB,UAAK,GAAL,KAAK,CAAyB;QAC9B,SAAI,GAAJ,IAAI,CAAgB;QACpB,UAAK,GAAL,KAAK,CAAsC;QAC3C,YAAO,GAAP,OAAO,CAAgB;IACzC,CAAC;IAEJ;;;;OAIG;IACK,KAAK;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,8EAA8E;QAC9E,4EAA4E;QAC5E,MAAM,MAAM,GAAI,GAAmC,EAAE,MAAM,CAAC;QAC5D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACX,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,MAAM,gDAAgD,QAAQ,CAAC,MAAM,6DAA6D,CACxK,CAAC;QACN,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,CAAC,MAAM,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,EAAU;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,YAAY;QACd,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,EAAU;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,kBAAkB,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAY;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,EAAU;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,EAAU;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAQ;QACjB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,IAAgB;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,EAAU;QACnB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAa;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAAsB;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IACD,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACjG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,EAAE,IAAI,KAAK;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACJ"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stand up experience for a headless server: the engine, the durable store and the
|
|
3
|
+
* private model it trains — or nothing, when experience is not switched on.
|
|
4
|
+
*
|
|
5
|
+
* Opt-in by design, like the Synapse feature it serves: a plain memory server (the
|
|
6
|
+
* one every coding agent installs) never pays for experience tools in its tool list.
|
|
7
|
+
*/
|
|
8
|
+
import type { ExperienceStore, dueSkills, experienceOverview, newExperienceId, trainOnce } from "@seanhogg/builderforce-memory-engine";
|
|
9
|
+
import { type LoadedEvermind } from "../model/evermind-package.js";
|
|
10
|
+
import type { TrainEngine } from "./train.js";
|
|
11
|
+
/** '1' turns the experience tools on. */
|
|
12
|
+
export declare const EXPERIENCE_ENV = "BUILDERFORCE_MEMORY_EXPERIENCE";
|
|
13
|
+
/** The engine surface experience uses, passed around so the peer stays optional. */
|
|
14
|
+
export interface ExperienceEngine extends TrainEngine {
|
|
15
|
+
trainOnce: typeof trainOnce;
|
|
16
|
+
dueSkills: typeof dueSkills;
|
|
17
|
+
newExperienceId: typeof newExperienceId;
|
|
18
|
+
experienceOverview: typeof experienceOverview;
|
|
19
|
+
}
|
|
20
|
+
export interface ExperienceHost {
|
|
21
|
+
store: ExperienceStore;
|
|
22
|
+
engine: ExperienceEngine;
|
|
23
|
+
/** The memory snapshot experience sits beside (the facts). */
|
|
24
|
+
memoryFile: string;
|
|
25
|
+
/** The experience snapshot file. */
|
|
26
|
+
file: string;
|
|
27
|
+
/** Where each episode's screenshots go: `<episodesDir>/<episodeId>/`. */
|
|
28
|
+
episodesDir: string;
|
|
29
|
+
/** The private model experience trains, when one is configured. */
|
|
30
|
+
modelFile?: string;
|
|
31
|
+
/** Load the model fresh from disk (training rewrites it, so it is never cached). */
|
|
32
|
+
loadModel(): Promise<LoadedEvermind | null>;
|
|
33
|
+
/** The model's version from its manifest alone, or null without a readable one. */
|
|
34
|
+
modelVersion(): Promise<string | null>;
|
|
35
|
+
}
|
|
36
|
+
export interface ExperienceHostOptions {
|
|
37
|
+
env?: Record<string, string | undefined>;
|
|
38
|
+
/** The memory snapshot in effect — experience lives beside it. */
|
|
39
|
+
memoryFile: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The experience host, or `null` when experience is off or the engine peer is
|
|
43
|
+
* absent. Never throws: a memory server must start without it.
|
|
44
|
+
*/
|
|
45
|
+
export declare function createExperienceHost(opts: ExperienceHostOptions): Promise<ExperienceHost | null>;
|
|
46
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/experience/host.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACR,eAAe,EAGf,SAAS,EACT,kBAAkB,EAClB,eAAe,EACf,SAAS,EACZ,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EAA4C,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG7G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,yCAAyC;AACzC,eAAO,MAAM,cAAc,mCAAmC,CAAC;AAE/D,oFAAoF;AACpF,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACjD,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,kBAAkB,EAAE,OAAO,kBAAkB,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC;IACzB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC5C,mFAAmF;IACnF,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC1C;AAQD,MAAM,WAAW,qBAAqB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA4CtG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stand up experience for a headless server: the engine, the durable store and the
|
|
3
|
+
* private model it trains — or nothing, when experience is not switched on.
|
|
4
|
+
*
|
|
5
|
+
* Opt-in by design, like the Synapse feature it serves: a plain memory server (the
|
|
6
|
+
* one every coding agent installs) never pays for experience tools in its tool list.
|
|
7
|
+
*/
|
|
8
|
+
import { dynamicImport } from "../dynamic-import.js";
|
|
9
|
+
import { MODEL_FILE_ENV, TOKENIZER_FILE_ENV } from "../embedding/index.js";
|
|
10
|
+
import { loadEvermindPackage, readEvermindVersion } from "../model/evermind-package.js";
|
|
11
|
+
import { SharedJsonFile } from "../persistence/shared-json-file.js";
|
|
12
|
+
import { FileExperienceStore } from "./file-store.js";
|
|
13
|
+
/** '1' turns the experience tools on. */
|
|
14
|
+
export const EXPERIENCE_ENV = "BUILDERFORCE_MEMORY_EXPERIENCE";
|
|
15
|
+
/**
|
|
16
|
+
* The experience host, or `null` when experience is off or the engine peer is
|
|
17
|
+
* absent. Never throws: a memory server must start without it.
|
|
18
|
+
*/
|
|
19
|
+
export async function createExperienceHost(opts) {
|
|
20
|
+
const env = opts.env ?? process.env;
|
|
21
|
+
if (env[EXPERIENCE_ENV] !== "1")
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
const engine = (await dynamicImport("@seanhogg/builderforce-memory-engine"));
|
|
25
|
+
if (!engine?.InMemoryExperienceStore || !engine.parseSnapshot || !engine.trainOnce || !engine.adaptPackage)
|
|
26
|
+
return null;
|
|
27
|
+
const fs = (await dynamicImport("node:fs"));
|
|
28
|
+
const path = (await dynamicImport("node:path"));
|
|
29
|
+
const dir = path.dirname(opts.memoryFile);
|
|
30
|
+
const file = path.join(dir, "experience.json");
|
|
31
|
+
const episodesDir = path.join(dir, "episodes");
|
|
32
|
+
fs.mkdirSync(episodesDir, { recursive: true });
|
|
33
|
+
const shared = new SharedJsonFile(file, fs);
|
|
34
|
+
const inner = new engine.InMemoryExperienceStore(undefined, (s) => shared.write(JSON.stringify(s, null, 2)));
|
|
35
|
+
const store = new FileExperienceStore(inner, shared, engine.parseSnapshot, {
|
|
36
|
+
remove: (id) => fs.rmSync(path.join(episodesDir, id), { recursive: true, force: true }),
|
|
37
|
+
});
|
|
38
|
+
const modelFile = env[MODEL_FILE_ENV] || undefined;
|
|
39
|
+
const tokenizerFile = env[TOKENIZER_FILE_ENV] || undefined;
|
|
40
|
+
const loadModel = async () => (modelFile ? loadEvermindPackage(modelFile, tokenizerFile) : null);
|
|
41
|
+
const modelVersion = async () => (modelFile ? readEvermindVersion(modelFile) : null);
|
|
42
|
+
return {
|
|
43
|
+
store,
|
|
44
|
+
engine: engine,
|
|
45
|
+
memoryFile: opts.memoryFile,
|
|
46
|
+
file,
|
|
47
|
+
episodesDir,
|
|
48
|
+
modelFile,
|
|
49
|
+
loadModel,
|
|
50
|
+
modelVersion,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/experience/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experience tools — what Evermind has DONE, over MCP.
|
|
3
|
+
*
|
|
4
|
+
* The same framework-neutral {@link MemoryTool}s as the memory tools, registered
|
|
5
|
+
* beside them when experience is on. Every result is JSON: Synapse drives these as a
|
|
6
|
+
* program (record → review → compile → run → audit), and a model reads JSON as well.
|
|
7
|
+
* The domain rules — Train Once, approval gates, routines, the corpus — are the
|
|
8
|
+
* engine's; these handlers only validate input and move data through the store.
|
|
9
|
+
*/
|
|
10
|
+
import type { Episode } from "@seanhogg/builderforce-memory-engine";
|
|
11
|
+
import { type MemoryTool } from "../tool-core.js";
|
|
12
|
+
import type { ExperienceHost } from "./host.js";
|
|
13
|
+
/** Accept a recorder's episode, or say what is wrong with it. */
|
|
14
|
+
export declare function asEpisode(raw: unknown, newId: () => string): Episode | string;
|
|
15
|
+
export declare function buildExperienceTools(host: ExperienceHost): MemoryTool[];
|
|
16
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/experience/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,OAAO,EAA0D,MAAM,sCAAsC,CAAC;AAC5H,OAAO,EAAgB,KAAK,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA+ChD,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,GAAG,OAAO,GAAG,MAAM,CA6B7E;AA8BD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,EAAE,CAiPvE"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experience tools — what Evermind has DONE, over MCP.
|
|
3
|
+
*
|
|
4
|
+
* The same framework-neutral {@link MemoryTool}s as the memory tools, registered
|
|
5
|
+
* beside them when experience is on. Every result is JSON: Synapse drives these as a
|
|
6
|
+
* program (record → review → compile → run → audit), and a model reads JSON as well.
|
|
7
|
+
* The domain rules — Train Once, approval gates, routines, the corpus — are the
|
|
8
|
+
* engine's; these handlers only validate input and move data through the store.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { fail, okJson } from "../tool-core.js";
|
|
12
|
+
import { isSafeExperienceId } from "./file-store.js";
|
|
13
|
+
import { experienceIndex, pendingDocuments, trainExperience } from "./train.js";
|
|
14
|
+
const DEFAULT_RUNS = 50;
|
|
15
|
+
const MAX_RUNS_RETURNED = 500;
|
|
16
|
+
const editsShape = z
|
|
17
|
+
.object({
|
|
18
|
+
name: z.string().nullable().optional(),
|
|
19
|
+
removed: z.array(z.string()).optional(),
|
|
20
|
+
fixed: z.array(z.string()).optional(),
|
|
21
|
+
approvals: z.record(z.boolean()).optional(),
|
|
22
|
+
paramNames: z.record(z.string()).optional(),
|
|
23
|
+
})
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("Review edits keyed by recorded step id.");
|
|
26
|
+
const scheduleShape = z.union([
|
|
27
|
+
z.object({ every: z.literal("minutes"), minutes: z.number().int().min(1).max(10_080) }),
|
|
28
|
+
z.object({ every: z.literal("day"), hour: z.number().int().min(0).max(23), minute: z.number().int().min(0).max(59) }),
|
|
29
|
+
]);
|
|
30
|
+
const ACTION_KINDS = new Set(["click", "setValue", "keys"]);
|
|
31
|
+
const isTarget = (t) => !!t && typeof t === "object" && typeof t.name === "string";
|
|
32
|
+
/**
|
|
33
|
+
* Why one recorded action is unusable, or null. Every field the corpus and replay read
|
|
34
|
+
* is checked here, so one malformed step is refused at save time instead of making
|
|
35
|
+
* every later `experience_train` throw.
|
|
36
|
+
*/
|
|
37
|
+
function actionProblem(a) {
|
|
38
|
+
switch (a["kind"]) {
|
|
39
|
+
case "click":
|
|
40
|
+
return isTarget(a["target"]) ? null : "a click needs a target element";
|
|
41
|
+
case "setValue":
|
|
42
|
+
if (!isTarget(a["target"]))
|
|
43
|
+
return "a setValue needs a target element";
|
|
44
|
+
return typeof a["value"] === "string" ? null : "a setValue needs a string value (empty for a secret)";
|
|
45
|
+
case "keys":
|
|
46
|
+
if (typeof a["keys"] !== "string" || !a["keys"])
|
|
47
|
+
return "a keys action needs its keys";
|
|
48
|
+
return a["target"] == null || isTarget(a["target"]) ? null : "a keys target must be an element";
|
|
49
|
+
default:
|
|
50
|
+
return "the action kind must be click, setValue or keys";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Accept a recorder's episode, or say what is wrong with it. */
|
|
54
|
+
export function asEpisode(raw, newId) {
|
|
55
|
+
const e = raw;
|
|
56
|
+
if (!e || typeof e !== "object")
|
|
57
|
+
return "episode must be an object.";
|
|
58
|
+
if (typeof e.name !== "string" || !e.name.trim())
|
|
59
|
+
return "episode.name is required.";
|
|
60
|
+
if (typeof e.program !== "string" || !e.program)
|
|
61
|
+
return "episode.program is required.";
|
|
62
|
+
if (!Array.isArray(e.steps))
|
|
63
|
+
return "episode.steps must be an array.";
|
|
64
|
+
for (const [i, s] of e.steps.entries()) {
|
|
65
|
+
if (!s || typeof s.id !== "string" || !s.action || !ACTION_KINDS.has(s.action.kind)) {
|
|
66
|
+
return `episode.steps[${i}] needs an id and an action of kind click, setValue or keys.`;
|
|
67
|
+
}
|
|
68
|
+
const problem = actionProblem(s.action);
|
|
69
|
+
if (problem)
|
|
70
|
+
return `episode.steps[${i}]: ${problem}.`;
|
|
71
|
+
}
|
|
72
|
+
// A secret field records THAT it was filled, never the value: whatever a recorder
|
|
73
|
+
// sent, a secret value is not stored (and so never returned by episode_get).
|
|
74
|
+
const steps = e.steps.map((s) => s.action.kind === "setValue" && s.action.secret ? { ...s, action: { ...s.action, value: "" } } : s);
|
|
75
|
+
const id = typeof e.id === "string" && e.id ? e.id : newId();
|
|
76
|
+
if (!isSafeExperienceId(id))
|
|
77
|
+
return "episode.id may use letters, digits, '-' and '_' only.";
|
|
78
|
+
return {
|
|
79
|
+
id,
|
|
80
|
+
name: e.name.trim(),
|
|
81
|
+
program: e.program,
|
|
82
|
+
args: Array.isArray(e.args) ? e.args.map(String) : [],
|
|
83
|
+
startedAt: typeof e.startedAt === "number" ? e.startedAt : Date.now(),
|
|
84
|
+
endedAt: typeof e.endedAt === "number" ? e.endedAt : null,
|
|
85
|
+
steps,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** A tool whose thrown errors come back as tool errors named after it. */
|
|
89
|
+
function tool(name, description, inputSchema, run) {
|
|
90
|
+
return {
|
|
91
|
+
name,
|
|
92
|
+
description,
|
|
93
|
+
inputSchema,
|
|
94
|
+
handler: async (args) => {
|
|
95
|
+
try {
|
|
96
|
+
return await run(args);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
return fail(`${name} failed: ${String(err)}`);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const str = (v) => (typeof v === "string" ? v : "");
|
|
105
|
+
/** This machine's time zone as minutes east of UTC — what the engine's routines expect. */
|
|
106
|
+
function localOffsetMinutes() {
|
|
107
|
+
return -new Date().getTimezoneOffset();
|
|
108
|
+
}
|
|
109
|
+
export function buildExperienceTools(host) {
|
|
110
|
+
const { store, engine } = host;
|
|
111
|
+
const episodeTools = [
|
|
112
|
+
tool("experience_info", "Where experience is kept and how much there is: the memory and experience snapshot files, the screenshot folder, the private model it trains, and counts.", {}, async () => {
|
|
113
|
+
const snap = await store.snapshot();
|
|
114
|
+
return okJson({
|
|
115
|
+
memoryFile: host.memoryFile,
|
|
116
|
+
file: host.file,
|
|
117
|
+
episodesDir: host.episodesDir,
|
|
118
|
+
modelFile: host.modelFile ?? null,
|
|
119
|
+
episodes: snap.episodes.length,
|
|
120
|
+
skills: snap.skills.length,
|
|
121
|
+
runs: snap.runs.length,
|
|
122
|
+
learned: Object.keys(snap.learned).length,
|
|
123
|
+
});
|
|
124
|
+
}),
|
|
125
|
+
tool("experience_overview", "What experience says about the brain, for drawing it: counts per region (hippocampus = demonstrations, basalGanglia = skills, amygdala = approval decisions, hypothalamus = routines, neocortex = procedures the private model has learned), learned vs pending, run outcomes, every adaptation's measured loss, activity per local day, and the newest events.", { days: z.number().int().min(1).max(365).optional() }, async (args) => {
|
|
126
|
+
const version = await host.modelVersion();
|
|
127
|
+
const overview = engine.experienceOverview(await store.snapshot(), {
|
|
128
|
+
modelIndex: version ? experienceIndex(version) : 0,
|
|
129
|
+
now: Date.now(),
|
|
130
|
+
utcOffsetMinutes: localOffsetMinutes(),
|
|
131
|
+
days: typeof args["days"] === "number" ? args["days"] : undefined,
|
|
132
|
+
});
|
|
133
|
+
return okJson({ modelVersion: version, ...overview });
|
|
134
|
+
}),
|
|
135
|
+
tool("episode_save", "Save a recorded demonstration (an episode: a program, and the UI steps a person took in it). Returns its id. Screenshots belong in <episodesDir>/<id>/.", { episode: z.record(z.unknown()).describe("The episode, in the engine's Episode shape.") }, async (args) => {
|
|
136
|
+
const episode = asEpisode(args["episode"], engine.newExperienceId);
|
|
137
|
+
if (typeof episode === "string")
|
|
138
|
+
return fail(episode);
|
|
139
|
+
await store.putEpisode(episode);
|
|
140
|
+
return okJson({ id: episode.id });
|
|
141
|
+
}),
|
|
142
|
+
tool("episode_list", "List recorded demonstrations, newest first (summaries only).", {}, async () => okJson(await store.listEpisodes())),
|
|
143
|
+
tool("episode_get", "Fetch one demonstration with all of its steps.", { id: z.string() }, async (args) => {
|
|
144
|
+
const e = await store.getEpisode(str(args["id"]));
|
|
145
|
+
return e ? okJson(e) : fail(`No episode "${str(args["id"])}".`);
|
|
146
|
+
}),
|
|
147
|
+
tool("episode_forget", "Delete a demonstration and its screenshots. Skills compiled from it keep working.", { id: z.string() }, async (args) => okJson({ forgotten: await store.deleteEpisode(str(args["id"])) })),
|
|
148
|
+
tool("experience_forget_all", "Delete every demonstration, screenshot, skill and run. Facts (memories) and the model are not touched. Requires confirm: true.", { confirm: z.literal(true) }, async () => {
|
|
149
|
+
await store.clear();
|
|
150
|
+
return okJson({ forgotten: true });
|
|
151
|
+
}),
|
|
152
|
+
];
|
|
153
|
+
/** Train Once over a stored episode — ONE path for preview (no save) and compile (save). */
|
|
154
|
+
async function compile(args, save) {
|
|
155
|
+
const episode = await store.getEpisode(str(args["episodeId"]));
|
|
156
|
+
if (!episode)
|
|
157
|
+
return fail(`No episode "${str(args["episodeId"])}".`);
|
|
158
|
+
const skill = engine.trainOnce(episode, args["edits"] ?? {});
|
|
159
|
+
if (save)
|
|
160
|
+
await store.putSkill(skill);
|
|
161
|
+
return okJson(skill);
|
|
162
|
+
}
|
|
163
|
+
const skillTools = [
|
|
164
|
+
tool("skill_preview", "Show the skill Train Once would compile from a demonstration with these review edits, without saving it.", { episodeId: z.string(), edits: editsShape }, (a) => compile(a, false)),
|
|
165
|
+
tool("skill_compile", "Compile a demonstration into a runnable skill (Train Once) and save it.", { episodeId: z.string(), edits: editsShape }, (a) => compile(a, true)),
|
|
166
|
+
tool("skill_list", "List skills, newest first.", {}, async () => okJson(await store.listSkills())),
|
|
167
|
+
tool("skill_get", "Fetch one skill.", { id: z.string() }, async (args) => {
|
|
168
|
+
const s = await store.getSkill(str(args["id"]));
|
|
169
|
+
return s ? okJson(s) : fail(`No skill "${str(args["id"])}".`);
|
|
170
|
+
}),
|
|
171
|
+
tool("skill_forget", "Delete a skill (its run history stays).", { id: z.string() }, async (args) => okJson({ forgotten: await store.deleteSkill(str(args["id"])) })),
|
|
172
|
+
tool("skill_schedule", "Give a skill a routine (every N minutes, or daily at a local time, with values for its non-secret parameters), or pass null to remove it.", {
|
|
173
|
+
id: z.string(),
|
|
174
|
+
routine: z
|
|
175
|
+
.object({
|
|
176
|
+
schedule: scheduleShape,
|
|
177
|
+
values: z.record(z.string()).default({}),
|
|
178
|
+
enabled: z.boolean().default(true),
|
|
179
|
+
})
|
|
180
|
+
.nullable(),
|
|
181
|
+
}, async (args) => {
|
|
182
|
+
const skill = await store.getSkill(str(args["id"]));
|
|
183
|
+
if (!skill)
|
|
184
|
+
return fail(`No skill "${str(args["id"])}".`);
|
|
185
|
+
const r = args["routine"];
|
|
186
|
+
// Routine values are stored in plain JSON, so a secret parameter's value is
|
|
187
|
+
// never kept here — secrets come from the host's vault at run time.
|
|
188
|
+
const secret = new Set(skill.params.filter((p) => p.secret).map((p) => p.name));
|
|
189
|
+
const values = r ? Object.fromEntries(Object.entries(r.values).filter(([k]) => !secret.has(k))) : {};
|
|
190
|
+
skill.routine = r ? { ...r, values, lastRunAt: skill.routine?.lastRunAt ?? null } : null;
|
|
191
|
+
await store.putSkill(skill);
|
|
192
|
+
return okJson(skill);
|
|
193
|
+
}),
|
|
194
|
+
tool("skills_due", "Skills whose routine is due now, least recently run first.", {
|
|
195
|
+
tzOffsetMinutes: z
|
|
196
|
+
.number()
|
|
197
|
+
.int()
|
|
198
|
+
.min(-840)
|
|
199
|
+
.max(840)
|
|
200
|
+
.optional()
|
|
201
|
+
.describe("Local offset east of UTC; defaults to this machine's."),
|
|
202
|
+
}, async (args) => {
|
|
203
|
+
const tz = args["tzOffsetMinutes"];
|
|
204
|
+
const offset = typeof tz === "number" ? tz : localOffsetMinutes();
|
|
205
|
+
return okJson(engine.dueSkills(await store.listSkills(), Date.now(), offset));
|
|
206
|
+
}),
|
|
207
|
+
];
|
|
208
|
+
const runTools = [
|
|
209
|
+
tool("run_start", "Start a run of a skill. A routine run also marks the routine as run, so it is not due again until its next slot.", { skillId: z.string(), trigger: z.enum(["manual", "routine"]) }, async (args) => {
|
|
210
|
+
const skill = await store.getSkill(str(args["skillId"]));
|
|
211
|
+
if (!skill)
|
|
212
|
+
return fail(`No skill "${str(args["skillId"])}".`);
|
|
213
|
+
const now = Date.now();
|
|
214
|
+
const run = {
|
|
215
|
+
id: engine.newExperienceId(),
|
|
216
|
+
skillId: skill.id,
|
|
217
|
+
skillName: skill.name,
|
|
218
|
+
trigger: str(args["trigger"]),
|
|
219
|
+
status: "running",
|
|
220
|
+
startedAt: now,
|
|
221
|
+
steps: [],
|
|
222
|
+
};
|
|
223
|
+
await store.putRun(run);
|
|
224
|
+
if (run.trigger === "routine" && skill.routine) {
|
|
225
|
+
skill.routine.lastRunAt = now;
|
|
226
|
+
await store.putSkill(skill);
|
|
227
|
+
}
|
|
228
|
+
return okJson(run);
|
|
229
|
+
}),
|
|
230
|
+
tool("run_step", "Append one line to a run's audit trail.", {
|
|
231
|
+
runId: z.string(),
|
|
232
|
+
idx: z.number().int().min(0),
|
|
233
|
+
stepId: z.string(),
|
|
234
|
+
outcome: z.enum(["ok", "fallback", "failed", "approved", "denied"]),
|
|
235
|
+
detail: z.string().nullable().optional(),
|
|
236
|
+
}, async (args) => {
|
|
237
|
+
const logged = await store.appendRunStep(str(args["runId"]), {
|
|
238
|
+
idx: Number(args["idx"]),
|
|
239
|
+
stepId: str(args["stepId"]),
|
|
240
|
+
outcome: args["outcome"],
|
|
241
|
+
detail: typeof args["detail"] === "string" ? args["detail"] : null,
|
|
242
|
+
at: Date.now(),
|
|
243
|
+
});
|
|
244
|
+
return logged ? okJson({ logged }) : fail(`No run "${str(args["runId"])}".`);
|
|
245
|
+
}),
|
|
246
|
+
tool("run_finish", "Close a run with its final status.", { runId: z.string(), status: z.enum(["succeeded", "failed", "stopped", "denied"]), error: z.string().nullable().optional() }, async (args) => {
|
|
247
|
+
const run = await store.getRun(str(args["runId"]));
|
|
248
|
+
if (!run)
|
|
249
|
+
return fail(`No run "${str(args["runId"])}".`);
|
|
250
|
+
run.status = args["status"];
|
|
251
|
+
run.endedAt = Date.now();
|
|
252
|
+
run.error = typeof args["error"] === "string" ? args["error"] : null;
|
|
253
|
+
await store.putRun(run);
|
|
254
|
+
return okJson(run);
|
|
255
|
+
}),
|
|
256
|
+
tool("run_list", "Recent runs, newest first.", { limit: z.number().int().min(1).max(MAX_RUNS_RETURNED).optional() }, async (args) => okJson(await store.listRuns(Number(args["limit"] ?? DEFAULT_RUNS)))),
|
|
257
|
+
tool("run_get", "Fetch one run with its audit trail.", { id: z.string() }, async (args) => {
|
|
258
|
+
const r = await store.getRun(str(args["id"]));
|
|
259
|
+
return r ? okJson(r) : fail(`No run "${str(args["id"])}".`);
|
|
260
|
+
}),
|
|
261
|
+
];
|
|
262
|
+
const learnTools = [
|
|
263
|
+
tool("experience_train", "Teach the private Evermind model the procedures it has not learned yet (each skill, and each demonstration not yet compiled into one). Pass dryRun to only count them. The previous model is kept beside the new one.", { dryRun: z.boolean().optional() }, async (args) => {
|
|
264
|
+
if (!host.modelFile)
|
|
265
|
+
return fail("No private Evermind model is configured (set BUILDERFORCE_MEMORY_MODEL).");
|
|
266
|
+
const model = await host.loadModel();
|
|
267
|
+
if (!model)
|
|
268
|
+
return fail(`Could not load an evermind-lm package and its tokenizer from ${host.modelFile}.`);
|
|
269
|
+
if (args["dryRun"] === true) {
|
|
270
|
+
const version = model.pkg.manifest.version ?? "0";
|
|
271
|
+
const pending = (await pendingDocuments(store, engine, version)).length;
|
|
272
|
+
return okJson({ status: "dry_run", pending, version });
|
|
273
|
+
}
|
|
274
|
+
return okJson(await trainExperience(store, engine, model, host.modelFile));
|
|
275
|
+
}),
|
|
276
|
+
];
|
|
277
|
+
return [...episodeTools, ...skillTools, ...runTools, ...learnTools];
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/experience/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAoC,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,GAAG,CAAC;KACf,MAAM,CAAC;IACJ,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC9C,CAAC;KACD,QAAQ,EAAE;KACV,QAAQ,CAAC,yCAAyC,CAAC,CAAC;AAEzD,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC;IAC1B,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IACvF,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;CACxH,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5D,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAW,EAAE,CACrC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAQ,CAAwB,CAAC,IAAI,KAAK,QAAQ,CAAC;AAEvF;;;;GAIG;AACH,SAAS,aAAa,CAAC,CAA0B;IAC7C,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAChB,KAAK,OAAO;YACR,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gCAAgC,CAAC;QAC3E,KAAK,UAAU;YACX,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAAE,OAAO,mCAAmC,CAAC;YACvE,OAAO,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sDAAsD,CAAC;QAC1G,KAAK,MAAM;YACP,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAE,OAAO,8BAA8B,CAAC;YACvF,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC,CAAC;QACpG;YACI,OAAO,iDAAiD,CAAC;IACjE,CAAC;AACL,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,KAAmB;IACvD,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,4BAA4B,CAAC;IACrE,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,2BAA2B,CAAC;IACrF,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,8BAA8B,CAAC;IACvF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,iCAAiC,CAAC;IACtE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClF,OAAO,iBAAiB,CAAC,8DAA8D,CAAC;QAC5F,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,MAA4C,CAAC,CAAC;QAC9E,IAAI,OAAO;YAAE,OAAO,iBAAiB,CAAC,MAAM,OAAO,GAAG,CAAC;IAC3D,CAAC;IACD,kFAAkF;IAClF,6EAA6E;IAC7E,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5B,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CACrG,CAAC;IACF,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAAE,OAAO,uDAAuD,CAAC;IAC5F,OAAO;QACH,EAAE;QACF,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACrD,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;QACrE,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QACzD,KAAK;KACR,CAAC;AACN,CAAC;AAED,0EAA0E;AAC1E,SAAS,IAAI,CACT,IAAY,EACZ,WAAmB,EACnB,WAA0B,EAC1B,GAA2D;IAE3D,OAAO;QACH,IAAI;QACJ,WAAW;QACX,WAAW;QACX,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,IAAI,CAAC;gBACD,OAAO,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC,GAAG,IAAI,YAAY,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC;AAED,MAAM,GAAG,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAErE,2FAA2F;AAC3F,SAAS,kBAAkB;IACvB,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAoB;IACrD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE/B,MAAM,YAAY,GAAG;QACjB,IAAI,CACA,iBAAiB,EACjB,2JAA2J,EAC3J,EAAE,EACF,KAAK,IAAI,EAAE;YACP,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO,MAAM,CAAC;gBACV,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;gBACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;gBACtB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;aAC5C,CAAC,CAAC;QACP,CAAC,CACJ;QACD,IAAI,CACA,qBAAqB,EACrB,iWAAiW,EACjW,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,EACrD,KAAK,EAAE,IAAI,EAAE,EAAE;YACX,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE;gBAC/D,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClD,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;gBACf,gBAAgB,EAAE,kBAAkB,EAAE;gBACtC,IAAI,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;aACpE,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;QAC1D,CAAC,CACJ;QACD,IAAI,CACA,cAAc,EACd,yJAAyJ,EACzJ,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC,EAAE,EAC1F,KAAK,EAAE,IAAI,EAAE,EAAE;YACX,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;YACnE,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC,CACJ;QACD,IAAI,CAAC,cAAc,EAAE,8DAA8D,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,CAChG,MAAM,CAAC,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC,CACrC;QACD,IAAI,CAAC,aAAa,EAAE,gDAAgD,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrG,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC,CAAC;QACF,IAAI,CACA,gBAAgB,EAChB,mFAAmF,EACnF,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAClB,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CACpF;QACD,IAAI,CACA,uBAAuB,EACvB,gIAAgI,EAChI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAC5B,KAAK,IAAI,EAAE;YACP,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC,CACJ;KACJ,CAAC;IAEF,4FAA4F;IAC5F,KAAK,UAAU,OAAO,CAAC,IAA6B,EAAE,IAAa;QAC/D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,EAAG,IAAI,CAAC,OAAO,CAA6B,IAAI,EAAE,CAAC,CAAC;QAC1F,IAAI,IAAI;YAAE,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GAAG;QACf,IAAI,CACA,eAAe,EACf,0GAA0G,EAC1G,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAC3B;QACD,IAAI,CACA,eAAe,EACf,yEAAyE,EACzE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAC1B;QACD,IAAI,CAAC,YAAY,EAAE,4BAA4B,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAClG,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrE,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,EAAE,yCAAyC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAC/F,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAClE;QACD,IAAI,CACA,gBAAgB,EAChB,2IAA2I,EAC3I;YACI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;YACd,OAAO,EAAE,CAAC;iBACL,MAAM,CAAC;gBACJ,QAAQ,EAAE,aAAa;gBACvB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;aACrC,CAAC;iBACD,QAAQ,EAAE;SAClB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACX,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAA2C,CAAC;YACpE,4EAA4E;YAC5E,oEAAoE;YACpE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACzF,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CACJ;QACD,IAAI,CACA,YAAY,EACZ,4DAA4D,EAC5D;YACI,eAAe,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,GAAG,CAAC;iBACT,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;SACzE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACX,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAClE,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAClF,CAAC,CACJ;KACJ,CAAC;IAEF,MAAM,QAAQ,GAAG;QACb,IAAI,CACA,WAAW,EACX,kHAAkH,EAClH,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,EAC/D,KAAK,EAAE,IAAI,EAAE,EAAE;YACX,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,GAAG,GAAQ;gBACb,EAAE,EAAE,MAAM,CAAC,eAAe,EAAE;gBAC5B,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,GAAG;gBACd,KAAK,EAAE,EAAE;aACZ,CAAC;YACF,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC7C,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;gBAC9B,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CACJ;QACD,IAAI,CACA,UAAU,EACV,yCAAyC,EACzC;YACI,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;YACjB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;YAClB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;SAC3C,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;YACX,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE;gBACzD,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxB,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAgB;gBACvC,MAAM,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;gBAClE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;aACjB,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC,CACJ;QACD,IAAI,CACA,YAAY,EACZ,oCAAoC,EACpC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,EAC5H,KAAK,EAAE,IAAI,EAAE,EAAE;YACX,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;YACzD,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAc,CAAC;YACzC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,GAAG,CAAC,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CACJ;QACD,IAAI,CACA,UAAU,EACV,4BAA4B,EAC5B,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,EAAE,EACpE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CACtF;QACD,IAAI,CAAC,SAAS,EAAE,qCAAqC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtF,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC,CAAC;KACL,CAAC;IAEF,MAAM,UAAU,GAAG;QACf,IAAI,CACA,kBAAkB,EAClB,uNAAuN,EACvN,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,EAClC,KAAK,EAAE,IAAI,EAAE,EAAE;YACX,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC,0EAA0E,CAAC,CAAC;YAC7G,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC,gEAAgE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YAC3G,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,GAAG,CAAC;gBAClD,MAAM,OAAO,GAAG,CAAC,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBACxE,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO,MAAM,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/E,CAAC,CACJ;KACJ,CAAC;IAEF,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,UAAU,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Teach the person's private Evermind what they have done.
|
|
3
|
+
*
|
|
4
|
+
* Experience becomes text through the engine (`experienceDocuments`: each skill or
|
|
5
|
+
* uncompiled demonstration as a written procedure), and the text becomes weights
|
|
6
|
+
* through the engine's ONE adaptation recipe (`adaptPackage`). This module only
|
|
7
|
+
* decides what is new, runs the passes over the local model file and writes the
|
|
8
|
+
* result back, keeping the previous model beside it.
|
|
9
|
+
*
|
|
10
|
+
* "What is new" is the store's learned ledger. Every adaptation writes `<base>+expN`
|
|
11
|
+
* and records N against each procedure it learned, so a loaded model trusts exactly
|
|
12
|
+
* the entries at or below its own N: rolling back to `<model>.prev` (+exp N-1)
|
|
13
|
+
* re-teaches what the discarded version had learned, and a fresh base (no suffix,
|
|
14
|
+
* N = 0) — a newly downloaded Evermind — gets every procedure again.
|
|
15
|
+
*/
|
|
16
|
+
import type { adaptPackage, experienceDocuments, packDocuments, ExperienceStore } from "@seanhogg/builderforce-memory-engine";
|
|
17
|
+
import type { LoadedEvermind } from "../model/evermind-package.js";
|
|
18
|
+
/** The engine functions training needs, passed in so the peer stays optional. */
|
|
19
|
+
export interface TrainEngine {
|
|
20
|
+
experienceDocuments: typeof experienceDocuments;
|
|
21
|
+
packDocuments: typeof packDocuments;
|
|
22
|
+
adaptPackage: typeof adaptPackage;
|
|
23
|
+
EVERMIND_ADAPT_MAX_CHARS: number;
|
|
24
|
+
}
|
|
25
|
+
export type TrainOutcome = {
|
|
26
|
+
status: "nothing_new";
|
|
27
|
+
pending: 0;
|
|
28
|
+
version: string;
|
|
29
|
+
} | {
|
|
30
|
+
status: "no_window";
|
|
31
|
+
pending: number;
|
|
32
|
+
version: string;
|
|
33
|
+
} | {
|
|
34
|
+
status: "trained";
|
|
35
|
+
learned: number;
|
|
36
|
+
passes: number;
|
|
37
|
+
loss: number;
|
|
38
|
+
version: string;
|
|
39
|
+
previousModel: string;
|
|
40
|
+
};
|
|
41
|
+
/** The version an adaptation writes: `<base>+exp1`, then `+exp2`, … */
|
|
42
|
+
export declare function nextExperienceVersion(version: string): string;
|
|
43
|
+
/** Which adaptation produced this model: N for `+expN`, 0 for a base that has none. */
|
|
44
|
+
export declare function experienceIndex(version: string): number;
|
|
45
|
+
/** Procedures the model has not learned yet. */
|
|
46
|
+
export declare function pendingDocuments(store: ExperienceStore, engine: TrainEngine, modelVersion: string): Promise<import("@seanhogg/builderforce-memory-engine").ExperienceDocument[]>;
|
|
47
|
+
export declare function trainExperience(store: ExperienceStore, engine: TrainEngine, model: LoadedEvermind, modelFile: string): Promise<TrainOutcome>;
|
|
48
|
+
//# sourceMappingURL=train.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/experience/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC9H,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;CACpC;AAED,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,CAAA;CAAE,GACzD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAInH,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,gDAAgD;AAChD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gFAQvG;AAED,wBAAsB,eAAe,CACjC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
|