@seanhogg/builderforce-memory-engine 2026.6.20 → 2026.6.28

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.
Files changed (72) hide show
  1. package/dist/index.d.ts +9 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +8 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/kernels/limbic_affect.d.ts +2 -0
  6. package/dist/kernels/limbic_affect.d.ts.map +1 -0
  7. package/dist/kernels/limbic_affect.js +74 -0
  8. package/dist/kernels/limbic_affect.js.map +1 -0
  9. package/dist/limbic/index.d.ts +14 -0
  10. package/dist/limbic/index.d.ts.map +1 -0
  11. package/dist/limbic/index.js +11 -0
  12. package/dist/limbic/index.js.map +1 -0
  13. package/dist/limbic/limbic_model.d.ts +111 -0
  14. package/dist/limbic/limbic_model.d.ts.map +1 -0
  15. package/dist/limbic/limbic_model.js +299 -0
  16. package/dist/limbic/limbic_model.js.map +1 -0
  17. package/dist/limbic/limbic_trainer.d.ts +62 -0
  18. package/dist/limbic/limbic_trainer.d.ts.map +1 -0
  19. package/dist/limbic/limbic_trainer.js +172 -0
  20. package/dist/limbic/limbic_trainer.js.map +1 -0
  21. package/dist/limbic/regions.d.ts +79 -0
  22. package/dist/limbic/regions.d.ts.map +1 -0
  23. package/dist/limbic/regions.js +132 -0
  24. package/dist/limbic/regions.js.map +1 -0
  25. package/dist/lm/evermind_lm.d.ts +148 -0
  26. package/dist/lm/evermind_lm.d.ts.map +1 -0
  27. package/dist/lm/evermind_lm.js +479 -0
  28. package/dist/lm/evermind_lm.js.map +1 -0
  29. package/dist/lm/index.d.ts +6 -0
  30. package/dist/lm/index.d.ts.map +1 -0
  31. package/dist/lm/index.js +5 -0
  32. package/dist/lm/index.js.map +1 -0
  33. package/dist/model/attention_block.js +1 -1
  34. package/dist/model/attention_block.js.map +1 -1
  35. package/dist/model/mamba_model.js +1 -1
  36. package/dist/model/mamba_model.js.map +1 -1
  37. package/dist/moe/index.d.ts +10 -0
  38. package/dist/moe/index.d.ts.map +1 -0
  39. package/dist/moe/index.js +7 -0
  40. package/dist/moe/index.js.map +1 -0
  41. package/dist/moe/moe_model.d.ts +134 -0
  42. package/dist/moe/moe_model.d.ts.map +1 -0
  43. package/dist/moe/moe_model.js +415 -0
  44. package/dist/moe/moe_model.js.map +1 -0
  45. package/dist/moe/moe_package.d.ts +81 -0
  46. package/dist/moe/moe_package.d.ts.map +1 -0
  47. package/dist/moe/moe_package.js +157 -0
  48. package/dist/moe/moe_package.js.map +1 -0
  49. package/dist/moe/moe_trainer.d.ts +53 -0
  50. package/dist/moe/moe_trainer.d.ts.map +1 -0
  51. package/dist/moe/moe_trainer.js +93 -0
  52. package/dist/moe/moe_trainer.js.map +1 -0
  53. package/dist/optim/adamw.d.ts +32 -0
  54. package/dist/optim/adamw.d.ts.map +1 -0
  55. package/dist/optim/adamw.js +52 -0
  56. package/dist/optim/adamw.js.map +1 -0
  57. package/package.json +1 -1
  58. package/src/index.ts +59 -0
  59. package/src/kernels/limbic_affect.ts +74 -0
  60. package/src/limbic/index.ts +28 -0
  61. package/src/limbic/limbic_model.ts +373 -0
  62. package/src/limbic/limbic_trainer.ts +253 -0
  63. package/src/limbic/regions.ts +141 -0
  64. package/src/lm/evermind_lm.ts +558 -0
  65. package/src/lm/index.ts +6 -0
  66. package/src/model/attention_block.ts +1 -1
  67. package/src/model/mamba_model.ts +1 -1
  68. package/src/moe/index.ts +23 -0
  69. package/src/moe/moe_model.ts +475 -0
  70. package/src/moe/moe_package.ts +205 -0
  71. package/src/moe/moe_trainer.ts +134 -0
  72. package/src/optim/adamw.ts +72 -0
@@ -0,0 +1,157 @@
1
+ /**
2
+ * moe_package.ts — EvermindModelPackage: the portable, publishable AI artifact.
3
+ *
4
+ * This is the unit a creator publishes to the marketplace and a buyer downloads
5
+ * and runs: a self-describing manifest (name, version, config, model card,
6
+ * integrity checksum) bundled with the trained checkpoint into one `.evermind`
7
+ * blob. It is the contract every downstream consumer (marketplace listing,
8
+ * purchase entitlement, workflow generator) reads — define it once, here.
9
+ *
10
+ * Zero-dep and isomorphic: serialises via TextEncoder/TextDecoder, runs in the
11
+ * browser (where models are trained) and in Node/Workers (where they execute).
12
+ */
13
+ import { SharedExpertMoE } from "./moe_model.js";
14
+ import { EvermindLM } from "../lm/evermind_lm.js";
15
+ /** First 4 bytes of a serialised package: "EVM1". */
16
+ const PKG_MAGIC = 0x45564d31;
17
+ const PKG_VERSION = 1;
18
+ /** 32-bit FNV-1a hash — dependency-free integrity check over the checkpoint. */
19
+ function fnv1a(bytes) {
20
+ let h = 0x811c9dc5;
21
+ for (let i = 0; i < bytes.length; i++) {
22
+ h ^= bytes[i];
23
+ h = Math.imul(h, 0x01000193);
24
+ }
25
+ return h >>> 0;
26
+ }
27
+ /**
28
+ * A trained model packaged for publishing: manifest + checkpoint. Build one with
29
+ * {@link EvermindModelPackage.fromModel}, ship {@link toBlob}, and a buyer
30
+ * reconstitutes it with {@link fromBlob} → {@link validate} → {@link loadModel}.
31
+ */
32
+ export class EvermindModelPackage {
33
+ manifest;
34
+ checkpoint;
35
+ constructor(manifest, checkpoint) {
36
+ this.manifest = manifest;
37
+ this.checkpoint = checkpoint;
38
+ }
39
+ /** Package a trained model with its publishing metadata. */
40
+ static fromModel(model, meta) {
41
+ const fp16 = meta.fp16 ?? false;
42
+ const checkpoint = model.exportWeights({ fp16 });
43
+ const manifest = {
44
+ schema: "evermind.model/1",
45
+ name: meta.name,
46
+ version: meta.version,
47
+ modelType: "shared-expert-moe",
48
+ config: model.config,
49
+ paramCount: model.parameters().reduce((n, p) => n + p.numel, 0),
50
+ checkpointFormat: "MoE0",
51
+ checkpointFp16: fp16,
52
+ checksum: fnv1a(new Uint8Array(checkpoint)),
53
+ card: meta.card,
54
+ ...(meta.createdAt ? { createdAt: meta.createdAt } : {}),
55
+ };
56
+ return new EvermindModelPackage(manifest, checkpoint);
57
+ }
58
+ /** Package a trained generative {@link EvermindLM} — the runnable marketplace AI. */
59
+ static fromLM(lm, meta) {
60
+ const fp16 = meta.fp16 ?? false;
61
+ const checkpoint = lm.exportWeights({ fp16 });
62
+ const manifest = {
63
+ schema: "evermind.model/1",
64
+ name: meta.name,
65
+ version: meta.version,
66
+ modelType: "evermind-lm",
67
+ config: lm.config,
68
+ paramCount: lm.parameters().reduce((n, p) => n + p.data.length, 0),
69
+ checkpointFormat: "EVL0",
70
+ checkpointFp16: fp16,
71
+ checksum: fnv1a(new Uint8Array(checkpoint)),
72
+ card: meta.card,
73
+ ...(meta.createdAt ? { createdAt: meta.createdAt } : {}),
74
+ };
75
+ return new EvermindModelPackage(manifest, checkpoint);
76
+ }
77
+ /** Serialise to a single `.evermind` blob: magic, version, manifest, checkpoint. */
78
+ toBlob() {
79
+ const manifestBytes = new TextEncoder().encode(JSON.stringify(this.manifest));
80
+ const headerBytes = 12; // magic, version, manifestLen
81
+ const out = new ArrayBuffer(headerBytes + manifestBytes.byteLength + this.checkpoint.byteLength);
82
+ const head = new Uint32Array(out, 0, 3);
83
+ head[0] = PKG_MAGIC;
84
+ head[1] = PKG_VERSION;
85
+ head[2] = manifestBytes.byteLength;
86
+ new Uint8Array(out, headerBytes, manifestBytes.byteLength).set(manifestBytes);
87
+ new Uint8Array(out, headerBytes + manifestBytes.byteLength).set(new Uint8Array(this.checkpoint));
88
+ return out;
89
+ }
90
+ /** Parse a `.evermind` blob. Throws on bad magic / truncation. */
91
+ static fromBlob(buffer) {
92
+ if (buffer.byteLength < 12)
93
+ throw new Error("EvermindModelPackage.fromBlob: truncated (no header)");
94
+ const head = new Uint32Array(buffer, 0, 3);
95
+ if (head[0] !== PKG_MAGIC)
96
+ throw new Error("EvermindModelPackage.fromBlob: bad magic (not an .evermind package)");
97
+ const manifestLen = head[2];
98
+ const headerBytes = 12;
99
+ if (headerBytes + manifestLen > buffer.byteLength) {
100
+ throw new Error("EvermindModelPackage.fromBlob: truncated (manifest length exceeds blob)");
101
+ }
102
+ const manifestBytes = new Uint8Array(buffer, headerBytes, manifestLen);
103
+ const manifest = JSON.parse(new TextDecoder().decode(manifestBytes));
104
+ const checkpoint = buffer.slice(headerBytes + manifestLen);
105
+ return new EvermindModelPackage(manifest, checkpoint);
106
+ }
107
+ /** Verify integrity + structural sanity before trusting a downloaded package. */
108
+ validate() {
109
+ const errors = [];
110
+ if (this.manifest.schema !== "evermind.model/1")
111
+ errors.push(`unknown schema: ${this.manifest.schema}`);
112
+ const c = this.manifest.config;
113
+ if (this.manifest.modelType === "shared-expert-moe") {
114
+ if (!c || c.modelDim <= 0 || c.hiddenDim <= 0 || c.numExperts <= 0 || c.topK < 1 || c.topK > c.numExperts) {
115
+ errors.push("invalid config");
116
+ }
117
+ }
118
+ else if (this.manifest.modelType === "evermind-lm") {
119
+ if (!c || c.vocabSize <= 0 || c.dModel <= 0 || c.numLayers <= 0 || c.numExperts <= 0 || c.topK < 1 || c.topK > c.numExperts) {
120
+ errors.push("invalid config");
121
+ }
122
+ }
123
+ else {
124
+ errors.push(`unsupported modelType: ${String(this.manifest.modelType)}`);
125
+ }
126
+ const actual = fnv1a(new Uint8Array(this.checkpoint));
127
+ if (actual !== this.manifest.checksum) {
128
+ errors.push(`checksum mismatch (manifest ${this.manifest.checksum}, actual ${actual}) — corrupt or tampered checkpoint`);
129
+ }
130
+ return { ok: errors.length === 0, errors };
131
+ }
132
+ /** Reconstruct the bare MoE layer. Validates first; throws if invalid / wrong type. */
133
+ loadModel() {
134
+ const v = this.validate();
135
+ if (!v.ok)
136
+ throw new Error(`EvermindModelPackage.loadModel: ${v.errors.join("; ")}`);
137
+ if (this.manifest.modelType !== "shared-expert-moe") {
138
+ throw new Error(`loadModel: package is '${this.manifest.modelType}', use loadLM()`);
139
+ }
140
+ const model = new SharedExpertMoE(this.manifest.config);
141
+ model.loadWeights(this.checkpoint);
142
+ return model;
143
+ }
144
+ /** Reconstruct the runnable generative model — what a marketplace buyer runs. */
145
+ loadLM() {
146
+ const v = this.validate();
147
+ if (!v.ok)
148
+ throw new Error(`EvermindModelPackage.loadLM: ${v.errors.join("; ")}`);
149
+ if (this.manifest.modelType !== "evermind-lm") {
150
+ throw new Error(`loadLM: package is '${this.manifest.modelType}', use loadModel()`);
151
+ }
152
+ const lm = new EvermindLM(this.manifest.config);
153
+ lm.loadWeights(this.checkpoint);
154
+ return lm;
155
+ }
156
+ }
157
+ //# sourceMappingURL=moe_package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moe_package.js","sourceRoot":"","sources":["../../src/moe/moe_package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * moe_trainer.ts — AdamW training loop for {@link SharedExpertMoE}.
3
+ *
4
+ * Makes "train your own Evermind AI" real: given labelled (input → target)
5
+ * samples, runs minibatch AdamW over the flat parameters with the load-balancing
6
+ * auxiliary loss mixed in (so the router spreads load instead of collapsing onto
7
+ * a few experts). Pure CPU, deterministic given a seeded model — the same loop a
8
+ * WebGPU optimiser kernel would accelerate.
9
+ */
10
+ import { SharedExpertMoE } from "./moe_model.js";
11
+ export interface MoESample {
12
+ input: ArrayLike<number>;
13
+ target: ArrayLike<number>;
14
+ }
15
+ export interface MoETrainOptions {
16
+ /** Learning rate. Default 0.01. */
17
+ lr?: number;
18
+ /** AdamW β1. Default 0.9. */
19
+ beta1?: number;
20
+ /** AdamW β2. Default 0.999. */
21
+ beta2?: number;
22
+ /** AdamW ε. Default 1e-8. */
23
+ eps?: number;
24
+ /** Decoupled weight decay. Default 0. */
25
+ weightDecay?: number;
26
+ /** Weight of the load-balancing auxiliary loss. Default 0.01. */
27
+ auxWeight?: number;
28
+ /** Minibatch size. Default = all samples (full batch). */
29
+ batchSize?: number;
30
+ /** Passes over the dataset. Default 1. */
31
+ epochs?: number;
32
+ }
33
+ export interface MoEEpochResult {
34
+ /** Mean per-sample task (MSE·½) loss over the epoch. */
35
+ loss: number;
36
+ /** Load-balancing auxiliary loss at the end of the epoch (≈1 balanced … E collapsed). */
37
+ auxLoss: number;
38
+ }
39
+ /**
40
+ * AdamW optimiser over a model's flat parameter list. State (m, v) is keyed by
41
+ * parameter index and persists across {@link step} calls.
42
+ */
43
+ export declare class MoETrainer {
44
+ private readonly model;
45
+ private readonly adam;
46
+ private readonly opt;
47
+ constructor(model: SharedExpertMoE, options?: MoETrainOptions);
48
+ /** Train for the configured epochs. Returns the per-epoch loss history. */
49
+ fit(samples: MoESample[]): MoEEpochResult[];
50
+ private runEpoch;
51
+ private scaleGradients;
52
+ }
53
+ //# sourceMappingURL=moe_trainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moe_trainer.d.ts","sourceRoot":"","sources":["../../src/moe/moe_trainer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,UAAU;IAKnB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;gBAG7B,KAAK,EAAE,eAAe,EACvC,OAAO,GAAE,eAAoB;IAe/B,2EAA2E;IAC3E,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE;IAM3C,OAAO,CAAC,QAAQ;IAmDhB,OAAO,CAAC,cAAc;CAMvB"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * moe_trainer.ts — AdamW training loop for {@link SharedExpertMoE}.
3
+ *
4
+ * Makes "train your own Evermind AI" real: given labelled (input → target)
5
+ * samples, runs minibatch AdamW over the flat parameters with the load-balancing
6
+ * auxiliary loss mixed in (so the router spreads load instead of collapsing onto
7
+ * a few experts). Pure CPU, deterministic given a seeded model — the same loop a
8
+ * WebGPU optimiser kernel would accelerate.
9
+ */
10
+ import { AdamW } from "../optim/adamw.js";
11
+ /**
12
+ * AdamW optimiser over a model's flat parameter list. State (m, v) is keyed by
13
+ * parameter index and persists across {@link step} calls.
14
+ */
15
+ export class MoETrainer {
16
+ model;
17
+ adam;
18
+ opt;
19
+ constructor(model, options = {}) {
20
+ this.model = model;
21
+ this.opt = {
22
+ lr: options.lr ?? 0.01,
23
+ beta1: options.beta1 ?? 0.9,
24
+ beta2: options.beta2 ?? 0.999,
25
+ eps: options.eps ?? 1e-8,
26
+ weightDecay: options.weightDecay ?? 0,
27
+ auxWeight: options.auxWeight ?? 0.01,
28
+ batchSize: options.batchSize ?? 0,
29
+ epochs: options.epochs ?? 1,
30
+ };
31
+ this.adam = new AdamW(model, this.opt);
32
+ }
33
+ /** Train for the configured epochs. Returns the per-epoch loss history. */
34
+ fit(samples) {
35
+ const history = [];
36
+ for (let e = 0; e < this.opt.epochs; e++)
37
+ history.push(this.runEpoch(samples));
38
+ return history;
39
+ }
40
+ runEpoch(samples) {
41
+ const batchSize = this.opt.batchSize > 0 ? this.opt.batchSize : samples.length;
42
+ const { numExperts, modelDim } = this.model.config;
43
+ let epochLoss = 0;
44
+ let lastAux = 0;
45
+ for (let start = 0; start < samples.length; start += batchSize) {
46
+ const batch = samples.slice(start, start + batchSize);
47
+ this.model.zeroGrad();
48
+ // Forward + task backward, retaining (x, probs) for the batch aux gradient.
49
+ const xs = [];
50
+ const probsList = [];
51
+ const counts = new Float32Array(numExperts);
52
+ let batchLoss = 0;
53
+ for (const s of batch) {
54
+ const f = this.model.forward(s.input);
55
+ const dOut = new Float32Array(modelDim);
56
+ for (let d = 0; d < modelDim; d++) {
57
+ const diff = f.output[d] - (s.target[d] ?? 0);
58
+ dOut[d] = diff;
59
+ batchLoss += 0.5 * diff * diff;
60
+ }
61
+ this.model.backward(dOut, f.cache);
62
+ xs.push(f.cache.x);
63
+ probsList.push(f.route.probs);
64
+ for (const ex of f.route.experts)
65
+ counts[ex] = counts[ex] + 1;
66
+ }
67
+ // Load-balancing aux gradient (batch-level): f = dispatch fractions.
68
+ const dispatched = counts.reduce((a, b) => a + b, 0) || 1;
69
+ const fVec = Float32Array.from(counts, (c) => c / dispatched);
70
+ const scale = (this.opt.auxWeight * numExperts) / batch.length;
71
+ for (let i = 0; i < xs.length; i++) {
72
+ this.model.auxGradStep(xs[i], probsList[i], fVec, scale);
73
+ }
74
+ // Average the task gradient over the batch, then AdamW step.
75
+ this.scaleGradients(1 / batch.length);
76
+ this.adam.step();
77
+ epochLoss += batchLoss;
78
+ lastAux = numExperts * fVec.reduce((sum, f, e) => sum + f * (probsList.length
79
+ ? probsList.reduce((s, p) => s + p[e], 0) / probsList.length
80
+ : 0), 0);
81
+ }
82
+ return { loss: epochLoss / Math.max(1, samples.length), auxLoss: lastAux };
83
+ }
84
+ scaleGradients(k) {
85
+ if (k === 1)
86
+ return;
87
+ for (const g of this.model.gradients()) {
88
+ for (let i = 0; i < g.data.length; i++)
89
+ g.data[i] = g.data[i] * k;
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=moe_trainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moe_trainer.js","sourceRoot":"","sources":["../../src/moe/moe_trainer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * adamw.ts — AdamW optimiser over a model's flat parameter list.
3
+ *
4
+ * Shared by every CPU-reference trainer in the engine (MoE FFN, the full
5
+ * EvermindLM) so the optimiser maths lives in exactly one place. Operates on any
6
+ * object exposing index-aligned `parameters()` / `gradients()` Float32Arrays.
7
+ */
8
+ export interface OptimParam {
9
+ data: Float32Array;
10
+ }
11
+ export interface OptimTarget {
12
+ parameters(): OptimParam[];
13
+ gradients(): OptimParam[];
14
+ }
15
+ export interface AdamWOptions {
16
+ lr?: number;
17
+ beta1?: number;
18
+ beta2?: number;
19
+ eps?: number;
20
+ weightDecay?: number;
21
+ }
22
+ export declare class AdamW {
23
+ private readonly target;
24
+ private readonly m;
25
+ private readonly v;
26
+ private t;
27
+ private readonly opt;
28
+ constructor(target: OptimTarget, options?: AdamWOptions);
29
+ /** One optimiser step from the currently-accumulated gradients. */
30
+ step(): void;
31
+ }
32
+ //# sourceMappingURL=adamw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adamw.d.ts","sourceRoot":"","sources":["../../src/optim/adamw.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,IAAI,UAAU,EAAE,CAAC;IAC3B,SAAS,IAAI,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,KAAK;IAOd,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAsB;IACxC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAsB;IACxC,OAAO,CAAC,CAAC,CAAK;IACd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;gBAG1B,MAAM,EAAE,WAAW,EACpC,OAAO,GAAE,YAAiB;IAe5B,mEAAmE;IACnE,IAAI,IAAI,IAAI;CAsBb"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * adamw.ts — AdamW optimiser over a model's flat parameter list.
3
+ *
4
+ * Shared by every CPU-reference trainer in the engine (MoE FFN, the full
5
+ * EvermindLM) so the optimiser maths lives in exactly one place. Operates on any
6
+ * object exposing index-aligned `parameters()` / `gradients()` Float32Arrays.
7
+ */
8
+ export class AdamW {
9
+ target;
10
+ m = [];
11
+ v = [];
12
+ t = 0;
13
+ opt;
14
+ constructor(target, options = {}) {
15
+ this.target = target;
16
+ this.opt = {
17
+ lr: options.lr ?? 0.01,
18
+ beta1: options.beta1 ?? 0.9,
19
+ beta2: options.beta2 ?? 0.999,
20
+ eps: options.eps ?? 1e-8,
21
+ weightDecay: options.weightDecay ?? 0,
22
+ };
23
+ for (const p of target.parameters()) {
24
+ this.m.push(new Float32Array(p.data.length));
25
+ this.v.push(new Float32Array(p.data.length));
26
+ }
27
+ }
28
+ /** One optimiser step from the currently-accumulated gradients. */
29
+ step() {
30
+ this.t++;
31
+ const { lr, beta1, beta2, eps, weightDecay } = this.opt;
32
+ const params = this.target.parameters();
33
+ const grads = this.target.gradients();
34
+ const bc1 = 1 - Math.pow(beta1, this.t);
35
+ const bc2 = 1 - Math.pow(beta2, this.t);
36
+ for (let p = 0; p < params.length; p++) {
37
+ const w = params[p].data;
38
+ const g = grads[p].data;
39
+ const m = this.m[p];
40
+ const v = this.v[p];
41
+ for (let i = 0; i < w.length; i++) {
42
+ const gi = g[i];
43
+ m[i] = beta1 * m[i] + (1 - beta1) * gi;
44
+ v[i] = beta2 * v[i] + (1 - beta2) * gi * gi;
45
+ const mh = m[i] / bc1;
46
+ const vh = v[i] / bc2;
47
+ w[i] = w[i] - lr * (mh / (Math.sqrt(vh) + eps) + weightDecay * w[i]);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=adamw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adamw.js","sourceRoot":"","sources":["../../src/optim/adamw.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seanhogg/builderforce-memory-engine",
3
- "version": "2026.6.20",
3
+ "version": "2026.6.28",
4
4
  "description": "BuilderForce Agent Memory — engine layer. TypeScript/WGSL Mamba SSM kernels, model blocks, autograd, training, and BPE tokenizer (zero runtime deps, WebGPU-native).",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
package/src/index.ts CHANGED
@@ -15,6 +15,34 @@ export { AttentionBlock } from './model/attention_block.js';
15
15
  // Deprecated alias — kept until 3.0.0
16
16
  export { MambaBlock } from './model/mamba1_block.js';
17
17
 
18
+ // ── Mixture-of-Experts (shared-expert hybrid sparsity) ─────────────────────────
19
+ export {
20
+ SharedExpertMoE,
21
+ LoadBalanceAccumulator,
22
+ DEFAULT_MOE_CONFIG,
23
+ DEFAULT_MOE_SEED,
24
+ MoETrainer,
25
+ EvermindModelPackage,
26
+ } from './moe/index.js';
27
+ export type {
28
+ MoEConfig,
29
+ MoEParam,
30
+ RouteResult,
31
+ MoESample,
32
+ MoETrainOptions,
33
+ MoEEpochResult,
34
+ EvermindModelManifest,
35
+ EvermindModelCard,
36
+ PackageMeta,
37
+ ValidationResult,
38
+ } from './moe/index.js';
39
+
40
+ // ── EvermindLM (the generative model) + AdamW ──────────────────────────────────
41
+ export { EvermindLM, EvermindLMTrainer, DEFAULT_LM_CONFIG, DEFAULT_LM_SEED } from './lm/index.js';
42
+ export type { EvermindLMConfig, LMGenerateOptions, TextCodec } from './lm/index.js';
43
+ export { AdamW } from './optim/adamw.js';
44
+ export type { AdamWOptions, OptimTarget, OptimParam } from './optim/adamw.js';
45
+
18
46
  // ── Training ──────────────────────────────────────────────────────────────────
19
47
 
20
48
  export { MambaTrainer } from './training/trainer.js';
@@ -108,6 +136,37 @@ export { COMPLEX_SSD_FORWARD_WGSL, COMPLEX_SSD_BACKWARD_WGSL }
108
136
  export { ATTENTION_FORWARD_WGSL, ATTENTION_BACKWARD_WGSL, SOFTMAX_WGSL }
109
137
  from './kernels/attention.js';
110
138
 
139
+ // ── Limbic system (trainable affective dynamics) ──────────────────────────────
140
+
141
+ export {
142
+ REGION,
143
+ LIMBIC_DIM,
144
+ LIMBIC_DIM_NAMES,
145
+ LIMBIC_STATE_DIM,
146
+ LIMBIC_BOUNDS,
147
+ NEUTRAL_STATE,
148
+ clampDim,
149
+ clampState,
150
+ neutralState,
151
+ stateToRecord,
152
+ recordToState,
153
+ LimbicModel,
154
+ DEFAULT_LIMBIC_CONFIG,
155
+ DEFAULT_LIMBIC_SEED,
156
+ LimbicTrainer,
157
+ } from './limbic/index.js';
158
+ export type {
159
+ Region,
160
+ LimbicDimName,
161
+ LimbicModelConfig,
162
+ LimbicForward,
163
+ LimbicParam,
164
+ LimbicSample,
165
+ LimbicTrainOptions,
166
+ } from './limbic/index.js';
167
+
168
+ export { LIMBIC_AFFECT_WGSL } from './kernels/limbic_affect.js';
169
+
111
170
  // ── Version ───────────────────────────────────────────────────────────────────
112
171
 
113
172
  export const VERSION = '2.0.0';
@@ -0,0 +1,74 @@
1
+ // Limbic Affect WGSL Kernel
2
+ //
3
+ // One forward step of the limbic model's recurrent affect core, run on the GPU.
4
+ // Given the previous hidden state, previous affective state, and an experience
5
+ // embedding, it produces the next hidden state and a bounded affect *delta*.
6
+ //
7
+ // This mirrors the CPU reference in limbic/limbic_model.ts exactly (same math):
8
+ // pre[j] = Σ_i Win[j,i]·x[i] + Σ_k Ws[j,k]·s[k]
9
+ // a[j] = sigmoid(A[j]) // per-channel recurrence gate
10
+ // h'[j] = a[j]·h[j] + (1-a[j])·tanh(pre[j]) // SSM-style leak/input
11
+ // Δ[k] = tanh( Σ_j Wout[k,j]·h'[j] + b[k] ) // bounded affect change
12
+ //
13
+ // hidden_dim is assumed ≤ 64 (the limbic head is tiny — the heavy lifting is in
14
+ // the hippocampus SSM that produces the experience embedding). Reward is NOT
15
+ // computed here: it is only needed during training, which runs the CPU backward
16
+ // path; the per-turn inference step only needs Δ and the next hidden state.
17
+
18
+ export const LIMBIC_AFFECT_WGSL: string = /* wgsl */ `
19
+
20
+ struct Dims {
21
+ input_dim : u32,
22
+ hidden_dim : u32,
23
+ state_dim : u32,
24
+ _pad : u32,
25
+ };
26
+
27
+ @group(0) @binding(0) var<uniform> dims : Dims;
28
+ @group(0) @binding(1) var<storage, read> win : array<f32>; // hidden*input
29
+ @group(0) @binding(2) var<storage, read> ws : array<f32>; // hidden*state
30
+ @group(0) @binding(3) var<storage, read> a_logit : array<f32>; // hidden
31
+ @group(0) @binding(4) var<storage, read> wout_state : array<f32>; // state*hidden
32
+ @group(0) @binding(5) var<storage, read> bout_state : array<f32>; // state
33
+ @group(0) @binding(6) var<storage, read> x_in : array<f32>; // input
34
+ @group(0) @binding(7) var<storage, read> h_prev : array<f32>; // hidden
35
+ @group(0) @binding(8) var<storage, read> s_prev : array<f32>; // state
36
+ @group(0) @binding(9) var<storage, read_write> h_out : array<f32>; // hidden
37
+ @group(0) @binding(10) var<storage, read_write> delta_out : array<f32>; // state
38
+
39
+ var<workgroup> hbuf : array<f32, 64>;
40
+
41
+ // Single-workgroup dispatch: (1, 1, 1) with workgroup_size 64.
42
+ @compute @workgroup_size(64, 1, 1)
43
+ fn affect_step(
44
+ @builtin(local_invocation_id) lid : vec3<u32>,
45
+ ) {
46
+ let j = lid.x;
47
+
48
+ // Pass 1: recurrent hidden update (one thread per hidden channel).
49
+ if (j < dims.hidden_dim) {
50
+ var pre : f32 = 0.0;
51
+ for (var i : u32 = 0u; i < dims.input_dim; i = i + 1u) {
52
+ pre = pre + win[j * dims.input_dim + i] * x_in[i];
53
+ }
54
+ for (var k : u32 = 0u; k < dims.state_dim; k = k + 1u) {
55
+ pre = pre + ws[j * dims.state_dim + k] * s_prev[k];
56
+ }
57
+ let a = 1.0 / (1.0 + exp(-a_logit[j]));
58
+ let hn = a * h_prev[j] + (1.0 - a) * tanh(pre);
59
+ hbuf[j] = hn;
60
+ h_out[j] = hn;
61
+ }
62
+
63
+ workgroupBarrier();
64
+
65
+ // Pass 2: bounded affect delta (one thread per state dim).
66
+ if (j < dims.state_dim) {
67
+ var acc : f32 = bout_state[j];
68
+ for (var m : u32 = 0u; m < dims.hidden_dim; m = m + 1u) {
69
+ acc = acc + wout_state[j * dims.hidden_dim + m] * hbuf[m];
70
+ }
71
+ delta_out[j] = tanh(acc);
72
+ }
73
+ }
74
+ `;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Limbic system – trainable affective/motivational dynamics for agents.
3
+ *
4
+ * The dynamic counterpart to the (static) psychometric personality: where
5
+ * personality sets the homeostatic setpoints, the limbic model learns — in
6
+ * WebGPU — how an agent's affective state moves in response to experience.
7
+ */
8
+
9
+ export {
10
+ REGION,
11
+ LIMBIC_DIM,
12
+ LIMBIC_DIM_NAMES,
13
+ LIMBIC_STATE_DIM,
14
+ LIMBIC_BOUNDS,
15
+ NEUTRAL_STATE,
16
+ clampDim,
17
+ clampState,
18
+ neutralState,
19
+ stateToRecord,
20
+ recordToState,
21
+ } from "./regions.js";
22
+ export type { Region, LimbicDimName } from "./regions.js";
23
+
24
+ export { LimbicModel, DEFAULT_LIMBIC_CONFIG, DEFAULT_LIMBIC_SEED } from "./limbic_model.js";
25
+ export type { LimbicModelConfig, LimbicForward, LimbicParam } from "./limbic_model.js";
26
+
27
+ export { LimbicTrainer } from "./limbic_trainer.js";
28
+ export type { LimbicSample, LimbicTrainOptions } from "./limbic_trainer.js";