@seanhogg/builderforce-memory-engine 2026.7.12 → 2026.9.27

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 (196) hide show
  1. package/README.md +14 -0
  2. package/dist/bench/adaptation.d.ts +57 -0
  3. package/dist/bench/adaptation.d.ts.map +1 -0
  4. package/dist/bench/adaptation.js +167 -0
  5. package/dist/bench/adaptation.js.map +1 -0
  6. package/dist/bench/harness.d.ts +2 -0
  7. package/dist/bench/harness.d.ts.map +1 -1
  8. package/dist/bench/harness.js +1 -1
  9. package/dist/bench/harness.js.map +1 -1
  10. package/dist/bench/index.d.ts +5 -3
  11. package/dist/bench/index.d.ts.map +1 -1
  12. package/dist/bench/index.js +4 -2
  13. package/dist/bench/index.js.map +1 -1
  14. package/dist/bench/types.d.ts +88 -0
  15. package/dist/bench/types.d.ts.map +1 -1
  16. package/dist/evermind/adapt.d.ts +40 -0
  17. package/dist/evermind/adapt.d.ts.map +1 -0
  18. package/dist/evermind/adapt.js +25 -0
  19. package/dist/evermind/adapt.js.map +1 -0
  20. package/dist/evermind/delta_wire.d.ts +43 -0
  21. package/dist/evermind/delta_wire.d.ts.map +1 -0
  22. package/dist/evermind/delta_wire.js +94 -0
  23. package/dist/evermind/delta_wire.js.map +1 -0
  24. package/dist/evermind/eval.d.ts +31 -0
  25. package/dist/evermind/eval.d.ts.map +1 -0
  26. package/dist/evermind/eval.js +36 -0
  27. package/dist/evermind/eval.js.map +1 -0
  28. package/dist/evermind/index.d.ts +16 -0
  29. package/dist/evermind/index.d.ts.map +1 -0
  30. package/dist/evermind/index.js +11 -0
  31. package/dist/evermind/index.js.map +1 -0
  32. package/dist/evermind/merge.d.ts +21 -0
  33. package/dist/evermind/merge.d.ts.map +1 -0
  34. package/dist/evermind/merge.js +79 -0
  35. package/dist/evermind/merge.js.map +1 -0
  36. package/dist/{moe/moe_package.d.ts → evermind/package.d.ts} +55 -5
  37. package/dist/evermind/package.d.ts.map +1 -0
  38. package/dist/{moe/moe_package.js → evermind/package.js} +118 -19
  39. package/dist/evermind/package.js.map +1 -0
  40. package/dist/import/foreign/adapter.d.ts +59 -0
  41. package/dist/import/foreign/adapter.d.ts.map +1 -0
  42. package/dist/import/foreign/adapter.js +76 -0
  43. package/dist/import/foreign/adapter.js.map +1 -0
  44. package/dist/import/foreign/apply.d.ts +23 -0
  45. package/dist/import/foreign/apply.d.ts.map +1 -0
  46. package/dist/import/foreign/apply.js +43 -0
  47. package/dist/import/foreign/apply.js.map +1 -0
  48. package/dist/import/foreign/codestral_mamba.d.ts +57 -0
  49. package/dist/import/foreign/codestral_mamba.d.ts.map +1 -0
  50. package/dist/import/foreign/codestral_mamba.js +174 -0
  51. package/dist/import/foreign/codestral_mamba.js.map +1 -0
  52. package/dist/import/foreign/falcon_mamba.d.ts +51 -0
  53. package/dist/import/foreign/falcon_mamba.d.ts.map +1 -0
  54. package/dist/import/foreign/falcon_mamba.js +131 -0
  55. package/dist/import/foreign/falcon_mamba.js.map +1 -0
  56. package/dist/import/foreign/index.d.ts +21 -0
  57. package/dist/import/foreign/index.d.ts.map +1 -0
  58. package/dist/import/foreign/index.js +18 -0
  59. package/dist/import/foreign/index.js.map +1 -0
  60. package/dist/import/foreign/plan.d.ts +122 -0
  61. package/dist/import/foreign/plan.d.ts.map +1 -0
  62. package/dist/import/foreign/plan.js +171 -0
  63. package/dist/import/foreign/plan.js.map +1 -0
  64. package/dist/import/foreign/registry.d.ts +35 -0
  65. package/dist/import/foreign/registry.d.ts.map +1 -0
  66. package/dist/import/foreign/registry.js +89 -0
  67. package/dist/import/foreign/registry.js.map +1 -0
  68. package/dist/import/index.d.ts +7 -0
  69. package/dist/import/index.d.ts.map +1 -1
  70. package/dist/import/index.js +7 -0
  71. package/dist/import/index.js.map +1 -1
  72. package/dist/index.d.ts +29 -12
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +24 -9
  75. package/dist/index.js.map +1 -1
  76. package/dist/kernels/selective_scan.d.ts.map +1 -1
  77. package/dist/kernels/selective_scan.js +15 -9
  78. package/dist/kernels/selective_scan.js.map +1 -1
  79. package/dist/kernels/slice.d.ts +26 -0
  80. package/dist/kernels/slice.d.ts.map +1 -0
  81. package/dist/kernels/slice.js +52 -0
  82. package/dist/kernels/slice.js.map +1 -0
  83. package/dist/kernels/weight_update.d.ts.map +1 -1
  84. package/dist/kernels/weight_update.js +30 -4
  85. package/dist/kernels/weight_update.js.map +1 -1
  86. package/dist/lm/evermind_lm.d.ts +180 -4
  87. package/dist/lm/evermind_lm.d.ts.map +1 -1
  88. package/dist/lm/evermind_lm.js +433 -116
  89. package/dist/lm/evermind_lm.js.map +1 -1
  90. package/dist/lm/index.d.ts +8 -2
  91. package/dist/lm/index.d.ts.map +1 -1
  92. package/dist/lm/index.js +6 -1
  93. package/dist/lm/index.js.map +1 -1
  94. package/dist/lm/text_embedder.d.ts +55 -0
  95. package/dist/lm/text_embedder.d.ts.map +1 -0
  96. package/dist/lm/text_embedder.js +62 -0
  97. package/dist/lm/text_embedder.js.map +1 -0
  98. package/dist/model/attention_block.d.ts.map +1 -1
  99. package/dist/model/attention_block.js +9 -5
  100. package/dist/model/attention_block.js.map +1 -1
  101. package/dist/model/mamba1_block.d.ts.map +1 -1
  102. package/dist/model/mamba1_block.js +28 -12
  103. package/dist/model/mamba1_block.js.map +1 -1
  104. package/dist/model/mamba2_block.d.ts.map +1 -1
  105. package/dist/model/mamba2_block.js +14 -9
  106. package/dist/model/mamba2_block.js.map +1 -1
  107. package/dist/model/mamba3_block.d.ts.map +1 -1
  108. package/dist/model/mamba3_block.js +14 -9
  109. package/dist/model/mamba3_block.js.map +1 -1
  110. package/dist/moe/index.d.ts +0 -2
  111. package/dist/moe/index.d.ts.map +1 -1
  112. package/dist/moe/index.js +0 -1
  113. package/dist/moe/index.js.map +1 -1
  114. package/dist/optim/adamw.d.ts +58 -1
  115. package/dist/optim/adamw.d.ts.map +1 -1
  116. package/dist/optim/adamw.js +69 -4
  117. package/dist/optim/adamw.js.map +1 -1
  118. package/dist/tokenizer/bpe.d.ts +28 -0
  119. package/dist/tokenizer/bpe.d.ts.map +1 -1
  120. package/dist/tokenizer/bpe.js +47 -0
  121. package/dist/tokenizer/bpe.js.map +1 -1
  122. package/dist/training/cpu_ops.d.ts +44 -0
  123. package/dist/training/cpu_ops.d.ts.map +1 -0
  124. package/dist/training/cpu_ops.js +111 -0
  125. package/dist/training/cpu_ops.js.map +1 -0
  126. package/dist/training/lora.d.ts +153 -0
  127. package/dist/training/lora.d.ts.map +1 -0
  128. package/dist/training/lora.js +324 -0
  129. package/dist/training/lora.js.map +1 -0
  130. package/dist/training/mamba1_cpu.d.ts +109 -0
  131. package/dist/training/mamba1_cpu.d.ts.map +1 -0
  132. package/dist/training/mamba1_cpu.js +316 -0
  133. package/dist/training/mamba1_cpu.js.map +1 -0
  134. package/dist/training/mixed_precision.d.ts +67 -0
  135. package/dist/training/mixed_precision.d.ts.map +1 -0
  136. package/dist/training/mixed_precision.js +101 -0
  137. package/dist/training/mixed_precision.js.map +1 -0
  138. package/dist/training/model_cpu.d.ts +100 -0
  139. package/dist/training/model_cpu.d.ts.map +1 -0
  140. package/dist/training/model_cpu.js +252 -0
  141. package/dist/training/model_cpu.js.map +1 -0
  142. package/dist/training/trainer.d.ts +156 -16
  143. package/dist/training/trainer.d.ts.map +1 -1
  144. package/dist/training/trainer.js +327 -101
  145. package/dist/training/trainer.js.map +1 -1
  146. package/dist/utils/base64.d.ts +12 -0
  147. package/dist/utils/base64.d.ts.map +1 -0
  148. package/dist/utils/base64.js +27 -0
  149. package/dist/utils/base64.js.map +1 -0
  150. package/package.json +3 -1
  151. package/src/bench/adaptation.ts +180 -0
  152. package/src/bench/harness.ts +1 -1
  153. package/src/bench/index.ts +13 -2
  154. package/src/bench/types.ts +93 -0
  155. package/src/evermind/adapt.ts +61 -0
  156. package/src/evermind/delta_wire.ts +114 -0
  157. package/src/evermind/eval.ts +62 -0
  158. package/src/evermind/index.ts +33 -0
  159. package/src/evermind/merge.ts +106 -0
  160. package/src/{moe/moe_package.ts → evermind/package.ts} +148 -17
  161. package/src/import/foreign/adapter.ts +106 -0
  162. package/src/import/foreign/apply.ts +54 -0
  163. package/src/import/foreign/codestral_mamba.ts +224 -0
  164. package/src/import/foreign/falcon_mamba.ts +173 -0
  165. package/src/import/foreign/index.ts +37 -0
  166. package/src/import/foreign/plan.ts +294 -0
  167. package/src/import/foreign/registry.ts +126 -0
  168. package/src/import/index.ts +30 -0
  169. package/src/index.ts +104 -13
  170. package/src/kernels/selective_scan.ts +15 -9
  171. package/src/kernels/slice.ts +64 -0
  172. package/src/kernels/weight_update.ts +30 -4
  173. package/src/lm/evermind_lm.ts +470 -116
  174. package/src/lm/index.ts +12 -2
  175. package/src/lm/text_embedder.ts +84 -0
  176. package/src/model/attention_block.ts +9 -5
  177. package/src/model/mamba1_block.ts +28 -12
  178. package/src/model/mamba2_block.ts +14 -9
  179. package/src/model/mamba3_block.ts +14 -9
  180. package/src/moe/index.ts +0 -9
  181. package/src/optim/adamw.ts +115 -7
  182. package/src/tokenizer/bpe.ts +55 -0
  183. package/src/training/cpu_ops.ts +127 -0
  184. package/src/training/lora.ts +365 -0
  185. package/src/training/mamba1_cpu.ts +421 -0
  186. package/src/training/mixed_precision.ts +119 -0
  187. package/src/training/model_cpu.ts +360 -0
  188. package/src/training/trainer.ts +397 -154
  189. package/src/utils/base64.ts +28 -0
  190. package/dist/model/mamba_block.d.ts +0 -64
  191. package/dist/model/mamba_block.d.ts.map +0 -1
  192. package/dist/model/mamba_block.js +0 -303
  193. package/dist/model/mamba_block.js.map +0 -1
  194. package/dist/moe/moe_package.d.ts.map +0 -1
  195. package/dist/moe/moe_package.js.map +0 -1
  196. package/src/model/mamba_block.ts +0 -401
@@ -0,0 +1,64 @@
1
+ /**
2
+ * slice.ts — strided COLUMN slice of a row-major (rows, stride) tensor.
3
+ *
4
+ * Every block in this engine projects into one fused tensor and then splits it:
5
+ * Mamba-1 into (x, z) and (Δ, B, C), Mamba-2/3 into (x, Δ) and (x, B, C),
6
+ * attention into (Q, K, V). `LINEAR_FORWARD_WGSL` writes its output `(M, N)`
7
+ * ROW-major, so each of those parts is a contiguous range of COLUMNS **within
8
+ * every row** — not a contiguous range of the buffer.
9
+ *
10
+ * Splitting them with `copyBufferToBuffer` therefore took whole ROWS instead: it
11
+ * is only the right answer when `M == 1` (batch × seq_len), and for any real
12
+ * sequence it silently handed the block the wrong tensor. This kernel is the one
13
+ * correct implementation; every block uses it.
14
+ */
15
+
16
+ import { createBindGroup, createUniformBuffer, dispatchKernel, cdiv } from '../utils/gpu_utils.js';
17
+
18
+ export const COL_SLICE_WGSL: string = /* wgsl */`
19
+ struct SliceParams {
20
+ rows : u32,
21
+ stride : u32, // source row width
22
+ offset : u32, // first column to take
23
+ width : u32, // number of columns to take
24
+ };
25
+ @group(0) @binding(0) var<uniform> p : SliceParams;
26
+ @group(0) @binding(1) var<storage, read> src : array<f32>;
27
+ @group(0) @binding(2) var<storage, read_write> dst : array<f32>;
28
+
29
+ // Dispatch: (ceil(rows * width / 256), 1, 1)
30
+ @compute @workgroup_size(256)
31
+ fn col_slice(@builtin(global_invocation_id) gid: vec3<u32>) {
32
+ let i = gid.x;
33
+ if (i >= p.rows * p.width) { return; }
34
+ let r = i / p.width;
35
+ let c = i % p.width;
36
+ dst[i] = src[r * p.stride + p.offset + c];
37
+ }
38
+ `;
39
+
40
+ /** Entry point name of {@link COL_SLICE_WGSL}. */
41
+ export const COL_SLICE_ENTRY = 'col_slice';
42
+
43
+ /**
44
+ * `dst[r, 0..width) = src[r, offset..offset+width)` for every row.
45
+ *
46
+ * @param pipeline a pipeline built from {@link COL_SLICE_WGSL} / {@link COL_SLICE_ENTRY}
47
+ * @param rows batch * seqLen
48
+ * @param stride source row width (the fused projection's output features)
49
+ */
50
+ export function dispatchColumnSlice(
51
+ device: GPUDevice,
52
+ pipeline: GPUComputePipeline,
53
+ src: GPUBuffer,
54
+ dst: GPUBuffer,
55
+ rows: number,
56
+ stride: number,
57
+ offset: number,
58
+ width: number,
59
+ ): void {
60
+ const pBuf = createUniformBuffer(device, new Uint32Array([rows, stride, offset, width]).buffer);
61
+ const bg = createBindGroup(device, pipeline, [pBuf, src, dst]);
62
+ dispatchKernel(device, pipeline, bg, [cdiv(rows * width, 256), 1, 1]);
63
+ pBuf.destroy();
64
+ }
@@ -79,6 +79,20 @@ fn adamw_update(
79
79
 
80
80
  // Gradient clipping kernel – clips global gradient norm to max_norm.
81
81
  // Run before weight updates. Two-pass: first compute squared norm, then scale.
82
+ //
83
+ // The accumulator is a REAL atomic. It used to be a plain `array<f32>` written as
84
+ // `norm_sq[0] = norm_sq[0] + local_sq[0]` by the lane-0 invocation of every
85
+ // workgroup — a read-modify-write with no synchronisation, so with more than one
86
+ // workgroup (i.e. any tensor above 256 elements) concurrent workgroups lost each
87
+ // other's contributions and the norm came out too SMALL, under-clipping exactly
88
+ // when clipping matters most. WGSL has no `atomic<f32>`, so the accumulator is an
89
+ // `atomic<u32>` holding the f32 bit pattern and updated with a
90
+ // compare-exchange loop — the standard portable float-atomic-add.
91
+ //
92
+ // Summation ORDER across workgroups is not deterministic (floating-point addition
93
+ // is not associative), so the norm can differ in the last ulp or two between runs.
94
+ // That is fine for a clip threshold and is the accepted trade for correctness;
95
+ // nothing downstream depends on a bit-exact norm.
82
96
  export const GRAD_CLIP_WGSL: string = /* wgsl */`
83
97
 
84
98
  struct ClipParams {
@@ -88,10 +102,23 @@ struct ClipParams {
88
102
 
89
103
  @group(0) @binding(0) var<uniform> clip_p : ClipParams;
90
104
  @group(0) @binding(1) var<storage, read_write> grad : array<f32>;
91
- @group(0) @binding(2) var<storage, read_write> norm_sq : array<f32>; // size 1, atomic accumulator
105
+ // size 1 – the f32 bit pattern of the accumulated sum of squares, updated
106
+ // atomically. Zero-initialise it by writing 0.0f (bit pattern 0x00000000).
107
+ @group(0) @binding(2) var<storage, read_write> norm_sq : array<atomic<u32>>;
92
108
 
93
109
  var<workgroup> local_sq : array<f32, 256>;
94
110
 
111
+ // Portable atomic add on an f32 stored as its u32 bit pattern.
112
+ fn atomic_add_f32(value: f32) {
113
+ var old_bits : u32 = atomicLoad(&norm_sq[0]);
114
+ loop {
115
+ let new_bits = bitcast<u32>(bitcast<f32>(old_bits) + value);
116
+ let res = atomicCompareExchangeWeak(&norm_sq[0], old_bits, new_bits);
117
+ if (res.exchanged) { break; }
118
+ old_bits = res.old_value;
119
+ }
120
+ }
121
+
95
122
  // Pass 1: reduce sum of squares into norm_sq[0]
96
123
  @compute @workgroup_size(256, 1, 1)
97
124
  fn grad_norm_reduce(
@@ -117,8 +144,7 @@ fn grad_norm_reduce(
117
144
  }
118
145
 
119
146
  if (lid == 0u) {
120
- // Non-atomic accumulation (single workgroup assumption for small models)
121
- norm_sq[0] = norm_sq[0] + local_sq[0];
147
+ atomic_add_f32(local_sq[0]);
122
148
  }
123
149
  }
124
150
 
@@ -130,7 +156,7 @@ fn grad_clip_scale(
130
156
  let i = gid.x;
131
157
  if (i >= clip_p.num_elements) { return; }
132
158
 
133
- let ns = norm_sq[0];
159
+ let ns = bitcast<f32>(atomicLoad(&norm_sq[0]));
134
160
  if (ns > clip_p.max_norm_sq) {
135
161
  let scale = sqrt(clip_p.max_norm_sq / ns);
136
162
  grad[i] = grad[i] * scale;