@forgeax/engine-ecs 0.0.0-dev.8d955ade1c79

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 (383) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +278 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__fixtures__/field-shape-fixture.d.ts +16 -0
  5. package/dist/__fixtures__/field-shape-fixture.d.ts.map +1 -0
  6. package/dist/__tests__/__fixtures__/inspect-scripts.snapshot.d.ts +3 -0
  7. package/dist/__tests__/__fixtures__/inspect-scripts.snapshot.d.ts.map +1 -0
  8. package/dist/__tests__/archetype.unit.test.d.ts +2 -0
  9. package/dist/__tests__/archetype.unit.test.d.ts.map +1 -0
  10. package/dist/__tests__/array-handle-element.test-d.d.ts +2 -0
  11. package/dist/__tests__/array-handle-element.test-d.d.ts.map +1 -0
  12. package/dist/__tests__/buffer-array-vocab.test-d.d.ts +2 -0
  13. package/dist/__tests__/buffer-array-vocab.test-d.d.ts.map +1 -0
  14. package/dist/__tests__/buffer-field-input-widen.unit.test.d.ts +2 -0
  15. package/dist/__tests__/buffer-field-input-widen.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/buffer-pool.test-d.d.ts +2 -0
  17. package/dist/__tests__/buffer-pool.test-d.d.ts.map +1 -0
  18. package/dist/__tests__/change-detection.unit.test.d.ts +2 -0
  19. package/dist/__tests__/change-detection.unit.test.d.ts.map +1 -0
  20. package/dist/__tests__/command-buffer.test.d.ts +2 -0
  21. package/dist/__tests__/command-buffer.test.d.ts.map +1 -0
  22. package/dist/__tests__/commands-deferred.unit.test.d.ts +2 -0
  23. package/dist/__tests__/commands-deferred.unit.test.d.ts.map +1 -0
  24. package/dist/__tests__/component-catalog.test.d.ts +2 -0
  25. package/dist/__tests__/component-catalog.test.d.ts.map +1 -0
  26. package/dist/__tests__/component-definition-identity.unit.test.d.ts +2 -0
  27. package/dist/__tests__/component-definition-identity.unit.test.d.ts.map +1 -0
  28. package/dist/__tests__/component-nan-preflight.unit.test.d.ts +2 -0
  29. package/dist/__tests__/component-nan-preflight.unit.test.d.ts.map +1 -0
  30. package/dist/__tests__/component-schema.test-d.d.ts +2 -0
  31. package/dist/__tests__/component-schema.test-d.d.ts.map +1 -0
  32. package/dist/__tests__/component-schema.test.d.ts +2 -0
  33. package/dist/__tests__/component-schema.test.d.ts.map +1 -0
  34. package/dist/__tests__/define-component-options.test-d.d.ts +2 -0
  35. package/dist/__tests__/define-component-options.test-d.d.ts.map +1 -0
  36. package/dist/__tests__/deprecated-vocab-rejection.unit.test.d.ts +2 -0
  37. package/dist/__tests__/deprecated-vocab-rejection.unit.test.d.ts.map +1 -0
  38. package/dist/__tests__/despawn-all.unit.test.d.ts +2 -0
  39. package/dist/__tests__/despawn-all.unit.test.d.ts.map +1 -0
  40. package/dist/__tests__/ecs-core-reduction.characterization.test.d.ts +2 -0
  41. package/dist/__tests__/ecs-core-reduction.characterization.test.d.ts.map +1 -0
  42. package/dist/__tests__/ecs-core-reduction.perf.test.d.ts +2 -0
  43. package/dist/__tests__/ecs-core-reduction.perf.test.d.ts.map +1 -0
  44. package/dist/__tests__/ecs-error-code-31.test-d.d.ts +2 -0
  45. package/dist/__tests__/ecs-error-code-31.test-d.d.ts.map +1 -0
  46. package/dist/__tests__/entity-disabling.unit.test.d.ts +2 -0
  47. package/dist/__tests__/entity-disabling.unit.test.d.ts.map +1 -0
  48. package/dist/__tests__/entity-handle-codec-parity.unit.test.d.ts +2 -0
  49. package/dist/__tests__/entity-handle-codec-parity.unit.test.d.ts.map +1 -0
  50. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  51. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  52. package/dist/__tests__/execution-conflict-boundary.unit.test.d.ts +2 -0
  53. package/dist/__tests__/execution-conflict-boundary.unit.test.d.ts.map +1 -0
  54. package/dist/__tests__/execution-shared-storage.unit.test.d.ts +2 -0
  55. package/dist/__tests__/execution-shared-storage.unit.test.d.ts.map +1 -0
  56. package/dist/__tests__/externalization-portable-value.unit.test.d.ts +2 -0
  57. package/dist/__tests__/externalization-portable-value.unit.test.d.ts.map +1 -0
  58. package/dist/__tests__/externalization-projection.unit.test.d.ts +2 -0
  59. package/dist/__tests__/externalization-projection.unit.test.d.ts.map +1 -0
  60. package/dist/__tests__/externalization-render-read-lease.test-d.d.ts +2 -0
  61. package/dist/__tests__/externalization-render-read-lease.test-d.d.ts.map +1 -0
  62. package/dist/__tests__/externalization-render-read-lease.unit.test.d.ts +2 -0
  63. package/dist/__tests__/externalization-render-read-lease.unit.test.d.ts.map +1 -0
  64. package/dist/__tests__/externalization-root-surface.unit.test.d.ts +2 -0
  65. package/dist/__tests__/externalization-root-surface.unit.test.d.ts.map +1 -0
  66. package/dist/__tests__/field-enum-labels-reflection.test.d.ts +2 -0
  67. package/dist/__tests__/field-enum-labels-reflection.test.d.ts.map +1 -0
  68. package/dist/__tests__/field-shape-fixture.test.d.ts +2 -0
  69. package/dist/__tests__/field-shape-fixture.test.d.ts.map +1 -0
  70. package/dist/__tests__/field-transient-reflection.test.d.ts +2 -0
  71. package/dist/__tests__/field-transient-reflection.test.d.ts.map +1 -0
  72. package/dist/__tests__/field-value-type.test-d.d.ts +2 -0
  73. package/dist/__tests__/field-value-type.test-d.d.ts.map +1 -0
  74. package/dist/__tests__/fixed-update.unit.test.d.ts +2 -0
  75. package/dist/__tests__/fixed-update.unit.test.d.ts.map +1 -0
  76. package/dist/__tests__/handle.test-d.d.ts +2 -0
  77. package/dist/__tests__/handle.test-d.d.ts.map +1 -0
  78. package/dist/__tests__/hierarchy.unit.test.d.ts +2 -0
  79. package/dist/__tests__/hierarchy.unit.test.d.ts.map +1 -0
  80. package/dist/__tests__/managed-array-vocab.test-d.d.ts +2 -0
  81. package/dist/__tests__/managed-array-vocab.test-d.d.ts.map +1 -0
  82. package/dist/__tests__/minimal-example.test-d.d.ts +2 -0
  83. package/dist/__tests__/minimal-example.test-d.d.ts.map +1 -0
  84. package/dist/__tests__/name-read-types.test-d.d.ts +2 -0
  85. package/dist/__tests__/name-read-types.test-d.d.ts.map +1 -0
  86. package/dist/__tests__/plugin-service.test.d.ts +2 -0
  87. package/dist/__tests__/plugin-service.test.d.ts.map +1 -0
  88. package/dist/__tests__/query-combinations.unit.test.d.ts +2 -0
  89. package/dist/__tests__/query-combinations.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/query-light-extract-flat-column-ratio.perf.test.d.ts +2 -0
  91. package/dist/__tests__/query-light-extract-flat-column-ratio.perf.test.d.ts.map +1 -0
  92. package/dist/__tests__/query-storage-trends.perf.test.d.ts +2 -0
  93. package/dist/__tests__/query-storage-trends.perf.test.d.ts.map +1 -0
  94. package/dist/__tests__/query-trs-flat-column-ratio.perf.test.d.ts +2 -0
  95. package/dist/__tests__/query-trs-flat-column-ratio.perf.test.d.ts.map +1 -0
  96. package/dist/__tests__/query.unit.test.d.ts +2 -0
  97. package/dist/__tests__/query.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/relationship-index.perf.test.d.ts +2 -0
  99. package/dist/__tests__/relationship-index.perf.test.d.ts.map +1 -0
  100. package/dist/__tests__/relationship-index.test.d.ts +2 -0
  101. package/dist/__tests__/relationship-index.test.d.ts.map +1 -0
  102. package/dist/__tests__/scalar-field-type-owner.test-d.d.ts +2 -0
  103. package/dist/__tests__/scalar-field-type-owner.test-d.d.ts.map +1 -0
  104. package/dist/__tests__/schedule-determinism.unit.test.d.ts +2 -0
  105. package/dist/__tests__/schedule-determinism.unit.test.d.ts.map +1 -0
  106. package/dist/__tests__/schedule-inspection.unit.test.d.ts +2 -0
  107. package/dist/__tests__/schedule-inspection.unit.test.d.ts.map +1 -0
  108. package/dist/__tests__/schedule-scope-error.unit.test.d.ts +2 -0
  109. package/dist/__tests__/schedule-scope-error.unit.test.d.ts.map +1 -0
  110. package/dist/__tests__/schedule-token.unit.test.d.ts +2 -0
  111. package/dist/__tests__/schedule-token.unit.test.d.ts.map +1 -0
  112. package/dist/__tests__/schema-vocab.test-d.d.ts +2 -0
  113. package/dist/__tests__/schema-vocab.test-d.d.ts.map +1 -0
  114. package/dist/__tests__/serialization.unit.test.d.ts +2 -0
  115. package/dist/__tests__/serialization.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/shared-kernel-eligibility.test-d.d.ts +2 -0
  117. package/dist/__tests__/shared-kernel-eligibility.test-d.d.ts.map +1 -0
  118. package/dist/__tests__/shared-kernel-eligibility.unit.test.d.ts +2 -0
  119. package/dist/__tests__/shared-kernel-eligibility.unit.test.d.ts.map +1 -0
  120. package/dist/__tests__/shared-ref-store.unit.test.d.ts +2 -0
  121. package/dist/__tests__/shared-ref-store.unit.test.d.ts.map +1 -0
  122. package/dist/__tests__/sparse-tag.unit.test.d.ts +2 -0
  123. package/dist/__tests__/sparse-tag.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/spawn-field-error.test-d.d.ts +2 -0
  125. package/dist/__tests__/spawn-field-error.test-d.d.ts.map +1 -0
  126. package/dist/__tests__/stale-error.test-d.d.ts +2 -0
  127. package/dist/__tests__/stale-error.test-d.d.ts.map +1 -0
  128. package/dist/__tests__/string-view-symmetry.test-d.d.ts +2 -0
  129. package/dist/__tests__/string-view-symmetry.test-d.d.ts.map +1 -0
  130. package/dist/__tests__/string-vocab.test-d.d.ts +2 -0
  131. package/dist/__tests__/string-vocab.test-d.d.ts.map +1 -0
  132. package/dist/__tests__/structure-epoch-boundaries.unit.test.d.ts +2 -0
  133. package/dist/__tests__/structure-epoch-boundaries.unit.test.d.ts.map +1 -0
  134. package/dist/__tests__/structure-epoch.unit.test.d.ts +2 -0
  135. package/dist/__tests__/structure-epoch.unit.test.d.ts.map +1 -0
  136. package/dist/__tests__/table-archetype-mapping.unit.test.d.ts +2 -0
  137. package/dist/__tests__/table-archetype-mapping.unit.test.d.ts.map +1 -0
  138. package/dist/__tests__/time.unit.test.d.ts +2 -0
  139. package/dist/__tests__/time.unit.test.d.ts.map +1 -0
  140. package/dist/__tests__/types.test-d.d.ts +2 -0
  141. package/dist/__tests__/types.test-d.d.ts.map +1 -0
  142. package/dist/__tests__/unique-ref-store.unit.test.d.ts +2 -0
  143. package/dist/__tests__/unique-ref-store.unit.test.d.ts.map +1 -0
  144. package/dist/__tests__/utils/handle-numeric.d.ts +14 -0
  145. package/dist/__tests__/utils/handle-numeric.d.ts.map +1 -0
  146. package/dist/__tests__/validation-root-surface.unit.test.d.ts +2 -0
  147. package/dist/__tests__/validation-root-surface.unit.test.d.ts.map +1 -0
  148. package/dist/__tests__/visibility-atomic-write.unit.test.d.ts +2 -0
  149. package/dist/__tests__/visibility-atomic-write.unit.test.d.ts.map +1 -0
  150. package/dist/__tests__/world-change-journal.unit.test.d.ts +2 -0
  151. package/dist/__tests__/world-change-journal.unit.test.d.ts.map +1 -0
  152. package/dist/__tests__/world-characterization.unit.test.d.ts +2 -0
  153. package/dist/__tests__/world-characterization.unit.test.d.ts.map +1 -0
  154. package/dist/__tests__/world-consumer-inference.test-d.d.ts +2 -0
  155. package/dist/__tests__/world-consumer-inference.test-d.d.ts.map +1 -0
  156. package/dist/__tests__/world-health.contract.test.d.ts +2 -0
  157. package/dist/__tests__/world-health.contract.test.d.ts.map +1 -0
  158. package/dist/__tests__/world-inspection.test.d.ts +2 -0
  159. package/dist/__tests__/world-inspection.test.d.ts.map +1 -0
  160. package/dist/__tests__/world-internal-identity.unit.test.d.ts +2 -0
  161. package/dist/__tests__/world-internal-identity.unit.test.d.ts.map +1 -0
  162. package/dist/__tests__/world-managed-roundtrip.unit.test.d.ts +2 -0
  163. package/dist/__tests__/world-managed-roundtrip.unit.test.d.ts.map +1 -0
  164. package/dist/__tests__/world-scheduling.m4.test.d.ts +2 -0
  165. package/dist/__tests__/world-scheduling.m4.test.d.ts.map +1 -0
  166. package/dist/__tests__/world-unique-roundtrip.unit.test.d.ts +2 -0
  167. package/dist/__tests__/world-unique-roundtrip.unit.test.d.ts.map +1 -0
  168. package/dist/__tests__/world.test-d.d.ts +2 -0
  169. package/dist/__tests__/world.test-d.d.ts.map +1 -0
  170. package/dist/buffer-pool.d.ts +109 -0
  171. package/dist/buffer-pool.d.ts.map +1 -0
  172. package/dist/commands.d.ts +93 -0
  173. package/dist/commands.d.ts.map +1 -0
  174. package/dist/component-default-fallback.d.ts +88 -0
  175. package/dist/component-default-fallback.d.ts.map +1 -0
  176. package/dist/component-schema.d.ts +34 -0
  177. package/dist/component-schema.d.ts.map +1 -0
  178. package/dist/component-value-validate.d.ts +29 -0
  179. package/dist/component-value-validate.d.ts.map +1 -0
  180. package/dist/component.d.ts +581 -0
  181. package/dist/component.d.ts.map +1 -0
  182. package/dist/entity-handle.d.ts +68 -0
  183. package/dist/entity-handle.d.ts.map +1 -0
  184. package/dist/entity.d.ts +86 -0
  185. package/dist/entity.d.ts.map +1 -0
  186. package/dist/errors/query-and-component-errors.d.ts +132 -0
  187. package/dist/errors/query-and-component-errors.d.ts.map +1 -0
  188. package/dist/errors/relationship-errors.d.ts +112 -0
  189. package/dist/errors/relationship-errors.d.ts.map +1 -0
  190. package/dist/errors/sprite-and-shared-errors.d.ts +107 -0
  191. package/dist/errors/sprite-and-shared-errors.d.ts.map +1 -0
  192. package/dist/errors/validation-errors.d.ts +229 -0
  193. package/dist/errors/validation-errors.d.ts.map +1 -0
  194. package/dist/errors.d.ts +763 -0
  195. package/dist/errors.d.ts.map +1 -0
  196. package/dist/execution/shared-kernel.d.ts +106 -0
  197. package/dist/execution/shared-kernel.d.ts.map +1 -0
  198. package/dist/externalization/index.d.ts +31 -0
  199. package/dist/externalization/index.d.ts.map +1 -0
  200. package/dist/externalization/index.mjs +298 -0
  201. package/dist/externalization/index.mjs.map +1 -0
  202. package/dist/index.d.ts +261 -0
  203. package/dist/index.d.ts.map +1 -0
  204. package/dist/index.mjs +7422 -0
  205. package/dist/index.mjs.map +1 -0
  206. package/dist/internal.mjs +479 -0
  207. package/dist/internal.mjs.map +1 -0
  208. package/dist/plugin-service.d.ts +11 -0
  209. package/dist/plugin-service.d.ts.map +1 -0
  210. package/dist/projection/index.d.ts +103 -0
  211. package/dist/projection/index.d.ts.map +1 -0
  212. package/dist/projection/index.mjs +615 -0
  213. package/dist/projection/index.mjs.map +1 -0
  214. package/dist/query/query.d.ts +58 -0
  215. package/dist/query/query.d.ts.map +1 -0
  216. package/dist/relationship-index.d.ts +81 -0
  217. package/dist/relationship-index.d.ts.map +1 -0
  218. package/dist/resource.d.ts +70 -0
  219. package/dist/resource.d.ts.map +1 -0
  220. package/dist/schedule-token.d.ts +16 -0
  221. package/dist/schedule-token.d.ts.map +1 -0
  222. package/dist/schedule.d.ts +271 -0
  223. package/dist/schedule.d.ts.map +1 -0
  224. package/dist/shared-ref-store.d.ts +144 -0
  225. package/dist/shared-ref-store.d.ts.map +1 -0
  226. package/dist/shared.d.ts +3 -0
  227. package/dist/shared.d.ts.map +1 -0
  228. package/dist/shared.mjs +364 -0
  229. package/dist/shared.mjs.map +1 -0
  230. package/dist/storage/archetype-graph.d.ts +54 -0
  231. package/dist/storage/archetype-graph.d.ts.map +1 -0
  232. package/dist/storage/archetype.d.ts +23 -0
  233. package/dist/storage/archetype.d.ts.map +1 -0
  234. package/dist/storage/change-detection.d.ts +40 -0
  235. package/dist/storage/change-detection.d.ts.map +1 -0
  236. package/dist/storage/column.d.ts +111 -0
  237. package/dist/storage/column.d.ts.map +1 -0
  238. package/dist/storage/table.d.ts +29 -0
  239. package/dist/storage/table.d.ts.map +1 -0
  240. package/dist/time.d.ts +57 -0
  241. package/dist/time.d.ts.map +1 -0
  242. package/dist/unique-ref-store.d.ts +105 -0
  243. package/dist/unique-ref-store.d.ts.map +1 -0
  244. package/dist/world-change-journal.d.ts +34 -0
  245. package/dist/world-change-journal.d.ts.map +1 -0
  246. package/dist/world-component-access.d.ts +265 -0
  247. package/dist/world-component-access.d.ts.map +1 -0
  248. package/dist/world-component-storage.d.ts +282 -0
  249. package/dist/world-component-storage.d.ts.map +1 -0
  250. package/dist/world-core.d.ts +39 -0
  251. package/dist/world-core.d.ts.map +1 -0
  252. package/dist/world-entity-lifecycle.d.ts +30 -0
  253. package/dist/world-entity-lifecycle.d.ts.map +1 -0
  254. package/dist/world-internal.d.ts +14 -0
  255. package/dist/world-internal.d.ts.map +1 -0
  256. package/dist/world-scheduling.d.ts +30 -0
  257. package/dist/world-scheduling.d.ts.map +1 -0
  258. package/dist/world.d.ts +620 -0
  259. package/dist/world.d.ts.map +1 -0
  260. package/package.json +77 -0
  261. package/src/__fixtures__/field-shape-fixture.ts +30 -0
  262. package/src/__tests__/__fixtures__/inspect-scripts.snapshot.ts +2 -0
  263. package/src/__tests__/archetype.unit.test.ts +1837 -0
  264. package/src/__tests__/array-handle-element.test-d.ts +34 -0
  265. package/src/__tests__/buffer-array-vocab.test-d.ts +53 -0
  266. package/src/__tests__/buffer-field-input-widen.unit.test.ts +99 -0
  267. package/src/__tests__/buffer-pool.test-d.ts +32 -0
  268. package/src/__tests__/change-detection.unit.test.ts +86 -0
  269. package/src/__tests__/command-buffer.test.ts +179 -0
  270. package/src/__tests__/commands-deferred.unit.test.ts +68 -0
  271. package/src/__tests__/component-catalog.test.ts +59 -0
  272. package/src/__tests__/component-definition-identity.unit.test.ts +24 -0
  273. package/src/__tests__/component-nan-preflight.unit.test.ts +186 -0
  274. package/src/__tests__/component-schema.test-d.ts +119 -0
  275. package/src/__tests__/component-schema.test.ts +55 -0
  276. package/src/__tests__/define-component-options.test-d.ts +35 -0
  277. package/src/__tests__/deprecated-vocab-rejection.unit.test.ts +59 -0
  278. package/src/__tests__/despawn-all.unit.test.ts +17 -0
  279. package/src/__tests__/ecs-core-reduction.characterization.test.ts +130 -0
  280. package/src/__tests__/ecs-core-reduction.perf.test.ts +260 -0
  281. package/src/__tests__/ecs-error-code-31.test-d.ts +42 -0
  282. package/src/__tests__/entity-disabling.unit.test.ts +37 -0
  283. package/src/__tests__/entity-handle-codec-parity.unit.test.ts +126 -0
  284. package/src/__tests__/errors.unit.test.ts +1456 -0
  285. package/src/__tests__/execution-conflict-boundary.unit.test.ts +123 -0
  286. package/src/__tests__/execution-shared-storage.unit.test.ts +40 -0
  287. package/src/__tests__/externalization-portable-value.unit.test.ts +275 -0
  288. package/src/__tests__/externalization-projection.unit.test.ts +325 -0
  289. package/src/__tests__/externalization-render-read-lease.test-d.ts +30 -0
  290. package/src/__tests__/externalization-render-read-lease.unit.test.ts +79 -0
  291. package/src/__tests__/externalization-root-surface.unit.test.ts +33 -0
  292. package/src/__tests__/field-enum-labels-reflection.test.ts +66 -0
  293. package/src/__tests__/field-shape-fixture.test.ts +61 -0
  294. package/src/__tests__/field-transient-reflection.test.ts +59 -0
  295. package/src/__tests__/field-value-type.test-d.ts +57 -0
  296. package/src/__tests__/fixed-update.unit.test.ts +78 -0
  297. package/src/__tests__/handle.test-d.ts +86 -0
  298. package/src/__tests__/hierarchy.unit.test.ts +2534 -0
  299. package/src/__tests__/managed-array-vocab.test-d.ts +137 -0
  300. package/src/__tests__/minimal-example.test-d.ts +42 -0
  301. package/src/__tests__/name-read-types.test-d.ts +72 -0
  302. package/src/__tests__/plugin-service.test.ts +13 -0
  303. package/src/__tests__/query-combinations.unit.test.ts +42 -0
  304. package/src/__tests__/query-light-extract-flat-column-ratio.perf.test.ts +252 -0
  305. package/src/__tests__/query-storage-trends.perf.test.ts +104 -0
  306. package/src/__tests__/query-trs-flat-column-ratio.perf.test.ts +194 -0
  307. package/src/__tests__/query.unit.test.ts +196 -0
  308. package/src/__tests__/relationship-index.perf.test.ts +126 -0
  309. package/src/__tests__/relationship-index.test.ts +70 -0
  310. package/src/__tests__/scalar-field-type-owner.test-d.ts +71 -0
  311. package/src/__tests__/schedule-determinism.unit.test.ts +36 -0
  312. package/src/__tests__/schedule-inspection.unit.test.ts +81 -0
  313. package/src/__tests__/schedule-scope-error.unit.test.ts +63 -0
  314. package/src/__tests__/schedule-token.unit.test.ts +54 -0
  315. package/src/__tests__/schema-vocab.test-d.ts +103 -0
  316. package/src/__tests__/serialization.unit.test.ts +2740 -0
  317. package/src/__tests__/shared-kernel-eligibility.test-d.ts +18 -0
  318. package/src/__tests__/shared-kernel-eligibility.unit.test.ts +78 -0
  319. package/src/__tests__/shared-ref-store.unit.test.ts +646 -0
  320. package/src/__tests__/sparse-tag.unit.test.ts +201 -0
  321. package/src/__tests__/spawn-field-error.test-d.ts +41 -0
  322. package/src/__tests__/stale-error.test-d.ts +208 -0
  323. package/src/__tests__/string-view-symmetry.test-d.ts +26 -0
  324. package/src/__tests__/string-vocab.test-d.ts +49 -0
  325. package/src/__tests__/structure-epoch-boundaries.unit.test.ts +39 -0
  326. package/src/__tests__/structure-epoch.unit.test.ts +48 -0
  327. package/src/__tests__/table-archetype-mapping.unit.test.ts +78 -0
  328. package/src/__tests__/time.unit.test.ts +79 -0
  329. package/src/__tests__/types.test-d.ts +38 -0
  330. package/src/__tests__/unique-ref-store.unit.test.ts +348 -0
  331. package/src/__tests__/utils/handle-numeric.ts +30 -0
  332. package/src/__tests__/validation-root-surface.unit.test.ts +15 -0
  333. package/src/__tests__/visibility-atomic-write.unit.test.ts +82 -0
  334. package/src/__tests__/world-change-journal.unit.test.ts +97 -0
  335. package/src/__tests__/world-characterization.unit.test.ts +408 -0
  336. package/src/__tests__/world-consumer-inference.test-d.ts +16 -0
  337. package/src/__tests__/world-health.contract.test.ts +87 -0
  338. package/src/__tests__/world-inspection.test.ts +37 -0
  339. package/src/__tests__/world-internal-identity.unit.test.ts +17 -0
  340. package/src/__tests__/world-managed-roundtrip.unit.test.ts +98 -0
  341. package/src/__tests__/world-scheduling.m4.test.ts +52 -0
  342. package/src/__tests__/world-unique-roundtrip.unit.test.ts +357 -0
  343. package/src/__tests__/world.test-d.ts +156 -0
  344. package/src/buffer-pool.ts +357 -0
  345. package/src/commands.ts +644 -0
  346. package/src/component-default-fallback.ts +236 -0
  347. package/src/component-schema.ts +92 -0
  348. package/src/component-value-validate.ts +135 -0
  349. package/src/component.ts +1268 -0
  350. package/src/entity-handle.ts +104 -0
  351. package/src/entity.ts +140 -0
  352. package/src/errors/query-and-component-errors.ts +200 -0
  353. package/src/errors/relationship-errors.ts +198 -0
  354. package/src/errors/sprite-and-shared-errors.ts +231 -0
  355. package/src/errors/validation-errors.ts +506 -0
  356. package/src/errors.ts +1464 -0
  357. package/src/execution/shared-kernel.ts +392 -0
  358. package/src/externalization/index.ts +170 -0
  359. package/src/index.ts +414 -0
  360. package/src/plugin-service.ts +35 -0
  361. package/src/projection/index.ts +318 -0
  362. package/src/query/query.ts +606 -0
  363. package/src/relationship-index.ts +175 -0
  364. package/src/resource.ts +106 -0
  365. package/src/schedule-token.ts +40 -0
  366. package/src/schedule.ts +846 -0
  367. package/src/shared-ref-store.ts +418 -0
  368. package/src/shared.ts +23 -0
  369. package/src/storage/archetype-graph.ts +166 -0
  370. package/src/storage/archetype.ts +78 -0
  371. package/src/storage/change-detection.ts +231 -0
  372. package/src/storage/column.ts +247 -0
  373. package/src/storage/table.ts +153 -0
  374. package/src/time.ts +122 -0
  375. package/src/unique-ref-store.ts +278 -0
  376. package/src/world-change-journal.ts +84 -0
  377. package/src/world-component-access.ts +1421 -0
  378. package/src/world-component-storage.ts +1178 -0
  379. package/src/world-core.ts +74 -0
  380. package/src/world-entity-lifecycle.ts +539 -0
  381. package/src/world-internal.ts +75 -0
  382. package/src/world-scheduling.ts +499 -0
  383. package/src/world.ts +1399 -0
@@ -0,0 +1,144 @@
1
+ import type { Handle } from '@forgeax/engine-types';
2
+ import { type Result } from '@forgeax/engine-types';
3
+ import { BuiltinSlotNotOwnedError, SharedRefDoubleReleaseError, SharedRefReleasedError, SharedRefStaleError } from './errors';
4
+ export interface SharedRefMutation {
5
+ readonly epoch: number;
6
+ readonly handle: number;
7
+ }
8
+ export interface SharedRefReleaseEvidence {
9
+ readonly payload: unknown;
10
+ readonly refcount: 0;
11
+ readonly generation: number;
12
+ readonly evidence: 'released';
13
+ }
14
+ export type SharedRefMutationRead = {
15
+ readonly status: 'ok';
16
+ readonly cursor: number;
17
+ readonly records: readonly SharedRefMutation[];
18
+ } | {
19
+ readonly status: 'overflow';
20
+ readonly cursor: number;
21
+ readonly oldestAvailable: number;
22
+ };
23
+ /**
24
+ * Reference-counted store for ECS-aware `Handle<T, 'shared'>` lifecycles.
25
+ *
26
+ * The producer (typically AssetRegistry) calls `alloc` once and owns the
27
+ * "alloc-grant" rc=1; consumers (ECS schema fields, external systems) call
28
+ * `retain` on each new holder and `release` when the holder drops. When rc
29
+ * transitions 1 -> 0 the store publishes one structured release-evidence
30
+ * record; it does not invoke a user callback or own payload disposal.
31
+ *
32
+ * D-15: manages ONLY user-tier slots (`slot >= BUILTIN_BASE`). Builtin slots
33
+ * (`< BUILTIN_BASE`) fail-fast with `BuiltinSlotNotOwnedError`.
34
+ *
35
+ * Public API:
36
+ * - alloc(target, payload) -> Handle<T, 'shared'> (rc=1)
37
+ * - intern(target, payload) -> stable producer handle per target + object identity
38
+ * - resolve(handle) -> Result<T, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>
39
+ * - markChanged(handle) -> Result<void, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>
40
+ * - getMutationEpoch() -> monotonic payload-mutation cursor
41
+ * - retain(handle) -> Result<void, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>
42
+ * - release(handle) -> Result<release evidence | undefined, ...>
43
+ * - refcount(handle) -> number (0 == released; debug + tests)
44
+ * - _liveCount() -> live slot count (debug + inspector)
45
+ */
46
+ export declare class SharedRefStore {
47
+ private readonly payloads;
48
+ private readonly refcounts;
49
+ private readonly freeSlots;
50
+ private readonly internedByTarget;
51
+ private readonly internedKeys;
52
+ private nextSlot;
53
+ private mutationEpoch;
54
+ private readonly mutationJournal;
55
+ private readonly releaseJournal;
56
+ /**
57
+ * Generation table indexed by slot (D-6). Each entry tracks the current
58
+ * generation for the slot — written to during alloc (welded into the
59
+ * returned handle via pack) and incremented on release (M4).
60
+ *
61
+ * @internal
62
+ */
63
+ private readonly _generations;
64
+ /**
65
+ * Allocate a fresh shared handle for `payload`, branded against `target`.
66
+ * Refcount starts at 1 (the alloc-grant). Nullish payloads are rejected
67
+ * before a slot or free-list is touched.
68
+ *
69
+ * The returned handle carries a generation tag welded via codec.pack
70
+ * (D-8, OOS-2): first allocation gen=0 (AC-06), reused slot gen = the
71
+ * current generation from _generations[slot]. The toShared brand cast
72
+ * happens internally — external callers no longer construct Handle<...>
73
+ * directly.
74
+ *
75
+ * Minted slots are user-tier (`>= BUILTIN_BASE`); builtin slots are never
76
+ * produced here (D-15).
77
+ */
78
+ alloc<Target extends string, T = unknown>(target: Target, payload: T): Handle<Target, 'shared'>;
79
+ /**
80
+ * Return the idempotent producer handle for one object payload in this
81
+ * store. Identity includes `target`, so the same object branded for two
82
+ * asset kinds does not alias.
83
+ *
84
+ * A cache hit deliberately does not retain: this is one producer grant,
85
+ * discovered repeatedly by an asset catalogue. Actual holders retain and
86
+ * release through the ECS write barrier. Callers needing independent
87
+ * grants or a per-handle deleter must use {@link alloc}.
88
+ */
89
+ intern<Target extends string, T extends object>(target: Target, payload: T): Handle<Target, 'shared'>;
90
+ /**
91
+ * Look up `payload` by handle. Returns `err(shared-ref-released)` when
92
+ * the handle's slot has no live payload (rc reached 0, no re-alloc has
93
+ * filled the slot); `err(builtin-slot-not-owned)` for a builtin slot.
94
+ *
95
+ * §contract - mirrors UniqueRefStore: a stale handle whose slot has been
96
+ * released and re-allocated returns `err(shared-ref-stale)` - the handle's
97
+ * welded generation no longer matches `_generations[slot]`. The gen check
98
+ * runs before payload lookup, so stale-by-reuse is caught deterministically.
99
+ */
100
+ resolve<Target extends string, T = unknown>(handle: Handle<Target, 'shared'>): Result<T, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>;
101
+ /**
102
+ * Publish that a live payload was mutated in place. Consumers that retain
103
+ * projections of shared payload data compare the monotonic epoch and
104
+ * explicitly refresh instead of rescanning every payload each frame.
105
+ */
106
+ markChanged<Target extends string>(handle: Handle<Target, 'shared'>): Result<void, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>;
107
+ /** Current upper bound for explicitly published payload mutations. */
108
+ getMutationEpoch(): number;
109
+ /** Read exact changed handles after `cursor`; overflow requires consumer resync. */
110
+ readChangesSince(cursor: number): SharedRefMutationRead;
111
+ /**
112
+ * Increment the refcount of a live shared handle. Returns
113
+ * `err(shared-ref-released)` when the handle is not live - retain MUST
114
+ * NOT resurrect a released slot (charter P3 explicit failure; would
115
+ * defeat the rc=0 -> drop invariant); `err(builtin-slot-not-owned)` for a
116
+ * builtin slot.
117
+ */
118
+ retain<Target extends string>(handle: Handle<Target, 'shared'>): Result<void, SharedRefReleasedError | SharedRefStaleError | BuiltinSlotNotOwnedError>;
119
+ /**
120
+ * Decrement the refcount. When rc transitions 1 -> 0, the slot is dropped
121
+ * and one structured release-evidence record is published. The evidence
122
+ * captures the payload, zero refcount, next generation and `released` marker
123
+ * after the store has removed the live slot.
124
+ *
125
+ * Returns `err(shared-ref-double-release, rc=0)` when the handle has
126
+ * already reached rc=0 (or was never live); `err(builtin-slot-not-owned)`
127
+ * for a builtin slot. AI users branch on `.code` and route the
128
+ * second-release log to Layer 3 ErrorHandler without aborting the despawn
129
+ * chain.
130
+ */
131
+ release<Target extends string>(handle: Handle<Target, 'shared'>): Result<SharedRefReleaseEvidence | undefined, SharedRefDoubleReleaseError | SharedRefStaleError | BuiltinSlotNotOwnedError>;
132
+ /** Read the bounded release evidence owned by this store. */
133
+ readReleaseEvidence(): readonly SharedRefReleaseEvidence[];
134
+ /**
135
+ * Return the current refcount for `handle`. Returns 0 for a released
136
+ * (or never-allocated) slot. Primarily a debug + tests entry point;
137
+ * production code rarely reads rc directly (the rc=0 -> drop invariant
138
+ * is the surface AI users consume via release / the per-handle deleter).
139
+ */
140
+ refcount<Target extends string>(handle: Handle<Target, 'shared'>): number;
141
+ /** @internal Diagnostic count of live slots. Exposed for tests + inspector. */
142
+ _liveCount(): number;
143
+ }
144
+ //# sourceMappingURL=shared-ref-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-ref-store.d.ts","sourceRoot":"","sources":["../src/shared-ref-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { KernelDispatchFailure, KernelDispatchResult, KernelDispatchSpan, SharedFieldView, SharedKernelDefinition, SharedKernelDispatch, SharedKernelEligibilityReason, SharedKernelExecutor, SharedKernelHandle, SharedSpanBinding, WorldExecutionHealth, } from './execution/shared-kernel';
2
+ export { bindSharedSpan, defineSharedKernel, isKernelDispatchFailure, isSharedSpan, SHARED_KERNEL_ELIGIBILITY_REASONS, SHARED_KERNEL_EXECUTOR_RESOURCE_KEY, sharedKernelEligibility, splitSharedSpan, } from './execution/shared-kernel';
3
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,6BAA6B,EAC7B,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EACZ,iCAAiC,EACjC,mCAAmC,EACnC,uBAAuB,EACvB,eAAe,GAChB,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,364 @@
1
+ import '@forgeax/engine-types';
2
+
3
+ // src/component.ts
4
+ var FIELD_SIZE_BYTES = {
5
+ f32: 4,
6
+ f64: 8,
7
+ i32: 4,
8
+ u32: 4,
9
+ i16: 2,
10
+ u16: 2,
11
+ i8: 1,
12
+ u8: 1,
13
+ bool: 1,
14
+ enum: 4,
15
+ ref: 4
16
+ };
17
+ var COMPONENT_OWNER_REGISTRY = /* @__PURE__ */ Symbol.for("forgeax.ecs.componentOwnerRegistry");
18
+ var ownerSymbols = globalThis;
19
+ var ownerRegistry = ownerSymbols[COMPONENT_OWNER_REGISTRY] ?? (() => {
20
+ const registry = {
21
+ nextId: 1,
22
+ ids: /* @__PURE__ */ new WeakMap(),
23
+ schemas: /* @__PURE__ */ new WeakMap()
24
+ };
25
+ ownerSymbols[COMPONENT_OWNER_REGISTRY] = registry;
26
+ return registry;
27
+ })();
28
+ function componentId(component) {
29
+ const id = ownerRegistry.ids.get(component);
30
+ if (id === void 0) throw new Error(`Component identity missing for '${component.name}'.`);
31
+ return id;
32
+ }
33
+ function componentSchema(component) {
34
+ const schema = ownerRegistry.schemas.get(component);
35
+ if (schema === void 0) throw new Error(`Component schema missing for '${component.name}'.`);
36
+ return schema;
37
+ }
38
+ var VIEW_CTORS = {
39
+ f32: Float32Array,
40
+ f64: Float64Array,
41
+ i32: Int32Array,
42
+ u32: Uint32Array,
43
+ i16: Int16Array,
44
+ u16: Uint16Array,
45
+ i8: Int8Array,
46
+ u8: Uint8Array,
47
+ bool: Uint8Array,
48
+ enum: Uint32Array,
49
+ ref: Uint32Array
50
+ };
51
+ function scalarRow(t) {
52
+ return {
53
+ byteSize: FIELD_SIZE_BYTES[t],
54
+ viewCtor: VIEW_CTORS[t],
55
+ storage: t,
56
+ isScalar: true,
57
+ // The scalar `ref` shares its key with the vocab `ref<T>` family; mark
58
+ // it as managed so the single row covers both.
59
+ isManaged: t === "ref",
60
+ isBuffer: false,
61
+ isEntityRef: false,
62
+ isArray: false
63
+ };
64
+ }
65
+ Object.freeze({
66
+ f32: scalarRow("f32"),
67
+ f64: scalarRow("f64"),
68
+ i32: scalarRow("i32"),
69
+ u32: scalarRow("u32"),
70
+ i16: scalarRow("i16"),
71
+ u16: scalarRow("u16"),
72
+ i8: scalarRow("i8"),
73
+ u8: scalarRow("u8"),
74
+ bool: scalarRow("bool"),
75
+ enum: scalarRow("enum"),
76
+ ref: scalarRow("ref"),
77
+ entity: {
78
+ byteSize: 4,
79
+ viewCtor: Uint32Array,
80
+ storage: "u32",
81
+ isScalar: false,
82
+ isManaged: false,
83
+ isBuffer: false,
84
+ isEntityRef: true,
85
+ isArray: false
86
+ },
87
+ string: {
88
+ byteSize: 4,
89
+ viewCtor: Uint32Array,
90
+ storage: "u32",
91
+ isScalar: false,
92
+ isManaged: true,
93
+ isBuffer: false,
94
+ isEntityRef: false,
95
+ isArray: false
96
+ },
97
+ buffer: {
98
+ byteSize: 4,
99
+ viewCtor: Uint32Array,
100
+ storage: "u32",
101
+ isScalar: false,
102
+ isManaged: false,
103
+ isBuffer: true,
104
+ isEntityRef: false,
105
+ isArray: false
106
+ },
107
+ // feat-20260614-ecs-shared-component-and-unique-rename M3 (plan-strategy
108
+ // D-3): independent `'shared'` row, NOT a reuse of the `'ref'` (post-M2:
109
+ // `'unique<T>'` family) row. `isManaged: true` so write-barrier dispatch
110
+ // routes shared<T> fields through release on despawn / removeComponent /
111
+ // set-overwrite, but the M4 sub-dispatch in releaseManagedFieldOnRow will
112
+ // separate shared (rc--) from unique (direct slot drop) using the
113
+ // fieldType.startsWith('shared<') predicate. Keeping the meta key
114
+ // independent preserves the "meta key = release semantics" invariant
115
+ // (architecture-principles.md #1 SSOT).
116
+ shared: {
117
+ byteSize: 4,
118
+ viewCtor: Uint32Array,
119
+ storage: "u32",
120
+ isScalar: false,
121
+ isManaged: true,
122
+ isBuffer: false,
123
+ isEntityRef: false,
124
+ isArray: false
125
+ },
126
+ array: {
127
+ byteSize: 4,
128
+ viewCtor: Uint32Array,
129
+ storage: "u32",
130
+ isScalar: false,
131
+ isManaged: false,
132
+ isBuffer: false,
133
+ isEntityRef: false,
134
+ isArray: true
135
+ }
136
+ });
137
+
138
+ // src/world-internal.ts
139
+ var worldInternal = /* @__PURE__ */ Symbol.for(
140
+ "forgeax.ecs.worldInternal"
141
+ );
142
+
143
+ // src/execution/shared-kernel.ts
144
+ var SHARED_KERNEL_EXECUTOR_RESOURCE_KEY = "SharedKernelExecutor";
145
+ function isKernelDispatchFailure(value) {
146
+ return "cause" in value;
147
+ }
148
+ var SHARED_KERNEL_ELIGIBILITY_REASONS = [
149
+ "callback-not-module-function",
150
+ "dom-access",
151
+ "missing-access-declaration",
152
+ "descriptor-conflict",
153
+ "object-field",
154
+ "span-unavailable"
155
+ ];
156
+ var SharedKernelEligibilityError = class extends Error {
157
+ code = "shared-kernel-ineligible";
158
+ expected = "a module-loadable named kernel with one or more numeric QuerySpan read/write declarations";
159
+ hint = "export a named function from the kernel module and use only dense numeric QuerySpan columns";
160
+ detail;
161
+ constructor(kernelName, reason) {
162
+ super(`Shared kernel "${kernelName}" is ineligible: ${reason}.`);
163
+ this.name = "SharedKernelEligibilityError";
164
+ this.detail = { kernelName, reason };
165
+ }
166
+ };
167
+ var SharedKernelFailureError = class extends Error {
168
+ code = "shared-kernel-failed";
169
+ expected = "every dispatched shard completes without a possible partial write";
170
+ hint = "do not retry this World; inspect detail.cause and rebuild with a new World identity";
171
+ detail;
172
+ constructor(kernelName, worldIdentity, cause, partialWrite) {
173
+ super(`Shared kernel "${kernelName}" failed; World ${worldIdentity} is poisoned.`);
174
+ this.name = "SharedKernelFailureError";
175
+ this.detail = { kernelName, worldIdentity, cause, partialWrite, retryable: false };
176
+ }
177
+ };
178
+ var NUMERIC_FIELDS = /* @__PURE__ */ new Set([
179
+ "f32",
180
+ "f64",
181
+ "i32",
182
+ "u32",
183
+ "i16",
184
+ "u16",
185
+ "i8",
186
+ "u8",
187
+ "bool",
188
+ "enum",
189
+ "ref",
190
+ "entity"
191
+ ]);
192
+ function components(descriptor) {
193
+ return [
194
+ ...descriptor.read ?? [],
195
+ ...descriptor.write ?? [],
196
+ ...descriptor.optional ?? [],
197
+ ...descriptor.with ?? [],
198
+ ...descriptor.without ?? [],
199
+ ...descriptor.changed ?? [],
200
+ ...descriptor.added ?? []
201
+ ];
202
+ }
203
+ function descriptorReason(descriptor) {
204
+ if ((descriptor.read?.length ?? 0) + (descriptor.write?.length ?? 0) === 0) {
205
+ return "missing-access-declaration";
206
+ }
207
+ if ((descriptor.optional?.length ?? 0) > 0 || (descriptor.changed?.length ?? 0) > 0 || (descriptor.added?.length ?? 0) > 0) {
208
+ return "span-unavailable";
209
+ }
210
+ const seen = /* @__PURE__ */ new Set();
211
+ for (const component of components(descriptor)) {
212
+ if (seen.has(componentId(component))) return "descriptor-conflict";
213
+ seen.add(componentId(component));
214
+ if (component.storage === "sparse") return "span-unavailable";
215
+ if (Object.values(componentSchema(component)).some((field) => !NUMERIC_FIELDS.has(field))) {
216
+ return "object-field";
217
+ }
218
+ }
219
+ return void 0;
220
+ }
221
+ function sharedKernelEligibility(moduleUrl, definition) {
222
+ try {
223
+ new URL(moduleUrl);
224
+ } catch {
225
+ return "callback-not-module-function";
226
+ }
227
+ const source = Function.prototype.toString.call(definition.run);
228
+ if (definition.run.name.length === 0 || source.includes("=>")) {
229
+ return "callback-not-module-function";
230
+ }
231
+ if (/\b(?:document|window|globalThis|HTMLElement|GPUDevice|AudioContext)\b/u.test(source)) {
232
+ return "dom-access";
233
+ }
234
+ for (const query of definition.queries) {
235
+ const reason = descriptorReason(query);
236
+ if (reason !== void 0) return reason;
237
+ }
238
+ return void 0;
239
+ }
240
+ function defineSharedKernel(moduleUrl, definition) {
241
+ const reason = sharedKernelEligibility(moduleUrl, definition);
242
+ if (reason !== void 0) throw new SharedKernelEligibilityError(definition.name, reason);
243
+ const handle = Object.freeze({
244
+ kind: "shared-kernel",
245
+ moduleUrl,
246
+ name: definition.name,
247
+ queries: definition.queries,
248
+ minimumRows: definition.minimumRows ?? 16384,
249
+ run: definition.run,
250
+ ...definition.before !== void 0 ? { before: definition.before } : {},
251
+ ...definition.after !== void 0 ? { after: definition.after } : {},
252
+ fn: (world, queries) => {
253
+ const dispatchSpans = [];
254
+ for (const [queryIndex, query] of queries.entries()) {
255
+ const result = query.spans();
256
+ if (!result.ok) throw new SharedKernelEligibilityError(definition.name, "span-unavailable");
257
+ for (const span of result.value) dispatchSpans.push({ queryIndex, span });
258
+ }
259
+ const spans = dispatchSpans.map((entry) => entry.span);
260
+ const totalRows = spans.reduce((sum, span) => sum + span.length, 0);
261
+ try {
262
+ if (totalRows < (definition.minimumRows ?? 16384) || !world.hasResource(SHARED_KERNEL_EXECUTOR_RESOURCE_KEY)) {
263
+ definition.run(spans);
264
+ return;
265
+ }
266
+ const executor = world.getResource(
267
+ SHARED_KERNEL_EXECUTOR_RESOURCE_KEY
268
+ );
269
+ const result = executor.execute(handle, dispatchSpans);
270
+ if (isKernelDispatchFailure(result)) {
271
+ if (!result.partialWrite) {
272
+ definition.run(spans);
273
+ return;
274
+ }
275
+ world[worldInternal].poisonExecution({
276
+ code: "shared-kernel-failed",
277
+ kernelName: definition.name,
278
+ cause: result.cause,
279
+ partialWrite: result.partialWrite,
280
+ retryable: false
281
+ });
282
+ throw new SharedKernelFailureError(
283
+ definition.name,
284
+ world.execution.identity,
285
+ result.cause,
286
+ result.partialWrite
287
+ );
288
+ }
289
+ } catch (cause) {
290
+ if (world.execution.health !== "poisoned") {
291
+ world[worldInternal].poisonExecution({
292
+ code: "shared-kernel-failed",
293
+ kernelName: definition.name,
294
+ cause,
295
+ partialWrite: true,
296
+ retryable: false
297
+ });
298
+ }
299
+ if (cause instanceof SharedKernelFailureError) throw cause;
300
+ throw new SharedKernelFailureError(definition.name, world.execution.identity, cause, true);
301
+ }
302
+ }
303
+ });
304
+ return handle;
305
+ }
306
+ function sliceFields(fields, start, end) {
307
+ return Object.fromEntries(
308
+ Object.entries(fields).map(([name, view]) => [name, view.subarray(start, end)])
309
+ );
310
+ }
311
+ function bindSharedSpan(kernel, span, queryIndex) {
312
+ const descriptor = kernel.queries[queryIndex];
313
+ if (descriptor === void 0) throw new Error(`Missing query descriptor ${queryIndex}.`);
314
+ const read = Object.fromEntries(
315
+ (descriptor.read ?? []).map((component) => [
316
+ component.name,
317
+ span.get(component)
318
+ ])
319
+ );
320
+ const write = Object.fromEntries(
321
+ (descriptor.write ?? []).map((component) => [
322
+ component.name,
323
+ span.mut(component)
324
+ ])
325
+ );
326
+ return { entities: span.entities, length: span.length, read, write };
327
+ }
328
+ function splitSharedSpan(binding, shardCount) {
329
+ if (binding.length === 0 || shardCount <= 0) return [];
330
+ const count = Math.min(binding.length, shardCount);
331
+ const shards = [];
332
+ for (let index = 0; index < count; index += 1) {
333
+ const start = Math.floor(binding.length * index / count);
334
+ const end = Math.floor(binding.length * (index + 1) / count);
335
+ shards.push({
336
+ entities: binding.entities.subarray(start, end),
337
+ length: end - start,
338
+ read: Object.fromEntries(
339
+ Object.entries(binding.read).map(([component, fields]) => [
340
+ component,
341
+ sliceFields(fields, start, end)
342
+ ])
343
+ ),
344
+ write: Object.fromEntries(
345
+ Object.entries(binding.write).map(([component, fields]) => [
346
+ component,
347
+ sliceFields(fields, start, end)
348
+ ])
349
+ )
350
+ });
351
+ }
352
+ return shards;
353
+ }
354
+ function isSharedSpan(binding) {
355
+ if (typeof SharedArrayBuffer === "undefined") return false;
356
+ if (!(binding.entities.buffer instanceof SharedArrayBuffer)) return false;
357
+ return [...Object.values(binding.read), ...Object.values(binding.write)].every(
358
+ (fields) => Object.values(fields).every((view) => view.buffer instanceof SharedArrayBuffer)
359
+ );
360
+ }
361
+
362
+ export { SHARED_KERNEL_ELIGIBILITY_REASONS, SHARED_KERNEL_EXECUTOR_RESOURCE_KEY, bindSharedSpan, defineSharedKernel, isKernelDispatchFailure, isSharedSpan, sharedKernelEligibility, splitSharedSpan };
363
+ //# sourceMappingURL=shared.mjs.map
364
+ //# sourceMappingURL=shared.mjs.map