@oasys/oecs 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/core/ecs/ecs_memory.d.cts +6 -6
  3. package/dist/core/ecs/ecs_memory.d.ts +6 -6
  4. package/dist/core/ecs/ecs_memory.d.ts.map +1 -1
  5. package/dist/core/store/allocator.d.cts +44 -19
  6. package/dist/core/store/allocator.d.ts +44 -19
  7. package/dist/core/store/allocator.d.ts.map +1 -1
  8. package/dist/core/store/column_store.d.cts +1 -1
  9. package/dist/core/store/column_store.d.ts +1 -1
  10. package/dist/core/store/extend.d.ts.map +1 -1
  11. package/dist/core/store/grow.d.ts.map +1 -1
  12. package/dist/core/store/layout_ops.d.cts +18 -0
  13. package/dist/core/store/layout_ops.d.ts +18 -0
  14. package/dist/core/store/layout_ops.d.ts.map +1 -1
  15. package/dist/{host_commands-BI8pEmjH.js → host_commands-3jyFfWNg.js} +2 -2
  16. package/dist/{host_commands-CxhpzMx9.cjs → host_commands-DNf0f6ko.cjs} +1 -1
  17. package/dist/index.cjs +1 -1
  18. package/dist/index.d.cts +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.development.cjs +1 -1
  21. package/dist/index.development.js +197 -194
  22. package/dist/index.js +195 -192
  23. package/dist/{internal-BMDgWZbt.js → internal-C9jjL90H.js} +2 -2
  24. package/dist/{internal-LiTSB_tG.cjs → internal-RZN14uMw.cjs} +2 -2
  25. package/dist/internal.cjs +1 -1
  26. package/dist/internal.development.cjs +1 -1
  27. package/dist/internal.development.js +1 -1
  28. package/dist/internal.js +1 -1
  29. package/dist/shared-BMXh9hxm.cjs +1 -0
  30. package/dist/{shared-BU1Cd40h.js → shared-DQKK0i-E.js} +38 -32
  31. package/dist/shared.cjs +1 -1
  32. package/dist/shared.d.cts +1 -1
  33. package/dist/shared.d.ts +1 -1
  34. package/dist/shared.development.cjs +1 -1
  35. package/dist/shared.development.js +1 -1
  36. package/dist/shared.js +1 -1
  37. package/dist/version.d.cts +1 -1
  38. package/dist/version.d.ts +1 -1
  39. package/package.json +1 -1
  40. package/dist/shared-BymrGTyR.cjs +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,34 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.3] — 2026-07-09
9
+
10
+ ### Fixed — heap columns back on V8's fast element-access path (~5× iteration)
11
+
12
+ - The pure-TS **heap profile** (`heapArraybufferAllocator` — the default backing)
13
+ now reserves its store as a **fixed, non-resizable `ArrayBuffer`** at the full
14
+ cap instead of a growable one resized via `.resize()`. V8 has no fast
15
+ element-access path for TypedArray views over a **resizable/growable**
16
+ `ArrayBuffer` — every `col[i]` re-checks the mutable length — so iterating a
17
+ column was ~4× slower than over a fixed buffer (measured on V8 13.6, an
18
+ isolated `col[i] *= 2` loop: ~0.37G vs ~1.6G element-accesses/s). This
19
+ silently regressed every iteration-bound system ~5× from 0.3.x (a
20
+ cross-library bench had oecs at ~85k op/s on the `packed_5` scenario vs
21
+ ~407k at 0.3.1); 0.5.3 restores it (~420k, measured against 0.5.2 in a
22
+ same-toolchain A/B: 85.9k → 422.7k op/s).
23
+ - The fixed buffer faults pages in lazily, so RSS tracks real use, not the
24
+ reservation (a 256 MiB default cap on a 1000-entity world stays a few MiB
25
+ resident — measured ~4 MiB RSS, within ~1 MiB of the old resizable buffer).
26
+ Growth remains in place: the store relocates columns within the pre-reserved
27
+ buffer, so the buffer identity never changes and every existing view stays
28
+ valid —
29
+ `isInPlace: true` and ADR-0008's entity-index-hoist-across-grow invariant hold
30
+ unchanged. The store keys its tail cursor off the header `capacity` (the
31
+ logical high-water) rather than `buffer.byteLength` (now always the cap).
32
+ - Only the heap backing changed. The `growable_sab` / `wasm_memory` backings
33
+ keep their resizable buffers and page-rounded tail layout byte-for-byte
34
+ (their determinism/layout goldens are unchanged).
35
+
8
36
  ## [0.5.2] — 2026-07-08
9
37
 
10
38
  ### Added — a guards-on build and an explicit dev entry
@@ -43,12 +43,12 @@ export type WasmMemoryArm = {
43
43
  readonly initialPages?: number;
44
44
  readonly memory?: never;
45
45
  };
46
- /** Pure-TS **heap** backing (#643 / ADR-0018 §1B): a plain resizable
47
- * `ArrayBuffer` instead of a `SharedArrayBuffer`. Needs no cross-origin
48
- * isolation (COOP/COEP) and is the intended default for embedders that can't
49
- * set those headers (the oecs profile). Trade-off: no worker offload and no
50
- * WASM compute backend — both require a transferable `SharedArrayBuffer`. An
51
- * empty `{}` takes the default 256 MiB growable cap. */
46
+ /** Pure-TS **heap** backing (#643 / ADR-0018 §1B): a plain fixed (non-resizable)
47
+ * `ArrayBuffer` reserved at the cap up front, instead of a `SharedArrayBuffer`.
48
+ * Needs no cross-origin isolation (COOP/COEP) and is the intended default for
49
+ * embedders that can't set those headers (the oecs profile). Trade-off: no
50
+ * worker offload and no WASM compute backend — both require a transferable
51
+ * `SharedArrayBuffer`. An empty `{}` takes the default 256 MiB cap. */
52
52
  export interface HeapMemoryArm {
53
53
  /** Byte ceiling of the growable heap backing. Default
54
54
  * `DEFAULT_ECS_CAP_BYTES` (256 MiB), same hard-ceiling semantics as the
@@ -43,12 +43,12 @@ export type WasmMemoryArm = {
43
43
  readonly initialPages?: number;
44
44
  readonly memory?: never;
45
45
  };
46
- /** Pure-TS **heap** backing (#643 / ADR-0018 §1B): a plain resizable
47
- * `ArrayBuffer` instead of a `SharedArrayBuffer`. Needs no cross-origin
48
- * isolation (COOP/COEP) and is the intended default for embedders that can't
49
- * set those headers (the oecs profile). Trade-off: no worker offload and no
50
- * WASM compute backend — both require a transferable `SharedArrayBuffer`. An
51
- * empty `{}` takes the default 256 MiB growable cap. */
46
+ /** Pure-TS **heap** backing (#643 / ADR-0018 §1B): a plain fixed (non-resizable)
47
+ * `ArrayBuffer` reserved at the cap up front, instead of a `SharedArrayBuffer`.
48
+ * Needs no cross-origin isolation (COOP/COEP) and is the intended default for
49
+ * embedders that can't set those headers (the oecs profile). Trade-off: no
50
+ * worker offload and no WASM compute backend — both require a transferable
51
+ * `SharedArrayBuffer`. An empty `{}` takes the default 256 MiB cap. */
52
52
  export interface HeapMemoryArm {
53
53
  /** Byte ceiling of the growable heap backing. Default
54
54
  * `DEFAULT_ECS_CAP_BYTES` (256 MiB), same hard-ceiling semantics as the
@@ -1 +1 @@
1
- {"version":3,"file":"ecs_memory.d.ts","sourceRoot":"","sources":["../../../src/core/ecs/ecs_memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ecs_memory.d.ts","sourceRoot":"","sources":["../../../src/core/ecs/ecs_memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAON,KAAK,sBAAsB,EAC3B,MAAM,UAAU,CAAC;AAQlB;;sEAEsE;AACtE,eAAO,MAAM,qBAAqB,QAAY,CAAC;AAE/C;;qEAEqE;AACrE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;4EAC4E;AAC5E,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD;;;kCAGkC;AAClC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAO3C;;iDAEiD;AACjD,MAAM,WAAW,YAAY;IAC5B;6DACyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;8CAC0C;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;oDACgD;IAChD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;4CAI4C;AAC5C,MAAM,MAAM,aAAa,GACtB;IACA,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;CAC7B,GACD;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAE9F;;;;;uEAKuE;AACvE,MAAM,WAAW,aAAa;IAC7B;;6BAEyB;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;iFAGiF;AACjF,MAAM,WAAW,eAAe;IAC/B;2EACuE;IACvE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;gCAEgC;AAChC,UAAU,iBAAiB;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GACzB,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;CACvB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;CACvB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;CACvB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;CACvB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;CACrB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACD;;;;oBAIgB;IAChB,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C;4DACwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;CACvB,GAAG,iBAAiB,CAAC,GACtB,CAAC;IACD;;yCAEqC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;CACvB,GAAG,iBAAiB,CAAC,CAAC;AAE1B;;6DAE6D;AAC7D,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC/F,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC;;oDAEgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;gEAC4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;wDACoD;IACpD,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,qEAAqE;IACrE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;2EAEuE;IACvE,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC;CAC/C;AAED;qBACqB;AACrB,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAkBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,CA4R3E"}
@@ -58,10 +58,11 @@ export interface BufferAllocator {
58
58
  /** Returns a buffer of byteLength >= `bytes`. The historical name is
59
59
  * "SAB", but the return is `ArrayBufferLike`: `growableSabAllocator` /
60
60
  * `wasmMemoryAllocator` produce a `SharedArrayBuffer` (the SAB profile),
61
- * while `heapArraybufferAllocator` produces a plain resizable
62
- * `ArrayBuffer` (the pure-TS heap profile — no cross-origin isolation
63
- * required). The store layer treats the backing uniformly; only the
64
- * WASM/worker boundary narrows back to `SharedArrayBuffer`. */
61
+ * while `heapArraybufferAllocator` produces a plain fixed (non-resizable)
62
+ * `ArrayBuffer` reserved at the cap (the pure-TS heap profile — no
63
+ * cross-origin isolation required). The store layer treats the backing
64
+ * uniformly; only the WASM/worker boundary narrows back to
65
+ * `SharedArrayBuffer`. */
65
66
  (bytes: number): ArrayBufferLike;
66
67
  readonly isInPlace?: boolean;
67
68
  }
@@ -74,9 +75,11 @@ export interface BufferAllocator {
74
75
  * return it; `DEFAULT_SAB_ALLOCATOR` keeps the wide `BufferAllocator` type and
75
76
  * therefore cannot typecheck where a live-Store backing is required. Non-in-place
76
77
  * allocators remain valid for snapshot/test sizing only. The brand says nothing
77
- * about *shared* vs *heap* backing — `heapArraybufferAllocator`'s resizable
78
- * `ArrayBuffer` is just as in-place as a growable SAB (`.resize()` preserves
79
- * existing views exactly like `SharedArrayBuffer.prototype.grow`).
78
+ * about *shared* vs *heap* backing — `heapArraybufferAllocator`'s fixed
79
+ * `ArrayBuffer` is just as in-place as a growable SAB: it is reserved at the full
80
+ * cap up front and never moves, so grow/extend relocate columns *within* it
81
+ * (`copyWithin`) rather than resizing the buffer — existing views stay valid, the
82
+ * same guarantee `SharedArrayBuffer.prototype.grow` gives by resizing in place.
80
83
  */
81
84
  export type InPlaceBufferAllocator = BufferAllocator & {
82
85
  readonly isInPlace: true;
@@ -177,20 +180,42 @@ export declare const DEFAULT_SAB_ALLOCATOR: BufferAllocator;
177
180
  */
178
181
  export declare function growableSabAllocator(maxBytes?: number): InPlaceBufferAllocator;
179
182
  /**
180
- * Allocator that backs the store by a single growable **plain `ArrayBuffer`**
181
- * (created with `{ maxByteLength: maxBytes }`, grown via `.resize()`). This is
182
- * the pure-TS **heap profile** — the oecs default and the answer to ADR-0018's
183
+ * Allocator that backs the store by a single **fixed (non-resizable) plain
184
+ * `ArrayBuffer`** reserved at the full `maxBytes` cap up front. This is the
185
+ * pure-TS **heap profile** — the oecs default and the answer to ADR-0018's
183
186
  * deferred §1B: no `SharedArrayBuffer`, hence no cross-origin isolation
184
187
  * (COOP/COEP) requirement, and no worker/WASM transfer (single-process worlds
185
- * only). Otherwise identical to `growableSabAllocator`:
186
- *
187
- * - `isInPlace: true`. A resizable `ArrayBuffer`'s `.resize()` keeps the
188
- * same buffer object and preserves existing TypedArray/DataView views, so
189
- * the store's `extend`/`grow` fast path carries column views forward
190
- * unchanged exactly as `SharedArrayBuffer.prototype.grow` does. ADR-0008's
191
- * entity-index-hoist-across-grow invariant holds identically.
192
- * - same 256 MiB default cap with hard-ceiling semantics (#380): reaching it
193
- * signals runaway growth upstream, not a limit to route around.
188
+ * only).
189
+ *
190
+ * WHY FIXED, NOT RESIZABLE (the 0.5.3 iteration-perf fix): V8 has no fast
191
+ * element-access path for TypedArray views over a **resizable/growable**
192
+ * `ArrayBuffer` — every `col[i]` re-checks bounds against the buffer's mutable
193
+ * length, a ~4× per-element tax measured on V8 13.6 (an isolated `col[i] *= 2`
194
+ * loop: fixed `ArrayBuffer` ~1.6G vs a view over a resizable buffer ~0.37G
195
+ * element-accesses/s). oecs 0.3.x gave each column its own fixed buffer and sat
196
+ * mid-pack among SoA ECS libs; the 0.5.0 switch to one resizable arena silently
197
+ * regressed all iteration-bound systems ~5× (the cross-library `packed_5`
198
+ * scenario: 0.5.2 ~86k op/s → 0.5.3 ~420k). A fixed buffer restores the fast path.
199
+ *
200
+ * How growth still works in place: the cap is reserved as one fixed buffer at
201
+ * construction. A resizable buffer was originally chosen so `.resize()` could
202
+ * grow in place without moving views; a fixed buffer never moves EITHER — the
203
+ * store's grow/extend relocate columns to the tail *within* this buffer
204
+ * (`copyWithin`), so the buffer object and every existing view stay valid.
205
+ * `isInPlace: true` therefore still holds, and ADR-0008's
206
+ * entity-index-hoist-across-grow invariant is preserved. The store keys its
207
+ * tail cursor off the header `capacity` (the logical high-water), NOT
208
+ * `buffer.byteLength` — which is now always `maxBytes` (the same decoupling the
209
+ * wasm page-rounded allocator already relied on).
210
+ *
211
+ * - Memory cost is unchanged: a fixed `ArrayBuffer(maxBytes)` faults pages in
212
+ * lazily (untouched pages cost no RSS), exactly like the resizable buffer's
213
+ * `maxByteLength` reservation — a 256 MiB reservation on a 1000-entity world
214
+ * stays a few MiB resident (measured ~4 MiB RSS, within ~1 MiB of the old
215
+ * resizable buffer).
216
+ * - same 256 MiB default cap with hard-ceiling semantics (#380): a request
217
+ * past `maxBytes` throws `StoreCapExceededError` — runaway growth signal,
218
+ * not a limit to route around.
194
219
  *
195
220
  * Why a non-shared buffer suffices: `Atomics` live only on the cross-thread
196
221
  * command/event/action rings, never on the core store path, so a single-process
@@ -58,10 +58,11 @@ export interface BufferAllocator {
58
58
  /** Returns a buffer of byteLength >= `bytes`. The historical name is
59
59
  * "SAB", but the return is `ArrayBufferLike`: `growableSabAllocator` /
60
60
  * `wasmMemoryAllocator` produce a `SharedArrayBuffer` (the SAB profile),
61
- * while `heapArraybufferAllocator` produces a plain resizable
62
- * `ArrayBuffer` (the pure-TS heap profile — no cross-origin isolation
63
- * required). The store layer treats the backing uniformly; only the
64
- * WASM/worker boundary narrows back to `SharedArrayBuffer`. */
61
+ * while `heapArraybufferAllocator` produces a plain fixed (non-resizable)
62
+ * `ArrayBuffer` reserved at the cap (the pure-TS heap profile — no
63
+ * cross-origin isolation required). The store layer treats the backing
64
+ * uniformly; only the WASM/worker boundary narrows back to
65
+ * `SharedArrayBuffer`. */
65
66
  (bytes: number): ArrayBufferLike;
66
67
  readonly isInPlace?: boolean;
67
68
  }
@@ -74,9 +75,11 @@ export interface BufferAllocator {
74
75
  * return it; `DEFAULT_SAB_ALLOCATOR` keeps the wide `BufferAllocator` type and
75
76
  * therefore cannot typecheck where a live-Store backing is required. Non-in-place
76
77
  * allocators remain valid for snapshot/test sizing only. The brand says nothing
77
- * about *shared* vs *heap* backing — `heapArraybufferAllocator`'s resizable
78
- * `ArrayBuffer` is just as in-place as a growable SAB (`.resize()` preserves
79
- * existing views exactly like `SharedArrayBuffer.prototype.grow`).
78
+ * about *shared* vs *heap* backing — `heapArraybufferAllocator`'s fixed
79
+ * `ArrayBuffer` is just as in-place as a growable SAB: it is reserved at the full
80
+ * cap up front and never moves, so grow/extend relocate columns *within* it
81
+ * (`copyWithin`) rather than resizing the buffer — existing views stay valid, the
82
+ * same guarantee `SharedArrayBuffer.prototype.grow` gives by resizing in place.
80
83
  */
81
84
  export type InPlaceBufferAllocator = BufferAllocator & {
82
85
  readonly isInPlace: true;
@@ -177,20 +180,42 @@ export declare const DEFAULT_SAB_ALLOCATOR: BufferAllocator;
177
180
  */
178
181
  export declare function growableSabAllocator(maxBytes?: number): InPlaceBufferAllocator;
179
182
  /**
180
- * Allocator that backs the store by a single growable **plain `ArrayBuffer`**
181
- * (created with `{ maxByteLength: maxBytes }`, grown via `.resize()`). This is
182
- * the pure-TS **heap profile** — the oecs default and the answer to ADR-0018's
183
+ * Allocator that backs the store by a single **fixed (non-resizable) plain
184
+ * `ArrayBuffer`** reserved at the full `maxBytes` cap up front. This is the
185
+ * pure-TS **heap profile** — the oecs default and the answer to ADR-0018's
183
186
  * deferred §1B: no `SharedArrayBuffer`, hence no cross-origin isolation
184
187
  * (COOP/COEP) requirement, and no worker/WASM transfer (single-process worlds
185
- * only). Otherwise identical to `growableSabAllocator`:
186
- *
187
- * - `isInPlace: true`. A resizable `ArrayBuffer`'s `.resize()` keeps the
188
- * same buffer object and preserves existing TypedArray/DataView views, so
189
- * the store's `extend`/`grow` fast path carries column views forward
190
- * unchanged exactly as `SharedArrayBuffer.prototype.grow` does. ADR-0008's
191
- * entity-index-hoist-across-grow invariant holds identically.
192
- * - same 256 MiB default cap with hard-ceiling semantics (#380): reaching it
193
- * signals runaway growth upstream, not a limit to route around.
188
+ * only).
189
+ *
190
+ * WHY FIXED, NOT RESIZABLE (the 0.5.3 iteration-perf fix): V8 has no fast
191
+ * element-access path for TypedArray views over a **resizable/growable**
192
+ * `ArrayBuffer` — every `col[i]` re-checks bounds against the buffer's mutable
193
+ * length, a ~4× per-element tax measured on V8 13.6 (an isolated `col[i] *= 2`
194
+ * loop: fixed `ArrayBuffer` ~1.6G vs a view over a resizable buffer ~0.37G
195
+ * element-accesses/s). oecs 0.3.x gave each column its own fixed buffer and sat
196
+ * mid-pack among SoA ECS libs; the 0.5.0 switch to one resizable arena silently
197
+ * regressed all iteration-bound systems ~5× (the cross-library `packed_5`
198
+ * scenario: 0.5.2 ~86k op/s → 0.5.3 ~420k). A fixed buffer restores the fast path.
199
+ *
200
+ * How growth still works in place: the cap is reserved as one fixed buffer at
201
+ * construction. A resizable buffer was originally chosen so `.resize()` could
202
+ * grow in place without moving views; a fixed buffer never moves EITHER — the
203
+ * store's grow/extend relocate columns to the tail *within* this buffer
204
+ * (`copyWithin`), so the buffer object and every existing view stay valid.
205
+ * `isInPlace: true` therefore still holds, and ADR-0008's
206
+ * entity-index-hoist-across-grow invariant is preserved. The store keys its
207
+ * tail cursor off the header `capacity` (the logical high-water), NOT
208
+ * `buffer.byteLength` — which is now always `maxBytes` (the same decoupling the
209
+ * wasm page-rounded allocator already relied on).
210
+ *
211
+ * - Memory cost is unchanged: a fixed `ArrayBuffer(maxBytes)` faults pages in
212
+ * lazily (untouched pages cost no RSS), exactly like the resizable buffer's
213
+ * `maxByteLength` reservation — a 256 MiB reservation on a 1000-entity world
214
+ * stays a few MiB resident (measured ~4 MiB RSS, within ~1 MiB of the old
215
+ * resizable buffer).
216
+ * - same 256 MiB default cap with hard-ceiling semantics (#380): a request
217
+ * past `maxBytes` throws `StoreCapExceededError` — runaway growth signal,
218
+ * not a limit to route around.
194
219
  *
195
220
  * Why a non-shared buffer suffices: `Atomics` live only on the cross-thread
196
221
  * command/event/action rings, never on the core store path, so a single-process
@@ -1 +1 @@
1
- {"version":3,"file":"allocator.d.ts","sourceRoot":"","sources":["../../../src/core/store/allocator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,eAAe;IAC/B;;;;;;mEAM+D;IAC/D,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC;AAEpF;;;;;;;GAOG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG9B,cAAc,EAAE,MAAM;IACtC;6DACyD;aACzC,QAAQ,EAAE,MAAM,GAAG,IAAI;gBAJvC,OAAO,EAAE,MAAM,EACC,cAAc,EAAE,MAAM;IACtC;6DACyD;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvC,OAAO,CAAC,EAAE,YAAY;CAKvB;AAED;;;;;;oEAMoE;AACpE,qBAAa,mBAAoB,SAAQ,KAAK;;CAe7C;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,eAGnC,CAAC;AA+DF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,MAA0B,GAAG,sBAAsB,CA6BjG;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,GAAE,MAA0B,GAClC,sBAAsB,CAuBxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,GAAG,sBAAsB,CA6DtF"}
1
+ {"version":3,"file":"allocator.d.ts","sourceRoot":"","sources":["../../../src/core/store/allocator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,eAAe;IAC/B;;;;;;;8BAO0B;IAC1B,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAA;CAAE,CAAC;AAEpF;;;;;;;GAOG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aAG9B,cAAc,EAAE,MAAM;IACtC;6DACyD;aACzC,QAAQ,EAAE,MAAM,GAAG,IAAI;gBAJvC,OAAO,EAAE,MAAM,EACC,cAAc,EAAE,MAAM;IACtC;6DACyD;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvC,OAAO,CAAC,EAAE,YAAY;CAKvB;AAED;;;;;;oEAMoE;AACpE,qBAAa,mBAAoB,SAAQ,KAAK;;CAe7C;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,EAAE,eAGnC,CAAC;AAgEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,MAA0B,GAAG,sBAAsB,CA6BjG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,GAAE,MAA0B,GAClC,sBAAsB,CAsBxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,GAAG,sBAAsB,CA6DtF"}
@@ -51,7 +51,7 @@ export interface ArchetypeViews {
51
51
  }
52
52
  export interface ColumnStore {
53
53
  /** The backing buffer. `ArrayBufferLike` because the store is backing-agnostic:
54
- * a `SharedArrayBuffer` for the SAB/WASM/worker profile, or a plain resizable
54
+ * a `SharedArrayBuffer` for the SAB/WASM/worker profile, or a plain fixed
55
55
  * `ArrayBuffer` for the pure-TS heap profile (`heapArraybufferAllocator`).
56
56
  * Consumers that genuinely require sharing (worker transfer, WASM memory)
57
57
  * narrow back to `SharedArrayBuffer` at their boundary. */
@@ -51,7 +51,7 @@ export interface ArchetypeViews {
51
51
  }
52
52
  export interface ColumnStore {
53
53
  /** The backing buffer. `ArrayBufferLike` because the store is backing-agnostic:
54
- * a `SharedArrayBuffer` for the SAB/WASM/worker profile, or a plain resizable
54
+ * a `SharedArrayBuffer` for the SAB/WASM/worker profile, or a plain fixed
55
55
  * `ArrayBuffer` for the pure-TS heap profile (`heapArraybufferAllocator`).
56
56
  * Consumers that genuinely require sharing (worker transfer, WASM memory)
57
57
  * narrow back to `SharedArrayBuffer` at their boundary. */
@@ -1 +1 @@
1
- {"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../../../src/core/store/extend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAEN,KAAK,aAAa,EAElB,KAAK,WAAW,EAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,OAAO,EAIN,KAAK,iBAAiB,EAEtB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,UAAU;IAC1B;gEAC4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACjD;;oEAEgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;;2EAKuE;IACvE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CACjC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI3B;AAED;;;;;;;;;sCASsC;AACtC,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,SAAS,CAAC,EAAE,eAAe,GACzB,YAAY,CAoId"}
1
+ {"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../../../src/core/store/extend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAEN,KAAK,aAAa,EAElB,KAAK,WAAW,EAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,OAAO,EAKN,KAAK,iBAAiB,EAEtB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,UAAU;IAC1B;gEAC4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACjD;;oEAEgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;;2EAKuE;IACvE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CACjC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI3B;AAED;;;;;;;;;sCASsC;AACtC,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,UAAU,EAChB,SAAS,CAAC,EAAE,eAAe,GACzB,YAAY,CAoId"}
@@ -1 +1 @@
1
- {"version":3,"file":"grow.d.ts","sourceRoot":"","sources":["../../../src/core/store/grow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AASH,OAAO,EAIN,KAAK,WAAW,EAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAIN,KAAK,iBAAiB,EAEtB,MAAM,cAAc,CAAC;AAMtB,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAED;mEACmE;AACnE,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;6DAGyD;IACzD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC;2BACuB;IACvB,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAyJD,qBAAa,cAAe,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI3B;AAED;;;;;;sEAMsE;AACtE,wBAAgB,eAAe,CAC9B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,QAAQ,EACd,SAAS,CAAC,EAAE,eAAe,GACzB,UAAU,CAmGZ"}
1
+ {"version":3,"file":"grow.d.ts","sourceRoot":"","sources":["../../../src/core/store/grow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AASH,OAAO,EAIN,KAAK,WAAW,EAGhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAKN,KAAK,iBAAiB,EAEtB,MAAM,cAAc,CAAC;AAMtB,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAED;mEACmE;AACnE,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;6DAGyD;IACzD,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC;2BACuB;IACvB,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AA4JD,qBAAa,cAAe,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI3B;AAED;;;;;;sEAMsE;AACtE,wBAAgB,eAAe,CAC9B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,QAAQ,EACd,SAAS,CAAC,EAAE,eAAe,GACzB,UAAU,CAmGZ"}
@@ -50,6 +50,24 @@ export declare function growBufferInPlace(old: ColumnStoreInternal, newTotal: nu
50
50
  grownBuffer: ArrayBufferLike;
51
51
  newView: DataView;
52
52
  };
53
+ /**
54
+ * Byte offset where the next appended column region begins — the tail cursor
55
+ * the in-place grow/extend paths pass to `layoutColumnsAtTail`.
56
+ *
57
+ * For the growable-SAB and wasm backings the buffer is sized to the live extent
58
+ * (`SharedArrayBuffer.grow` resizes exactly; wasm rounds up to a page, and its
59
+ * fast path deliberately lands new regions past that page-rounded tail), so
60
+ * `buffer.byteLength` IS the tail. For the pure-TS **heap** backing (0.5.3) the
61
+ * buffer is a FIXED `ArrayBuffer` reserved at the full cap for V8 fast-path
62
+ * element access, so its `byteLength` is `maxBytes`, NOT the used size — the
63
+ * true tail is the header `capacity` (the logical high-water; new columns land
64
+ * in still-zero fixed-buffer space just past the last live column).
65
+ *
66
+ * A plain (non-shared) `ArrayBuffer` is uniquely the heap profile's fixed
67
+ * reservation — every other in-place backing is a `SharedArrayBuffer`. Keying
68
+ * off the backing keeps the SAB/wasm layouts byte-for-byte unchanged.
69
+ */
70
+ export declare function tailCursorBytes(old: ColumnStoreInternal): number;
53
71
  /**
54
72
  * Derive `CreateColumnStoreOptions` from an old ColumnStore so a slow-path realloc
55
73
  * preserves the same set of optional regions at the same byte offsets in the
@@ -50,6 +50,24 @@ export declare function growBufferInPlace(old: ColumnStoreInternal, newTotal: nu
50
50
  grownBuffer: ArrayBufferLike;
51
51
  newView: DataView;
52
52
  };
53
+ /**
54
+ * Byte offset where the next appended column region begins — the tail cursor
55
+ * the in-place grow/extend paths pass to `layoutColumnsAtTail`.
56
+ *
57
+ * For the growable-SAB and wasm backings the buffer is sized to the live extent
58
+ * (`SharedArrayBuffer.grow` resizes exactly; wasm rounds up to a page, and its
59
+ * fast path deliberately lands new regions past that page-rounded tail), so
60
+ * `buffer.byteLength` IS the tail. For the pure-TS **heap** backing (0.5.3) the
61
+ * buffer is a FIXED `ArrayBuffer` reserved at the full cap for V8 fast-path
62
+ * element access, so its `byteLength` is `maxBytes`, NOT the used size — the
63
+ * true tail is the header `capacity` (the logical high-water; new columns land
64
+ * in still-zero fixed-buffer space just past the last live column).
65
+ *
66
+ * A plain (non-shared) `ArrayBuffer` is uniquely the heap profile's fixed
67
+ * reservation — every other in-place backing is a `SharedArrayBuffer`. Keying
68
+ * off the backing keeps the SAB/wasm layouts byte-for-byte unchanged.
69
+ */
70
+ export declare function tailCursorBytes(old: ColumnStoreInternal): number;
53
71
  /**
54
72
  * Derive `CreateColumnStoreOptions` from an old ColumnStore so a slow-path realloc
55
73
  * preserves the same set of optional regions at the same byte offsets in the
@@ -1 +1 @@
1
- {"version":3,"file":"layout_ops.d.ts","sourceRoot":"","sources":["../../../src/core/store/layout_ops.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layout_ops.d.ts","sourceRoot":"","sources":["../../../src/core/store/layout_ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAMN,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAoB,YAAY,EAAE,MAAM,cAAc,CAAC;AAGxF,OAAO,EAGN,KAAK,sBAAsB,EAC3B,MAAM,iBAAiB,CAAC;AAEzB;;;yDAGyD;AACzD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED;;8EAE8E;AAC9E,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAC7D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS;QAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;QAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACxB,EAAE,CAAC;CACJ;AAED;;;;;;;;6BAQ6B;AAC7B,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,SAAS,mBAAmB,EAAE,GACxC;IAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CA+B1D;AAED;;;;;;;+BAO+B;AAC/B,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,mBAAmB,EACxB,QAAQ,EAAE,MAAM,GACd;IAAE,WAAW,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CAIrD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAKhE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,wBAAwB,CAwCzE;AAED;;;;6BAI6B;AAC7B,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;IAC5D,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,oBAAoB,CAsB5E;AAED;;;;mFAImF;AACnF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAc5F;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,WAAW,EAChB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAmB3B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,GAClC,IAAI,CAeN;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,SAAS,EAAE,eAAe,GAAG,SAAS,GACpC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAmBpE"}
@@ -1,5 +1,5 @@
1
1
  import { S as et, t as tt } from "./topological_sort-DK6EjpWa.js";
2
- import { D as nt, h as K, w as we, g as st } from "./shared-BU1Cd40h.js";
2
+ import { D as nt, h as K, w as we, g as st } from "./shared-DQKK0i-E.js";
3
3
  class Be extends Error {
4
4
  constructor(t, n, r) {
5
5
  super(t), this.isOperational = n, this.context = r, this.name = this.constructor.name, Error.captureStackTrace(this, this.constructor);
@@ -1906,7 +1906,7 @@ function as(e) {
1906
1906
  intentLabel: `pure-TS heap backing (${I(s)} growable cap, no SharedArrayBuffer)`,
1907
1907
  budgetEntities: null,
1908
1908
  derivation: [
1909
- `backing = heap_arraybuffer_allocator(${I(s)}) — resizable ArrayBuffer, no SAB / no COOP+COEP (is_in_place ✓)`,
1909
+ `backing = heap_arraybuffer_allocator(${I(s)}) — fixed ArrayBuffer reserved at the cap, no SAB / no COOP+COEP (is_in_place ✓)`,
1910
1910
  "trade-off: no worker offload / no WASM backend (both need a transferable SharedArrayBuffer)",
1911
1911
  `column_capacity = ${o} (${n !== void 0 ? "pinned" : "default"})`,
1912
1912
  `entity_index = floor_pow2(cap/4 ÷ ${D} B) = ${i} slots`