@series-inc/rundot-syncplay 5.23.0-beta.8 → 5.24.0-beta.0

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 (91) hide show
  1. package/README.md +81 -6
  2. package/dist/browser.d.ts +89 -57
  3. package/dist/browser.js +47 -53
  4. package/dist/certification.d.ts +20 -3
  5. package/dist/certification.js +78 -2
  6. package/dist/checksum-basis.d.ts +4 -0
  7. package/dist/checksum-basis.js +17 -0
  8. package/dist/cjs/browser.js +261 -90
  9. package/dist/cjs/certification.js +78 -2
  10. package/dist/cjs/checksum-basis.js +22 -0
  11. package/dist/cjs/collider-cooking.js +834 -0
  12. package/dist/cjs/creator.js +2 -1
  13. package/dist/cjs/deterministic-session.js +2 -0
  14. package/dist/cjs/engine-complete.js +213 -3
  15. package/dist/cjs/engine-parity-matrix.js +44 -6
  16. package/dist/cjs/engine-parity.js +1 -1
  17. package/dist/cjs/index.js +199 -139
  18. package/dist/cjs/instant-replay.js +4 -9
  19. package/dist/cjs/movement3d.js +246 -1
  20. package/dist/cjs/networked-client.js +11 -9
  21. package/dist/cjs/node.js +7 -1
  22. package/dist/cjs/offline-session.js +52 -24
  23. package/dist/cjs/physics-cert.js +152 -6
  24. package/dist/cjs/physics2d.js +10 -4
  25. package/dist/cjs/physics3d-hull.js +381 -0
  26. package/dist/cjs/physics3d-joints.js +769 -0
  27. package/dist/cjs/physics3d-recipes.js +197 -0
  28. package/dist/cjs/physics3d-shared.js +294 -0
  29. package/dist/cjs/physics3d-solver.js +2008 -0
  30. package/dist/cjs/physics3d-stacking.js +154 -0
  31. package/dist/cjs/physics3d-toi.js +251 -0
  32. package/dist/cjs/physics3d-vehicle.js +492 -0
  33. package/dist/cjs/physics3d.js +1441 -226
  34. package/dist/cjs/replay-bundle.js +127 -20
  35. package/dist/cjs/runtime-support.js +71 -0
  36. package/dist/cjs/sample-scenes.js +3 -0
  37. package/dist/cjs/session-promotion.js +5 -5
  38. package/dist/cjs/synctest.js +49 -0
  39. package/dist/cjs/testing.js +110 -0
  40. package/dist/cli.js +180 -50
  41. package/dist/collider-cooking.d.ts +141 -0
  42. package/dist/collider-cooking.js +829 -0
  43. package/dist/creator.d.ts +1 -1
  44. package/dist/creator.js +1 -1
  45. package/dist/deterministic-session.js +2 -0
  46. package/dist/engine-complete.js +214 -4
  47. package/dist/engine-parity-matrix.js +44 -6
  48. package/dist/engine-parity.js +1 -1
  49. package/dist/index.d.ts +95 -90
  50. package/dist/index.js +45 -56
  51. package/dist/instant-replay.d.ts +2 -2
  52. package/dist/instant-replay.js +4 -9
  53. package/dist/movement3d.d.ts +73 -0
  54. package/dist/movement3d.js +245 -1
  55. package/dist/networked-client.js +11 -9
  56. package/dist/node.d.ts +4 -0
  57. package/dist/node.js +3 -0
  58. package/dist/offline-session.js +53 -25
  59. package/dist/physics-cert.d.ts +1 -1
  60. package/dist/physics-cert.js +152 -6
  61. package/dist/physics2d.js +10 -4
  62. package/dist/physics3d-hull.d.ts +53 -0
  63. package/dist/physics3d-hull.js +376 -0
  64. package/dist/physics3d-joints.d.ts +101 -0
  65. package/dist/physics3d-joints.js +766 -0
  66. package/dist/physics3d-recipes.d.ts +29 -0
  67. package/dist/physics3d-recipes.js +193 -0
  68. package/dist/physics3d-shared.d.ts +72 -0
  69. package/dist/physics3d-shared.js +263 -0
  70. package/dist/physics3d-solver.d.ts +261 -0
  71. package/dist/physics3d-solver.js +2001 -0
  72. package/dist/physics3d-stacking.d.ts +26 -0
  73. package/dist/physics3d-stacking.js +147 -0
  74. package/dist/physics3d-toi.d.ts +70 -0
  75. package/dist/physics3d-toi.js +245 -0
  76. package/dist/physics3d-vehicle.d.ts +84 -0
  77. package/dist/physics3d-vehicle.js +488 -0
  78. package/dist/physics3d.d.ts +126 -8
  79. package/dist/physics3d.js +1388 -180
  80. package/dist/replay-bundle.d.ts +40 -1
  81. package/dist/replay-bundle.js +126 -20
  82. package/dist/runtime-support.d.ts +60 -0
  83. package/dist/runtime-support.js +66 -0
  84. package/dist/sample-scenes.js +3 -0
  85. package/dist/session-promotion.js +5 -5
  86. package/dist/synctest.d.ts +1 -1
  87. package/dist/synctest.js +49 -0
  88. package/dist/testing.d.ts +54 -0
  89. package/dist/testing.js +46 -0
  90. package/dist/types.d.ts +21 -2
  91. package/package.json +16 -3
package/README.md CHANGED
@@ -21,6 +21,26 @@ changes validate uploaded deterministic room proof metadata and pass normalized
21
21
  proof into room startup; they do not add new matchmaking or client connection
22
22
  semantics.
23
23
 
24
+ ## State Ownership Contract
25
+
26
+ `step` must not mutate the state object it receives or anything reachable from
27
+ it. Copy every array, map, set, typed array, or object before modifying it.
28
+ Sharing unmodified structure with the prior state is expected, and returning the
29
+ same state unchanged is legal.
30
+
31
+ Syncplay retains each returned state object in the snapshot ring by reference
32
+ and hands it back on rollback without copying. This makes snapshot and restore
33
+ O(1); violating the contract corrupts rollback history. Run
34
+ `runSyncplaySynctest` in CI: its `aliasing`, `hydration`, and `codec` phases catch
35
+ mutation, normalization-dependent behavior, and lossy codecs.
36
+
37
+ For large, slowly changing state, keep an incremental running hash in immutable
38
+ state and expose it through `config.checksum`. Recorded checksums can then be
39
+ O(1) and interval-gated. Wire snapshots still serialize and checksum full state
40
+ on demand; never treat `config.checksum` as the late-join checksum. See
41
+ [`docs/syncplay-state-contract.md`](../../docs/syncplay-state-contract.md) for
42
+ the worked pattern and validation-latency tradeoff.
43
+
24
44
  ## Testing
25
45
 
26
46
  `test:core` is the confidence surface. It runs the behavioral suites that pin
@@ -84,6 +104,14 @@ import { createDeterministicAuthorityServer } from '@series-inc/rundot-syncplay/
84
104
  import { rundotSyncplayPlugin } from '@series-inc/rundot-syncplay/tools';
85
105
  ```
86
106
 
107
+ > The `@series-inc/rundot-syncplay/testing` entry (and its SDK mirror
108
+ > `@series-inc/rundot-game-sdk/syncplay/testing`) exposes internal labs,
109
+ > examples, fixtures, certification harnesses, and mocks for this repo's tests,
110
+ > prototypes, and the syncplay CLI. It is **unsupported** — anything there may be
111
+ > renamed or removed without notice, and it is deliberately excluded from the
112
+ > export-surface goldens. Game code must import from the package root, `/browser`,
113
+ > or `/creator` instead.
114
+
87
115
  The SDK bridge re-exports a browser-safe subset for games that already depend on
88
116
  `@series-inc/rundot-game-sdk`:
89
117
 
@@ -254,14 +282,57 @@ Implemented:
254
282
  - `lab:physics-cert` built-in fixed physics certification for fixed-arena and
255
283
  128-slot load shapes with snapshot/restore, stable collision/query ordering,
256
284
  and timing metrics.
285
+ - `lab:physics-cert -- --engine builtin-rigid` certifies the 3D rigid-body
286
+ solver (settling stack + hinge motor + grab + speculative CCD arena) against
287
+ the same four determinism gates; the contact/joint caches round-trip through
288
+ the snapshot as canonical state.
257
289
  - `lab:physics-cert -- --engine rapier2d-compat` certification for
258
290
  `@dimforge/rapier2d-compat@0.19.3`; the current pinned cert reproduces
259
291
  snapshot/restore nondeterminism, so Rapier remains render/prototype-only for
260
292
  checksummed gameplay.
293
+ - **Production-grade 3D rigid-body dynamics.** A warm-started sequential-impulse
294
+ solver (SAT + face-clipping manifolds → accumulated normal/friction impulses →
295
+ split-impulse position correction → island-based sleeping) delivers stable
296
+ stacking, full 6-DOF tumbling props, per-body axis locks (Box2D-class 2D games
297
+ on the 3D solver), impulse-based joints (`ball`, `hinge` with limits + motor,
298
+ `weld`, `distance`/rope, `spring` (soft point-to-point via
299
+ `frequencyHz`/`dampingRatio`, Box2D soft-constraint math), and the `grab`
300
+ gravity-gun/carry primitive),
301
+ speculative-contact CCD, and compound colliders. Opt-in per body via
302
+ `orientation`/`angularVel`/`mass`/`ccd`/locks; bodies without these solve as
303
+ rotation-locked rigid bodies through the same pipeline. New step options
304
+ `joints` and `velocityIterations`; mutation helpers
305
+ `applyDeterministicImpulse3D` / `setDeterministicBodyVelocity3D`; contact
306
+ events carry `normalImpulse`. The contact/joint caches live in the world and
307
+ are therefore checksummed and rollback-safe.
308
+ - **Deterministic raycast-wheel vehicles.** `stepDeterministicVehicle3D` drives
309
+ a single dynamic chassis with N suspension raycasts (wheels are rays, not
310
+ bodies — Bullet/Godot raycast-vehicle lineage): spring-damper suspension,
311
+ friction-circle tire forces (drive/steer/brake from integer deci-unit input),
312
+ steering through the fixed-point `createDeterministicMath()` trig, and an
313
+ iterated Gauss-Seidel tire solve. The stateless controller returns quantized
314
+ impulses the game applies before the next physics step (the KCC pattern) —
315
+ use the batched `applyDeterministicImpulses3D` (one canonical-world rebuild
316
+ per frame; the per-impulse singular form costs an O(bodies) rebuild per
317
+ call); the checksum covers only load-bearing outputs
318
+ (impulses, grounded flags, compressions), never cosmetic telemetry. v1 targets
319
+ static ground with flat/axis-aligned contact normals; certified by the
320
+ required `physics-rigid-vehicle` fixture, a car in the `builtin-rigid` cert
321
+ arena, a rollback-every-frame synctest scene, and a 100%-coverage
322
+ `coverage:package:physics-vehicle` shard.
323
+ - **Accelerated deterministic queries.** Raycast, overlap, and shape-cast run
324
+ through a per-world static AABB tree (BVH) built lazily on first query and
325
+ memoized by world identity — pure derived data that never enters canonical
326
+ state, with bit-identical results to a full scan (the tree only prunes;
327
+ narrow-phase tests and id-tiebroken ordering are unchanged, proven by a
328
+ merged-single-body-world oracle test). Query cost is flat in world size:
329
+ 128 wheel-length raycasts cost ~0.2 ms whether the world holds 17 or 1,000
330
+ bodies (previously ~72 ms at 1,000).
261
331
  - Public deterministic 2D physics primitives for static/dynamic/kinematic AABB
262
332
  bodies, sensors/triggers, enter/stay/exit callbacks, layer masks,
263
- deterministic AABB and ray queries, material response, simple fixed/distance/
264
- spring/motor constraints, rollback-equivalent stepping, and budget metrics.
333
+ deterministic AABB and ray queries, material response (now including real
334
+ tangential friction), simple fixed/distance/spring/motor constraints,
335
+ rollback-equivalent stepping, and budget metrics.
265
336
  - Public deterministic movement primitives for KCC-like slopes, steps, ledges,
266
337
  moving platforms, elevators, one-way platforms, wall slides, jump buffering,
267
338
  coyote time, top-down acceleration/drag/sliding, nav steering, quantized FPS
@@ -648,9 +719,13 @@ materials, vectors, and interpolation floats stay outside replay checksums.
648
719
  - Built-in fixed physics certification includes package-local 2D/2.5D and 3D
649
720
  deterministic worlds with sensors/triggers, queries, layer masks, callbacks,
650
721
  constraints, CCD helpers, boxes, spheres, capsules, mesh static bounds,
651
- deterministic angular state, and 128/512/2048-body stress samples. Remaining
652
- limits are production-grade stacked rigid-body solving, visual collision
653
- authoring/import, and replacing external physics engines; Rapier cert
654
- currently fails with `knownIssueRapier910=reproduced`,
722
+ deterministic angular state, and 128/512/2048-body stress samples; the
723
+ `builtin-rigid` lane additionally certifies the sequential-impulse rigid-body
724
+ solver (stacking, joints, CCD) under the four determinism gates. Remaining
725
+ limits are visual collision authoring/import, convex-hull decomposition,
726
+ dynamic mesh-vs-mesh collision, ragdolls in checksummed state, and replacing
727
+ external physics engines; the ≤2 ms/step 128-body budget awaits an
728
+ allocation-free solver pass. Rapier cert currently fails with
729
+ `knownIssueRapier910=reproduced`,
655
730
  `uninterruptedChecksum=916fe725ae2e3215`, and
656
731
  `restoredChecksum=9e42622842bffff6`.
package/dist/browser.d.ts CHANGED
@@ -1,60 +1,92 @@
1
- export { verifyReplay } from './replay.js';
2
- export { verifyReplayWithDescriptor as verifyDeterministicReplay } from './replay.js';
1
+ export { cookDeterministicAnimation, createDeterministicAnimationRuntimeState, reconstructDeterministicAnimationEvents, stepDeterministicAnimation } from './animation.js';
2
+ export { assertAssetManifestMatches, cookDeterministicAssets, materializeDeterministicMapEntities, materializePrototypeEntities, stableAssetCookJson, validatePrototypeEntitiesAgainstFrameRuntime } from './asset-cooking.js';
3
+ export { createDeterministicAuthorityRoom } from './authority-room.js';
4
+ export { compileDeterministicBotDocument, summarizeDeterministicBotDocumentTraceCounterDelta, summarizeDeterministicBotDocumentTraceCoverage, traceDeterministicBotDocument } from './bot-documents.js';
5
+ export { cookDeterministicBotAsset, createDeterministicBotBlackboard, getBlackboardValue, runDeterministicBotSimulation, selectDeterministicUtility, tickDeterministicBehaviorTree, tickDeterministicBehaviorTreeWithMemory, tickDeterministicHfsm } from './bot-primitives.js';
6
+ export { canonicalize, canonicalStringify, cloneCanonical, decodeCanonicalBytes, decodeCanonicalValue, decodeUtf8, defaultChecksum, encodeCanonicalBytes, encodeUtf8 } from './canonical.js';
7
+ export { createStableIndexedMap, deterministicShuffle, stableEntries, stableSortedKeys } from './collections.js';
8
+ export { aabbContainsPoint, aabbIntersects, circleIntersects, circleIntersectsAabb, closestPointOnSegment, fixedAabb, fixedCircle, fixedVec2, orientation, pointOnSegment, segmentPointDistance, segmentSegmentDistance, segmentsIntersect, sortAabbsByStableId, translateAabb } from './collision.js';
9
+ export { assertDeterministicPayloadFields, createDeterministicCommandTimeline, createDeterministicCommandTimelineSnapshot, deterministicPayloadMatchesFields, evaluateDeterministicCommandTimelineMigrationResult } from './commands.js';
10
+ export { cookDeterministicConfigBundle, evaluateDeterministicConfigBundleParityResult, summarizeDeterministicConfigBundleFailureReasons, verifyDeterministicConfigBundle } from './config-bundle.js';
11
+ export { createDeterministicSessionCore, createDeterministicSessionReplayBundle, verifyDeterministicSessionRuntimeReplay } from './deterministic-session.js';
12
+ export { createDeterministicEventEffectsAdapter } from './effects-adapter.js';
13
+ export { assertDeterministicFrameHeapStaleHandleError, assertDeterministicFrameSystemsStateless, compileDeterministicDslRuntimeDescriptor, createDeterministicBitset, createDeterministicFrameRuntime, createDeterministicFrameRuntimeAccessors, createDeterministicSlotMap, createDeterministicSparseSetFrameRuntime, generateDeterministicFrameRuntimeSource, isDeterministicFrameHeapStaleHandleError, runDeterministicFrameRuntimeMutationCorpus, validateDeterministicFrameSystemsStateless } from './engine-runtime.js';
14
+ export { createDeterministicEventTimeline, filterDeterministicEventsForPlayer } from './events.js';
15
+ export { createInputAuthority } from './input-authority.js';
16
+ export { accumulateDeterministicInputTimelineState, evaluateDeterministicInputTimelineResult, sortDeterministicInputTimelineFlags } from './input-timeline.js';
17
+ export { createInstantReplayRunner, runInstantReplay } from './instant-replay.js';
18
+ export { buildDeterministicLagCompensatedHitboxProxies3D, createDeterministicLagCompensation3DHistory, rewindDeterministicLagCompensatedTargets3D, validateDeterministicAuthoritativeLagCompensatedShot3D, validateDeterministicLagCompensatedShot3D } from './lag-compensation3d.js';
19
+ export { createDeterministicLocalAuthorityRuntime } from './local-authority.js';
20
+ export { applyDeterministicLocalAuthorityCommandBundleEnvelope, applyDeterministicLocalAuthorityInputBundleEnvelope, createDeterministicLocalAuthorityAckEnvelope, createDeterministicLocalAuthorityCommandBundleEnvelope, createDeterministicLocalAuthorityCorrectionEnvelope, createDeterministicLocalAuthorityInputBundleEnvelope, createDeterministicLocalAuthoritySnapshotChunkEnvelope, createDeterministicLocalAuthoritySnapshotCompleteEnvelope, createDeterministicLocalAuthoritySnapshotEnvelope, createDeterministicLocalAuthoritySnapshotOfferEnvelope, createDeterministicLocalAuthoritySnapshotRequestEnvelope, createDeterministicLocalAuthoritySnapshotTransfer, createDeterministicLocalAuthorityWireAuth, createDeterministicLocalAuthorityWireReceiver, decodeDeterministicLocalAuthorityWireEnvelope, deterministicLocalAuthorityWireProtocol, encodeDeterministicLocalAuthorityWireEnvelope } from './local-authority-wire.js';
21
+ export { createDeterministicMath } from './math.js';
22
+ export { rewindDeterministicTargets, runDeterministicMovementCrowdSimulation, runDeterministicMovementSimulation, stepDeterministicFpsAim, stepDeterministicKcc2D, stepDeterministicTopDownMover, validateDeterministicLagCompensatedHit } from './movement.js';
23
+ export { stepDeterministicCarry3D, stepDeterministicKcc3D } from './movement3d.js';
24
+ export { createSyncplayClient } from './multiplayer-service.js';
25
+ export { applyDeterministicReciprocalAvoidance, cookDeterministicNavigationGraph, cookTilemapNavigationGraph, createDeterministicFlowField, findDeterministicPath, smoothDeterministicPath, stepDeterministicNavigationAgents } from './navigation.js';
26
+ export { cookDeterministicNavmesh, cookImportedDeterministicNavmesh, findDeterministicNavmeshPath, findDeterministicNavmeshPointPath, locateDeterministicNavmeshPolygon, runDeterministicNavmeshStress, smoothDeterministicNavmeshPath, stepDeterministicNavmeshAgents, stepDeterministicNavmeshOffMeshTraversal } from './navmesh.js';
27
+ export { createNetworkedSyncplayClient } from './networked-client.js';
28
+ export { fbm2D, hash2, hashUint32, valueNoise1D, valueNoise2D } from './noise.js';
3
29
  export { createOfflineSession } from './offline-session.js';
4
- export { createSyncplayOfflineRuntime } from './sdk-offline.js';
5
- export { createSyncplayOfflineRuntime as createSyncplayGameRuntime } from './sdk-offline.js';
30
+ export { createPauseController } from './pause-resume.js';
31
+ export { circleCastDeterministicPhysics2D, createDeterministicPhysicsWorld2D, nearestDeterministicPhysicsHit2D, queryDeterministicPhysicsAabb2D, queryDeterministicPhysicsShapeOverlap2D, raycastAllDeterministicPhysics2D, raycastDeterministicPhysics2D, stepDeterministicPhysicsWorld2D } from './physics2d.js';
32
+ export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, contactDetailsDeterministicPhysics3D, createDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
33
+ export { stepDeterministicVehicle3D } from './physics3d-vehicle.js';
34
+ export { createDeterministicR3fRenderAdapter as createDeterministicR3fAdapter, createDeterministicR3fRenderAdapter, interpolateDeterministicRenderNumber, interpolateDeterministicRenderVec2 } from './r3f-render-adapter.js';
35
+ export { verifyReplayWithDescriptor as verifyDeterministicReplay, verifyReplay } from './replay.js';
36
+ export { createDeterministicReplayBundle, createDeterministicReplayDebugTables, createDeterministicReplayRuntimeManifest, minimizeDeterministicReplayDesync, minimizeDeterministicReplayDesyncBundle, sliceDeterministicReplayBundle, verifyDeterministicFrameRuntimeReplayBundle, verifyDeterministicReplayBundle, verifyDeterministicSelfContainedFrameRuntimeReplayBundle, verifyReplayScoreAgainstTrustedRuntime } from './replay-bundle.js';
37
+ export { defineSyncplayGame, stableDescriptorId } from './schema.js';
38
+ export { createSchemaArtifacts } from './schema-artifacts.js';
39
+ export { createDeterministicDescriptorBinarySchema, generateSchemaBinarySource, generateSchemaTypes, proveSchemaBinaryRoundTrip } from './schema-codegen.js';
40
+ export { createDeterministicBinarySerializer, deterministicDslMaxPlayers, parseDeterministicSchemaDsl, stableDeterministicDslSchemaJson } from './schema-dsl-binary.js';
41
+ export { createSyncplayOfflineRuntime as createSyncplayGameRuntime, createSyncplayOfflineRuntime } from './sdk-offline.js';
6
42
  export { createSyncplaySession } from './sdk-session.js';
7
- export type { SyncplaySession, SyncplaySessionConfig, SyncplaySessionMode, OpenRoomTransport } from './sdk-session.js';
8
- export { runNumberLab } from './number-lab.js';
9
- export { runDeterministicEngineCoreNumericProof } from './engine-core-proof.js';
10
- export { hydrateLabInput, labDefaultInput, labStep } from './sample-lab.js';
11
- export { createFixedArenaDescriptor, createInitialFixedArenaState, fixedArenaDefaultInput, fixedArenaStep, projectFixedArenaReferenceView, projectFixedArenaRenderState, runFixedArenaExample, } from './examples/fixed-arena.js';
12
- export { createDeterministicR3fRenderAdapter as createDeterministicR3fAdapter, createDeterministicR3fRenderAdapter, interpolateDeterministicRenderNumber, interpolateDeterministicRenderVec2, } from './r3f-render-adapter.js';
13
- export * from './animation.js';
14
- export * from './asset-cooking.js';
15
- export * from './bot-documents.js';
16
- export * from './bot-primitives.js';
17
- export * from './canonical.js';
18
- export * from './collections.js';
19
- export * from './commands.js';
20
- export * from './config-bundle.js';
21
- export * from './deterministic-session.js';
22
- export * from './effects-adapter.js';
23
- export * from './engine-runtime.js';
24
- export * from './events.js';
25
- export { deterministicButtonInitialState, runDeterministicButtonFixture, runDeterministicDescriptorButtonFixture, stepDeterministicButton, } from './input-button.js';
26
- export type { DeterministicButtonFixtureResult, DeterministicButtonState, DeterministicButtonStep, DeterministicDescriptorButtonFixtureResult, } from './input-button.js';
27
- export * from './input-timeline.js';
28
- export * from './instant-replay.js';
29
- export * from './pause-resume.js';
30
- export * from './session-promotion.js';
31
- export * from './lag-compensation3d.js';
32
- export * from './local-authority.js';
33
- export * from './local-authority-wire.js';
34
- export * from './input-authority.js';
35
- export * from './session-wire.js';
36
- export * from './session-snapshot.js';
37
- export * from './authority-room.js';
38
- export * from './networked-client.js';
39
- export * from './math.js';
40
- export { createSyncplayClient } from './multiplayer-service.js';
41
- export type { DeterministicAuthorityCertificationArtifact, DeterministicAuthorityCertificationVerification, DeterministicAuthorityChecksums, SyncplayClient, SyncplayClientConnection, SyncplayClientRole, SyncplayCommand, SyncplayCommandPollOptions, SyncplayCommandSubmitResult, SyncplayInput, SyncplayLifecycleResult, SyncplaySubmitResult, } from './multiplayer-service.js';
42
- export * from './movement.js';
43
- export * from './movement3d.js';
44
- export * from './navigation.js';
45
- export * from './navmesh.js';
46
- export * from './collision.js';
47
- export * from './noise.js';
48
- export * from './physics2d.js';
49
- export * from './physics3d.js';
50
- export * from './replay-bundle.js';
51
- export * from './schema.js';
52
- export * from './schema-artifacts.js';
53
- export * from './schema-codegen.js';
54
- export * from './schema-dsl-binary.js';
55
- export * from './signals.js';
56
- export * from './sparse-set.js';
57
- export * from './sample-scenes.js';
58
- export * from './system-lifecycle.js';
59
- export type { DeterministicEngineCoreNumericProof, DeterministicEngineCoreNumericProofOptions } from './engine-core-proof.js';
43
+ export { createSessionFromPromotionSnapshot, exportPromotionSnapshot } from './session-promotion.js';
44
+ export { base64ToBytes, bytesToBase64, createSnapshotTransferCollector, createSnapshotTransferFromBytes, decodeDeterministicStateSnapshot, DEFAULT_MAX_SNAPSHOT_BYTES, DEFAULT_SNAPSHOT_CHUNK_SIZE, deterministicRoomDescriptorHash, encodeDeterministicStateSnapshot } from './session-snapshot.js';
45
+ export { decodeDeterministicSessionMessage, deterministicSessionWireVersion, encodeDeterministicSessionMessage } from './session-wire.js';
46
+ export { createDeterministicSignalBus } from './signals.js';
47
+ export { createDeterministicSparseSet } from './sparse-set.js';
48
+ export { createDeterministicLifecycleRunner, summarizeDeterministicLifecycleCounters } from './system-lifecycle.js';
49
+ export type { CookedDeterministicAnimation, DeterministicAnimationClip, DeterministicAnimationDescriptor, DeterministicAnimationLayer, DeterministicAnimationRuntimeState, DeterministicAnimationState, DeterministicAnimationStepResult, DeterministicAnimationTrack, DeterministicAnimationTransition } from './animation.js';
50
+ export type { DeterministicAssetCookManifest, DeterministicAssetCookResult, DeterministicAssetDependency, DeterministicAssetRecord, DeterministicAssetSource, DeterministicCookedAsset, DeterministicMapMaterializationResult, DeterministicPrototypeEntity, DeterministicPrototypeMaterializationOptions, DeterministicPrototypeRuntimeValidationResult } from './asset-cooking.js';
51
+ export type { AuthorityRoomCatchUpEvent, AuthorityRoomClientNetStats, AuthorityRoomDesyncInfo, AuthorityRoomJoinResult, AuthorityRoomNetcodeStats, AuthorityRoomSnapshot, AuthorityRoomSnapshotEvent, AuthorityRoomStoredSnapshotMeta, AuthorityRoomTransport, DeterministicAuthorityRoom, DeterministicAuthorityRoomConfig, DeterministicAuthorityRoomRestoreState } from './authority-room.js';
52
+ export type { CompiledDeterministicBotDocument, DeterministicBotDocument, DeterministicBotDocumentTrace, DeterministicBotDocumentTraceCounterDelta, DeterministicBotDocumentTraceCoverage } from './bot-documents.js';
53
+ export type { CookedDeterministicBotAsset, DeterministicBehaviorTreeMemory, DeterministicBehaviorTreeNode, DeterministicBehaviorTreeService, DeterministicBehaviorTreeStatefulTick, DeterministicBehaviorTreeStatus, DeterministicBehaviorTreeTick, DeterministicBlackboardEntry, DeterministicBlackboardValue, DeterministicBotAssetSource, DeterministicBotBlackboard, DeterministicBotSimulationMetrics, DeterministicHfsmAgent, DeterministicHfsmDefinition, DeterministicHfsmState, DeterministicHfsmTransition, DeterministicUtilityConsideration, DeterministicUtilityCurve, DeterministicUtilityNestedConsideration, DeterministicUtilitySelection } from './bot-primitives.js';
54
+ export type { CanonicalValue } from './canonical.js';
55
+ export type { StableIndexedEntry } from './collections.js';
56
+ export type { FixedAabb, FixedCircle, FixedVec2 } from './collision.js';
57
+ export type { DeterministicCommandChannelDescriptor, DeterministicCommandProtocolMetrics, DeterministicCommandTimeline, DeterministicCommandTimelineConfig, DeterministicCommandTimelineMigrationMetrics, DeterministicCommandTimelineMigrationResultInput, DeterministicCommandTimelineSnapshot, DeterministicPayloadFieldDescriptor, DeterministicPayloadFieldKind, DeterministicPlayerCommand, DeterministicRejectedCommand, DeterministicReliableCommandDefaultsMetrics } from './commands.js';
58
+ export type { CookedDeterministicConfigBundle, DeterministicConfigBundleFailureReasonInputs, DeterministicConfigBundleParityMetrics, DeterministicConfigBundleSource, DeterministicConfigBundleVerification, DeterministicConfigMigration } from './config-bundle.js';
59
+ export type { DeterministicSessionCore, DeterministicSessionInput, DeterministicSessionInputFlag, DeterministicSessionLifecycleEvent, DeterministicSessionOptions, DeterministicSessionPlayer, DeterministicSessionReplayBundle, DeterministicSessionReplayVerification, DeterministicSessionSnapshot } from './deterministic-session.js';
60
+ export type { DeterministicEffectDispatch, DeterministicEffectTarget, DeterministicEventEffectsAdapter, DeterministicEventEffectsAdapterConfig, DeterministicRenderSafeEffect } from './effects-adapter.js';
61
+ export type { DeterministicCommandAccessor, DeterministicComponentAccessor, DeterministicComponentData, DeterministicComponentDescriptor, DeterministicComponentFieldDescriptor, DeterministicComponentFieldKind, DeterministicComponentFixedArrayFieldKind, DeterministicComponentFrameHeapFieldKind, DeterministicComponentScalarFieldKind, DeterministicDslRuntimeCompileOptions, DeterministicEntityRef, DeterministicEventAccessor, DeterministicFrameHeapCollectionKind, DeterministicFrameHeapCollectionSnapshot, DeterministicFrameHeapHandle, DeterministicFrameHeapSnapshot, DeterministicFrameQueryFilter, DeterministicFrameRuntime, DeterministicFrameRuntimeAccessors, DeterministicFrameRuntimeDescriptor, DeterministicFrameRuntimeOptions, DeterministicFrameSnapshot, DeterministicQueryRow, DeterministicRuntimeMessage, DeterministicRuntimePayloadDescriptor, DeterministicRuntimeSignalHandler, DeterministicSignalAccessor, DeterministicSingletonAccessor, DeterministicStatelessSystemDiagnostic, DeterministicStatelessSystemDiagnosticReason, DeterministicStatelessSystemValidationResult, DeterministicSystem, DeterministicSystemContext, DeterministicSystemDescriptor } from './engine-runtime.js';
62
+ export type { DeterministicEventDeliveryScope, DeterministicEventEmitOptions, DeterministicEventPredictionState, DeterministicEventRecord, DeterministicEventTimeline } from './events.js';
63
+ export type { ConfirmedInputFrame, EncodedInput, InputAuthority, InputAuthorityConfig, InputAuthorityRestoreState, InputAuthorityStats, InputRejectionReason, InputSubmissionResult } from './input-authority.js';
64
+ export type { DeterministicInputTimelineAccumulatorState, DeterministicInputTimelineCorrection, DeterministicInputTimelineLane, DeterministicInputTimelineNegativeCases, DeterministicInputTimelineOptions, DeterministicInputTimelinePrediction, DeterministicInputTimelineReport, DeterministicInputTimelineRow, DeterministicInputTimelineVerification } from './input-timeline.js';
65
+ export type { InstantReplayInputFrame, InstantReplayResult, InstantReplayRunner, InstantReplayRunnerOptions, InstantReplayRunOptions, RunInstantReplayOptions } from './instant-replay.js';
66
+ export type { DeterministicAuthoritativeLagCompensation3DShotContext, DeterministicLagCompensatedPellet3DResult, DeterministicLagCompensatedShot3D, DeterministicLagCompensatedShot3DResult, DeterministicLagCompensatedTarget3D, DeterministicLagCompensation3DHistory, DeterministicLagCompensation3DHistoryOptions, DeterministicLagCompensation3DHistorySnapshot, DeterministicLagCompensation3DRewindSnapshot } from './lag-compensation3d.js';
67
+ export type { DeterministicLocalAuthorityClient, DeterministicLocalAuthorityInputMessage, DeterministicLocalAuthorityResult, DeterministicLocalAuthorityRuntime, DeterministicLocalAuthorityRuntimeOptions, DeterministicLocalAuthorityRuntimeSnapshot, DeterministicLocalAuthorityState } from './local-authority.js';
68
+ export type { DeterministicLocalAuthoritySnapshotIdentity, DeterministicLocalAuthoritySnapshotTransfer, DeterministicLocalAuthorityWireApplyResult, DeterministicLocalAuthorityWireAuth, DeterministicLocalAuthorityWireAuthOptions, DeterministicLocalAuthorityWireEnvelope, DeterministicLocalAuthorityWireKind, DeterministicLocalAuthorityWireReceiver, DeterministicLocalAuthorityWireReceiverOptions, DeterministicLocalAuthorityWireReceiverResult, DeterministicLocalAuthorityWireReceiverSnapshot, DeterministicLocalAuthorityWireSignOptions } from './local-authority-wire.js';
69
+ export type { DeterministicFixedQuaternion, DeterministicFixedVec2, DeterministicFixedVec3, DeterministicMath } from './math.js';
70
+ export type { DeterministicFpsAimState, DeterministicFpsInput, DeterministicKccBody, DeterministicKccInput, DeterministicKccStepResult, DeterministicLagCompensatedHitValidation, DeterministicLagCompensatedShot, DeterministicMovementCrowdMetrics, DeterministicMovementSimulationMetrics, DeterministicMovementStep, DeterministicMovementWorld, DeterministicMovingPlatform, DeterministicOneWayPlatform, DeterministicSlope, DeterministicTargetSnapshot, DeterministicTopDownBody, DeterministicTopDownBounds, DeterministicTopDownInput } from './movement.js';
71
+ export type { DeterministicKccBody3D, DeterministicKccCarrierPose3D, DeterministicKccCarryResult3D, DeterministicKccCarryState3D, DeterministicKccCollisionCandidate3D, DeterministicKccCollisionFilter3D, DeterministicKccExternalImpulse3D, DeterministicKccGeometry3D, DeterministicKccInput3D, DeterministicKccPhysicsImpulse3D, DeterministicKccProcessor3D, DeterministicKccStepResult3D, DeterministicKccWorld3D, DeterministicMovingPlatform3D, DeterministicSlope3D, DeterministicStep3D } from './movement3d.js';
72
+ export type { DeterministicAuthorityCertificationArtifact, DeterministicAuthorityCertificationVerification, DeterministicAuthorityChecksums, SyncplayClient, SyncplayClientConnection, SyncplayClientRole, SyncplayCommand, SyncplayCommandPollOptions, SyncplayCommandSubmitResult, SyncplayInput, SyncplayLifecycleResult, SyncplaySubmitResult } from './multiplayer-service.js';
73
+ export type { CookedDeterministicNavigationGraph, DeterministicFlowField, DeterministicNavEdge, DeterministicNavigationAgent, DeterministicNavigationGraphSource, DeterministicNavigationStepOptions, DeterministicNavigationStepResult, DeterministicNavNode, DeterministicNavRegion, DeterministicPathQuery, DeterministicPathResult, DeterministicTilemapSource } from './navigation.js';
74
+ export type { CookedDeterministicNavmesh, DeterministicNavmeshAgent, DeterministicNavmeshAgentStepResult, DeterministicNavmeshImportSource, DeterministicNavmeshLink, DeterministicNavmeshMovingAvoidanceObstacle, DeterministicNavmeshOffMeshTraversalState, DeterministicNavmeshOffMeshTraversalStep, DeterministicNavmeshPath, DeterministicNavmeshPoint, DeterministicNavmeshPolygon, DeterministicNavmeshSource } from './navmesh.js';
75
+ export type { NetworkedClientTransport, NetworkedSyncplayClient, NetworkedSyncplayClientInputDelayOptions, NetworkedSyncplayClientNetStats, NetworkedSyncplayClientOptions, NetworkedSyncplayClientPacingOptions } from './networked-client.js';
76
+ export type { DeterministicPauseController, DeterministicPauseState, DeterministicPauseStatus, PauseControllerOptions, PauseWrappedState } from './pause-resume.js';
77
+ export type { DeterministicBodyKind, DeterministicContactEvent2D, DeterministicContactEventType, DeterministicPhysicsAabbQuery2D, DeterministicPhysicsActivePair2D, DeterministicPhysicsBody2D, DeterministicPhysicsCircleCastQuery2D, DeterministicPhysicsConstraint2D, DeterministicPhysicsHit2D, DeterministicPhysicsQueryOptions2D, DeterministicPhysicsRaycastQuery2D, DeterministicPhysicsShape2D, DeterministicPhysicsShapeOverlapQuery2D, DeterministicPhysicsStepOptions2D, DeterministicPhysicsStepResult2D, DeterministicPhysicsWorld2D } from './physics2d.js';
78
+ export type { DeterministicContactCacheEntry3D, DeterministicJointCacheEntry3D, DeterministicPhysicsActivePair3D, DeterministicPhysicsAxisLock3D, DeterministicPhysicsBody3D, DeterministicPhysicsCallbackMask3D, DeterministicPhysicsCompoundChild3D, DeterministicPhysicsCompoundChildShape3D, DeterministicPhysicsConstraint3D, DeterministicPhysicsContactDetail3D, DeterministicPhysicsContactEvent3D, DeterministicPhysicsDetailedHit3D, DeterministicPhysicsHit3D, DeterministicPhysicsHullShape3D, DeterministicPhysicsImpulseApplication3D, DeterministicPhysicsOverlapQuery3D, DeterministicPhysicsPrimitiveShape3D, DeterministicPhysicsQuaternion3D, DeterministicPhysicsQueryOptions3D, DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsScheduledQuery3D, DeterministicPhysicsShape3D, DeterministicPhysicsShapeCastQuery3D, DeterministicPhysicsStepResult3D, DeterministicPhysicsVec3, DeterministicPhysicsWorld3D } from './physics3d.js';
79
+ export type { DeterministicPhysicsJoint3D } from './physics3d-joints.js';
80
+ export type { DeterministicVehicle3D, DeterministicVehicleImpulse3D, DeterministicVehicleInput3D, DeterministicVehicleStepOptions3D, DeterministicVehicleStepResult3D, DeterministicVehicleWheel3D, DeterministicVehicleWheelTelemetry3D } from './physics3d-vehicle.js';
81
+ export type { DeterministicFrameRuntimeReplayBundleOptions, DeterministicFrameRuntimeReplayBundleVerification, DeterministicReplayBundle, DeterministicReplayBundleMismatch, DeterministicReplayBundleVerification, DeterministicReplayDebugTables, DeterministicReplayDesyncMinimization, DeterministicReplayRuntimeBeforeFrameId, DeterministicReplayRuntimeManifest, DeterministicReplayRuntimeManifestSource, DeterministicReplayRuntimeSystemId, DeterministicReplaySemanticModel, DeterministicReplaySemanticOperation, DeterministicReplaySliceOrigin, DeterministicReplaySnapshot, DeterministicReplayVerificationManifest, ReplayScoreVerificationReason, ReplayScoreVerificationResult } from './replay-bundle.js';
82
+ export type { AssetDescriptor, CollectionOrdering, CommandChannelDescriptor, ConfigDescriptor, DeterministicGameDescriptor, EventDescriptor, InputFieldDescriptor, InputFieldPolicy, NumericMode, PrototypeDescriptor, SchemaFieldDescriptor, SchemaFieldKind, StateFieldDescriptor, SystemDescriptor, ValidatedDeterministicGameDescriptor } from './schema.js';
83
+ export type { DeterministicSchemaArtifacts, SchemaFrameDump } from './schema-artifacts.js';
84
+ export type { SchemaBinaryProof, SchemaBinarySourceOptions, SchemaTypesOptions } from './schema-codegen.js';
85
+ export type { DeterministicBinarySerializer, DeterministicDslDeclaration, DeterministicDslDeclarationKind, DeterministicDslDictionaryEntry, DeterministicDslDictionaryFieldKind, DeterministicDslField, DeterministicDslFieldKind, DeterministicDslFixedArrayFieldKind, DeterministicDslListFieldKind, DeterministicDslScalarFieldKind, DeterministicDslScalarValue, DeterministicDslSchema, DeterministicDslSetFieldKind, DeterministicDslValue } from './schema-dsl-binary.js';
86
+ export type { OpenRoomTransport, SyncplaySession, SyncplaySessionConfig, SyncplaySessionMode } from './sdk-session.js';
87
+ export type { CollectedSnapshotTransfer, CreateSnapshotTransferOptions, DeterministicStateSnapshot, DeterministicStateSnapshotDecodeRejection, DeterministicStateSnapshotDecodeResult, SnapshotTransferCollector, SnapshotTransferCollectorOptions, SnapshotTransferCompleteResult, SnapshotTransferRejection, SnapshotTransferStepResult } from './session-snapshot.js';
88
+ export type { DeterministicSessionDecodeRejection, DeterministicSessionDecodeResult, DeterministicSessionMessage, DeterministicSessionMessageKind, DeterministicSessionRole } from './session-wire.js';
89
+ export type { DeterministicSignal, DeterministicSignalBus, DeterministicSignalBusSnapshot, DeterministicSignalSubscription } from './signals.js';
90
+ export type { DeterministicSparseSet, DeterministicSparseSetSnapshot } from './sparse-set.js';
91
+ export type { DeterministicLifecycleCounterSummary, DeterministicLifecycleRunner, DeterministicLifecycleSignal, DeterministicLifecycleSnapshot, DeterministicLifecycleSystemContext, DeterministicLifecycleSystemDescriptor, DeterministicLifecycleSystemHooks } from './system-lifecycle.js';
60
92
  export type { DeterministicStep, ReplayFile, ReplayVerificationResult } from './types.js';
package/dist/browser.js CHANGED
@@ -1,55 +1,49 @@
1
- export { verifyReplay } from './replay.js';
2
- export { verifyReplayWithDescriptor as verifyDeterministicReplay } from './replay.js';
1
+ // Curated public surface — every export here is supported API. Additions require regenerating tests/golden/export-surface.json.
2
+ export { cookDeterministicAnimation, createDeterministicAnimationRuntimeState, reconstructDeterministicAnimationEvents, stepDeterministicAnimation } from './animation.js';
3
+ export { assertAssetManifestMatches, cookDeterministicAssets, materializeDeterministicMapEntities, materializePrototypeEntities, stableAssetCookJson, validatePrototypeEntitiesAgainstFrameRuntime } from './asset-cooking.js';
4
+ export { createDeterministicAuthorityRoom } from './authority-room.js';
5
+ export { compileDeterministicBotDocument, summarizeDeterministicBotDocumentTraceCounterDelta, summarizeDeterministicBotDocumentTraceCoverage, traceDeterministicBotDocument } from './bot-documents.js';
6
+ export { cookDeterministicBotAsset, createDeterministicBotBlackboard, getBlackboardValue, runDeterministicBotSimulation, selectDeterministicUtility, tickDeterministicBehaviorTree, tickDeterministicBehaviorTreeWithMemory, tickDeterministicHfsm } from './bot-primitives.js';
7
+ export { canonicalize, canonicalStringify, cloneCanonical, decodeCanonicalBytes, decodeCanonicalValue, decodeUtf8, defaultChecksum, encodeCanonicalBytes, encodeUtf8 } from './canonical.js';
8
+ export { createStableIndexedMap, deterministicShuffle, stableEntries, stableSortedKeys } from './collections.js';
9
+ export { aabbContainsPoint, aabbIntersects, circleIntersects, circleIntersectsAabb, closestPointOnSegment, fixedAabb, fixedCircle, fixedVec2, orientation, pointOnSegment, segmentPointDistance, segmentSegmentDistance, segmentsIntersect, sortAabbsByStableId, translateAabb } from './collision.js';
10
+ export { assertDeterministicPayloadFields, createDeterministicCommandTimeline, createDeterministicCommandTimelineSnapshot, deterministicPayloadMatchesFields, evaluateDeterministicCommandTimelineMigrationResult } from './commands.js';
11
+ export { cookDeterministicConfigBundle, evaluateDeterministicConfigBundleParityResult, summarizeDeterministicConfigBundleFailureReasons, verifyDeterministicConfigBundle } from './config-bundle.js';
12
+ export { createDeterministicSessionCore, createDeterministicSessionReplayBundle, verifyDeterministicSessionRuntimeReplay } from './deterministic-session.js';
13
+ export { createDeterministicEventEffectsAdapter } from './effects-adapter.js';
14
+ export { assertDeterministicFrameHeapStaleHandleError, assertDeterministicFrameSystemsStateless, compileDeterministicDslRuntimeDescriptor, createDeterministicBitset, createDeterministicFrameRuntime, createDeterministicFrameRuntimeAccessors, createDeterministicSlotMap, createDeterministicSparseSetFrameRuntime, generateDeterministicFrameRuntimeSource, isDeterministicFrameHeapStaleHandleError, runDeterministicFrameRuntimeMutationCorpus, validateDeterministicFrameSystemsStateless } from './engine-runtime.js';
15
+ export { createDeterministicEventTimeline, filterDeterministicEventsForPlayer } from './events.js';
16
+ export { createInputAuthority } from './input-authority.js';
17
+ export { accumulateDeterministicInputTimelineState, evaluateDeterministicInputTimelineResult, sortDeterministicInputTimelineFlags } from './input-timeline.js';
18
+ export { createInstantReplayRunner, runInstantReplay } from './instant-replay.js';
19
+ export { buildDeterministicLagCompensatedHitboxProxies3D, createDeterministicLagCompensation3DHistory, rewindDeterministicLagCompensatedTargets3D, validateDeterministicAuthoritativeLagCompensatedShot3D, validateDeterministicLagCompensatedShot3D } from './lag-compensation3d.js';
20
+ export { createDeterministicLocalAuthorityRuntime } from './local-authority.js';
21
+ export { applyDeterministicLocalAuthorityCommandBundleEnvelope, applyDeterministicLocalAuthorityInputBundleEnvelope, createDeterministicLocalAuthorityAckEnvelope, createDeterministicLocalAuthorityCommandBundleEnvelope, createDeterministicLocalAuthorityCorrectionEnvelope, createDeterministicLocalAuthorityInputBundleEnvelope, createDeterministicLocalAuthoritySnapshotChunkEnvelope, createDeterministicLocalAuthoritySnapshotCompleteEnvelope, createDeterministicLocalAuthoritySnapshotEnvelope, createDeterministicLocalAuthoritySnapshotOfferEnvelope, createDeterministicLocalAuthoritySnapshotRequestEnvelope, createDeterministicLocalAuthoritySnapshotTransfer, createDeterministicLocalAuthorityWireAuth, createDeterministicLocalAuthorityWireReceiver, decodeDeterministicLocalAuthorityWireEnvelope, deterministicLocalAuthorityWireProtocol, encodeDeterministicLocalAuthorityWireEnvelope } from './local-authority-wire.js';
22
+ export { createDeterministicMath } from './math.js';
23
+ export { rewindDeterministicTargets, runDeterministicMovementCrowdSimulation, runDeterministicMovementSimulation, stepDeterministicFpsAim, stepDeterministicKcc2D, stepDeterministicTopDownMover, validateDeterministicLagCompensatedHit } from './movement.js';
24
+ export { stepDeterministicCarry3D, stepDeterministicKcc3D } from './movement3d.js';
25
+ export { createSyncplayClient } from './multiplayer-service.js';
26
+ export { applyDeterministicReciprocalAvoidance, cookDeterministicNavigationGraph, cookTilemapNavigationGraph, createDeterministicFlowField, findDeterministicPath, smoothDeterministicPath, stepDeterministicNavigationAgents } from './navigation.js';
27
+ export { cookDeterministicNavmesh, cookImportedDeterministicNavmesh, findDeterministicNavmeshPath, findDeterministicNavmeshPointPath, locateDeterministicNavmeshPolygon, runDeterministicNavmeshStress, smoothDeterministicNavmeshPath, stepDeterministicNavmeshAgents, stepDeterministicNavmeshOffMeshTraversal } from './navmesh.js';
28
+ export { createNetworkedSyncplayClient } from './networked-client.js';
29
+ export { fbm2D, hash2, hashUint32, valueNoise1D, valueNoise2D } from './noise.js';
3
30
  export { createOfflineSession } from './offline-session.js';
4
- export { createSyncplayOfflineRuntime } from './sdk-offline.js';
5
- export { createSyncplayOfflineRuntime as createSyncplayGameRuntime } from './sdk-offline.js';
31
+ export { createPauseController } from './pause-resume.js';
32
+ export { circleCastDeterministicPhysics2D, createDeterministicPhysicsWorld2D, nearestDeterministicPhysicsHit2D, queryDeterministicPhysicsAabb2D, queryDeterministicPhysicsShapeOverlap2D, raycastAllDeterministicPhysics2D, raycastDeterministicPhysics2D, stepDeterministicPhysicsWorld2D } from './physics2d.js';
33
+ export { applyDeterministicImpulse3D, applyDeterministicImpulses3D, contactDetailsDeterministicPhysics3D, createDeterministicPhysicsWorld3D, deriveInverseInertia, deterministicPhysicsBodyById3D, deterministicPhysicsCallback3D, overlapDeterministicPhysics3D, raycastDeterministicPhysics3D, raycastDeterministicPhysics3DDetailed, runDeterministicPhysics3DStress, setDeterministicBodyVelocity3D, shapeCastDeterministicPhysics3D, shapeCastDeterministicPhysics3DDetailed, stepDeterministicPhysicsWorld3D } from './physics3d.js';
34
+ export { stepDeterministicVehicle3D } from './physics3d-vehicle.js';
35
+ export { createDeterministicR3fRenderAdapter as createDeterministicR3fAdapter, createDeterministicR3fRenderAdapter, interpolateDeterministicRenderNumber, interpolateDeterministicRenderVec2 } from './r3f-render-adapter.js';
36
+ export { verifyReplayWithDescriptor as verifyDeterministicReplay, verifyReplay } from './replay.js';
37
+ export { createDeterministicReplayBundle, createDeterministicReplayDebugTables, createDeterministicReplayRuntimeManifest, minimizeDeterministicReplayDesync, minimizeDeterministicReplayDesyncBundle, sliceDeterministicReplayBundle, verifyDeterministicFrameRuntimeReplayBundle, verifyDeterministicReplayBundle, verifyDeterministicSelfContainedFrameRuntimeReplayBundle, verifyReplayScoreAgainstTrustedRuntime } from './replay-bundle.js';
38
+ export { defineSyncplayGame, stableDescriptorId } from './schema.js';
39
+ export { createSchemaArtifacts } from './schema-artifacts.js';
40
+ export { createDeterministicDescriptorBinarySchema, generateSchemaBinarySource, generateSchemaTypes, proveSchemaBinaryRoundTrip } from './schema-codegen.js';
41
+ export { createDeterministicBinarySerializer, deterministicDslMaxPlayers, parseDeterministicSchemaDsl, stableDeterministicDslSchemaJson } from './schema-dsl-binary.js';
42
+ export { createSyncplayOfflineRuntime as createSyncplayGameRuntime, createSyncplayOfflineRuntime } from './sdk-offline.js';
6
43
  export { createSyncplaySession } from './sdk-session.js';
7
- export { runNumberLab } from './number-lab.js';
8
- export { runDeterministicEngineCoreNumericProof } from './engine-core-proof.js';
9
- export { hydrateLabInput, labDefaultInput, labStep } from './sample-lab.js';
10
- export { createFixedArenaDescriptor, createInitialFixedArenaState, fixedArenaDefaultInput, fixedArenaStep, projectFixedArenaReferenceView, projectFixedArenaRenderState, runFixedArenaExample, } from './examples/fixed-arena.js';
11
- export { createDeterministicR3fRenderAdapter as createDeterministicR3fAdapter, createDeterministicR3fRenderAdapter, interpolateDeterministicRenderNumber, interpolateDeterministicRenderVec2, } from './r3f-render-adapter.js';
12
- export * from './animation.js';
13
- export * from './asset-cooking.js';
14
- export * from './bot-documents.js';
15
- export * from './bot-primitives.js';
16
- export * from './canonical.js';
17
- export * from './collections.js';
18
- export * from './commands.js';
19
- export * from './config-bundle.js';
20
- export * from './deterministic-session.js';
21
- export * from './effects-adapter.js';
22
- export * from './engine-runtime.js';
23
- export * from './events.js';
24
- export { deterministicButtonInitialState, runDeterministicButtonFixture, runDeterministicDescriptorButtonFixture, stepDeterministicButton, } from './input-button.js';
25
- export * from './input-timeline.js';
26
- export * from './instant-replay.js';
27
- export * from './pause-resume.js';
28
- export * from './session-promotion.js';
29
- export * from './lag-compensation3d.js';
30
- export * from './local-authority.js';
31
- export * from './local-authority-wire.js';
32
- export * from './input-authority.js';
33
- export * from './session-wire.js';
34
- export * from './session-snapshot.js';
35
- export * from './authority-room.js';
36
- export * from './networked-client.js';
37
- export * from './math.js';
38
- export { createSyncplayClient } from './multiplayer-service.js';
39
- export * from './movement.js';
40
- export * from './movement3d.js';
41
- export * from './navigation.js';
42
- export * from './navmesh.js';
43
- export * from './collision.js';
44
- export * from './noise.js';
45
- export * from './physics2d.js';
46
- export * from './physics3d.js';
47
- export * from './replay-bundle.js';
48
- export * from './schema.js';
49
- export * from './schema-artifacts.js';
50
- export * from './schema-codegen.js';
51
- export * from './schema-dsl-binary.js';
52
- export * from './signals.js';
53
- export * from './sparse-set.js';
54
- export * from './sample-scenes.js';
55
- export * from './system-lifecycle.js';
44
+ export { createSessionFromPromotionSnapshot, exportPromotionSnapshot } from './session-promotion.js';
45
+ export { base64ToBytes, bytesToBase64, createSnapshotTransferCollector, createSnapshotTransferFromBytes, decodeDeterministicStateSnapshot, DEFAULT_MAX_SNAPSHOT_BYTES, DEFAULT_SNAPSHOT_CHUNK_SIZE, deterministicRoomDescriptorHash, encodeDeterministicStateSnapshot } from './session-snapshot.js';
46
+ export { decodeDeterministicSessionMessage, deterministicSessionWireVersion, encodeDeterministicSessionMessage } from './session-wire.js';
47
+ export { createDeterministicSignalBus } from './signals.js';
48
+ export { createDeterministicSparseSet } from './sparse-set.js';
49
+ export { createDeterministicLifecycleRunner, summarizeDeterministicLifecycleCounters } from './system-lifecycle.js';
@@ -1,6 +1,6 @@
1
1
  import { runPredictionCullingLab } from './prediction-culling.js';
2
2
  import { type ProtocolRollbackGame } from './protocol-lab.js';
3
- export type CertificationFixtureKind = 'event-callbacks' | 'bot-replacement' | 'ecs-lite' | 'external-physics-gate' | 'fixed-foundation' | 'genre-128' | 'kcc-lite' | 'navigation-grid' | 'netcode' | 'physics-builtin' | 'prediction-culling' | 'projectile-hitscan' | 'protocol-matrix' | 'reference-samples' | 'replay-node' | 'replay-browser' | 'schema-tooling' | 'static-analysis';
3
+ export type CertificationFixtureKind = 'event-callbacks' | 'bot-replacement' | 'ecs-lite' | 'external-physics-gate' | 'fixed-foundation' | 'genre-128' | 'kcc-lite' | 'navigation-grid' | 'netcode' | 'physics-builtin' | 'physics-rigid-vehicle' | 'prediction-culling' | 'projectile-hitscan' | 'protocol-matrix' | 'reference-samples' | 'replay-node' | 'replay-browser' | 'schema-tooling' | 'static-analysis';
4
4
  export type CertificationRuntimeTarget = 'node' | 'chromium' | 'webkit';
5
5
  export type CertificationResult = 'pass' | 'fail' | 'skip';
6
6
  export type CertificationNetcodeShape = 'input-minimal' | 'moderate-state' | 'command-bursts';
@@ -22,7 +22,7 @@ export interface CertificationManifest {
22
22
  readonly fixtures?: readonly CertificationFixture[];
23
23
  }
24
24
  export type CertificationFixtureTier = 'required' | 'optional' | 'experimental' | 'optional-browser' | 'optional-integration' | 'stress';
25
- export type CertificationFixture = CertificationBotReplacementFixture | CertificationEcsLiteFixture | CertificationExternalPhysicsGateFixture | CertificationEventCallbacksFixture | CertificationFixedFoundationFixture | CertificationGenre128Fixture | CertificationKccLiteFixture | CertificationNavigationGridFixture | CertificationNetcodeFixture | CertificationPhysicsBuiltinFixture | CertificationPredictionCullingFixture | CertificationProjectileHitscanFixture | CertificationProtocolMatrixFixture | CertificationReferenceSamplesFixture | CertificationReplayNodeFixture | CertificationSchemaToolingFixture | CertificationStaticAnalysisFixture | CertificationBrowserReplayFixture;
25
+ export type CertificationFixture = CertificationBotReplacementFixture | CertificationEcsLiteFixture | CertificationExternalPhysicsGateFixture | CertificationEventCallbacksFixture | CertificationFixedFoundationFixture | CertificationGenre128Fixture | CertificationKccLiteFixture | CertificationNavigationGridFixture | CertificationNetcodeFixture | CertificationPhysicsBuiltinFixture | CertificationPhysicsRigidVehicleFixture | CertificationPredictionCullingFixture | CertificationProjectileHitscanFixture | CertificationProtocolMatrixFixture | CertificationReferenceSamplesFixture | CertificationReplayNodeFixture | CertificationSchemaToolingFixture | CertificationStaticAnalysisFixture | CertificationBrowserReplayFixture;
26
26
  export interface CertificationFixtureBase {
27
27
  readonly fixtureId: string;
28
28
  readonly kind: CertificationFixtureKind;
@@ -66,6 +66,12 @@ export interface CertificationEventCallbacksFixture extends CertificationFixture
66
66
  export interface CertificationPhysicsBuiltinFixture extends CertificationFixtureBase {
67
67
  readonly kind: 'physics-builtin';
68
68
  readonly runtimeTarget?: 'node';
69
+ /** Physics engine lane to certify (defaults to the fixed-point circle lane). */
70
+ readonly engine?: 'builtin-fixed' | 'builtin-rigid';
71
+ }
72
+ export interface CertificationPhysicsRigidVehicleFixture extends CertificationFixtureBase {
73
+ readonly kind: 'physics-rigid-vehicle';
74
+ readonly runtimeTarget?: 'node';
69
75
  }
70
76
  export interface CertificationPredictionCullingFixture extends CertificationFixtureBase {
71
77
  readonly kind: 'prediction-culling';
@@ -142,7 +148,7 @@ export interface CertificationFixtureReport {
142
148
  readonly failures: readonly string[];
143
149
  readonly result: CertificationResult;
144
150
  }
145
- export type CertificationMetrics = CertificationBotReplacementMetrics | CertificationEcsLiteMetrics | CertificationExternalPhysicsGateMetrics | CertificationEventCallbacksMetrics | CertificationFixedFoundationMetrics | CertificationGenre128Metrics | CertificationKccLiteMetrics | CertificationNavigationGridMetrics | CertificationNetcodeMetrics | CertificationPhysicsBuiltinMetrics | CertificationPredictionCullingMetrics | CertificationProjectileHitscanMetrics | CertificationProtocolMatrixMetrics | CertificationReferenceSamplesMetrics | CertificationReplayNodeMetrics | CertificationSchemaToolingMetrics | CertificationStaticAnalysisMetrics | CertificationBrowserReplayMetrics;
151
+ export type CertificationMetrics = CertificationBotReplacementMetrics | CertificationEcsLiteMetrics | CertificationExternalPhysicsGateMetrics | CertificationEventCallbacksMetrics | CertificationFixedFoundationMetrics | CertificationGenre128Metrics | CertificationKccLiteMetrics | CertificationNavigationGridMetrics | CertificationNetcodeMetrics | CertificationPhysicsBuiltinMetrics | CertificationPhysicsRigidVehicleMetrics | CertificationPredictionCullingMetrics | CertificationProjectileHitscanMetrics | CertificationProtocolMatrixMetrics | CertificationReferenceSamplesMetrics | CertificationReplayNodeMetrics | CertificationSchemaToolingMetrics | CertificationStaticAnalysisMetrics | CertificationBrowserReplayMetrics;
146
152
  export interface CertificationNetcodeMetrics {
147
153
  readonly shape: CertificationNetcodeShape;
148
154
  readonly game: ProtocolRollbackGame;
@@ -320,6 +326,17 @@ export interface CertificationKccLiteMetrics {
320
326
  readonly finalChecksum: string;
321
327
  readonly checksumConverged: boolean;
322
328
  }
329
+ export interface CertificationPhysicsRigidVehicleMetrics {
330
+ readonly checksum: string;
331
+ readonly restoredChecksum: string;
332
+ readonly permutedChecksum: string;
333
+ readonly rollbackEquivalent: boolean;
334
+ readonly stableUnderAuthoringOrderPermutation: boolean;
335
+ readonly impulseSamples: number;
336
+ readonly groundedWheelSamples: number;
337
+ readonly impulsesQuantizedClean: boolean;
338
+ readonly checksumConverged: boolean;
339
+ }
323
340
  export interface CertificationNavigationGridMetrics {
324
341
  readonly pathChecksum: string;
325
342
  readonly pathsFound: number;
@@ -5,6 +5,7 @@ import { createDeterministicEventTimeline } from './events.js';
5
5
  import { createDeterministicMath } from './math.js';
6
6
  import { valueNoise2D } from './noise.js';
7
7
  import { runPhysicsCert } from './physics-cert.js';
8
+ import { runDeterministicVehicle3DFixture } from './physics3d-vehicle.js';
8
9
  import { runPredictionCullingLab } from './prediction-culling.js';
9
10
  import { runProtocolRollbackLab } from './protocol-lab.js';
10
11
  import { DeterministicRandom } from './random.js';
@@ -80,6 +81,60 @@ export function createDefaultCertificationManifest() {
80
81
  requireChecksumConvergence: true,
81
82
  },
82
83
  },
84
+ {
85
+ fixtureId: 'physics-rigid-stack',
86
+ kind: 'physics-builtin',
87
+ engine: 'builtin-rigid',
88
+ required: true,
89
+ runtimeTarget: 'node',
90
+ players: 4,
91
+ frames: 300,
92
+ seed: 7,
93
+ budgets: { requireChecksumConvergence: true },
94
+ },
95
+ {
96
+ fixtureId: 'physics-rigid-sleep',
97
+ kind: 'physics-builtin',
98
+ engine: 'builtin-rigid',
99
+ required: true,
100
+ runtimeTarget: 'node',
101
+ players: 2,
102
+ frames: 400,
103
+ seed: 3,
104
+ budgets: { requireChecksumConvergence: true },
105
+ },
106
+ {
107
+ fixtureId: 'physics-rigid-joints',
108
+ kind: 'physics-builtin',
109
+ engine: 'builtin-rigid',
110
+ required: true,
111
+ runtimeTarget: 'node',
112
+ players: 4,
113
+ frames: 200,
114
+ seed: 11,
115
+ budgets: { requireChecksumConvergence: true },
116
+ },
117
+ {
118
+ fixtureId: 'physics-rigid-ccd',
119
+ kind: 'physics-builtin',
120
+ engine: 'builtin-rigid',
121
+ required: true,
122
+ runtimeTarget: 'node',
123
+ players: 6,
124
+ frames: 120,
125
+ seed: 5,
126
+ budgets: { requireChecksumConvergence: true },
127
+ },
128
+ {
129
+ fixtureId: 'physics-rigid-vehicle',
130
+ kind: 'physics-rigid-vehicle',
131
+ required: true,
132
+ runtimeTarget: 'node',
133
+ players: 2,
134
+ frames: 120,
135
+ seed: 7,
136
+ budgets: { requireChecksumConvergence: true },
137
+ },
83
138
  {
84
139
  fixtureId: 'prediction-culling',
85
140
  kind: 'prediction-culling',
@@ -260,6 +315,9 @@ function runCertificationFixture(manifest, fixture) {
260
315
  if (fixture.kind === 'physics-builtin') {
261
316
  return runPhysicsBuiltinFixture(manifest, fixture);
262
317
  }
318
+ if (fixture.kind === 'physics-rigid-vehicle') {
319
+ return runPhysicsRigidVehicleFixture(manifest, fixture);
320
+ }
263
321
  if (fixture.kind === 'prediction-culling') {
264
322
  return runPredictionCullingFixture(manifest, fixture);
265
323
  }
@@ -479,12 +537,12 @@ function runEventCallbacksFixture(manifest, fixture) {
479
537
  }
480
538
  function runPhysicsBuiltinFixture(manifest, fixture) {
481
539
  const result = runPhysicsCert({
482
- engine: 'builtin-fixed',
540
+ engine: fixture.engine ?? 'builtin-fixed',
483
541
  shape: 'fixed-arena',
484
542
  players: fixture.players,
485
543
  frames: fixture.frames,
486
544
  seed: fixture.seed,
487
- snapshotEvery: 1,
545
+ snapshotEvery: fixture.engine === 'builtin-rigid' ? 8 : 1,
488
546
  });
489
547
  const metrics = {
490
548
  engine: result.engine,
@@ -500,6 +558,24 @@ function runPhysicsBuiltinFixture(manifest, fixture) {
500
558
  };
501
559
  return createFixtureReport(manifest, fixture, metrics, metrics.result);
502
560
  }
561
+ function runPhysicsRigidVehicleFixture(manifest, fixture) {
562
+ const result = runDeterministicVehicle3DFixture(fixture.frames);
563
+ const metrics = {
564
+ checksum: result.checksum,
565
+ restoredChecksum: result.restoredChecksum,
566
+ permutedChecksum: result.permutedChecksum,
567
+ rollbackEquivalent: result.rollbackEquivalent,
568
+ stableUnderAuthoringOrderPermutation: result.stableUnderAuthoringOrderPermutation,
569
+ impulseSamples: result.impulseSamples,
570
+ groundedWheelSamples: result.groundedWheelSamples,
571
+ impulsesQuantizedClean: result.impulsesQuantizedClean,
572
+ checksumConverged: result.rollbackEquivalent
573
+ && result.stableUnderAuthoringOrderPermutation
574
+ && result.impulseSamples > 0
575
+ && result.impulsesQuantizedClean,
576
+ };
577
+ return createFixtureReport(manifest, fixture, metrics);
578
+ }
503
579
  function runPredictionCullingFixture(manifest, fixture) {
504
580
  const passProfile = runPredictionCullingLab({
505
581
  mode: 'local-area',
@@ -0,0 +1,4 @@
1
+ import type { DeterministicSessionConfig } from './types.js';
2
+ export declare function serializeStateWith<State, Input>(config: DeterministicSessionConfig<State, Input>, state: State): Uint8Array;
3
+ export declare function deserializeStateWith<State, Input>(config: DeterministicSessionConfig<State, Input>, bytes: Uint8Array): State;
4
+ export declare function computeWireStateChecksum<State, Input>(config: DeterministicSessionConfig<State, Input>, state: State): string;