@series-inc/rundot-syncplay 5.23.0-beta.8 → 5.23.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 (53) hide show
  1. package/README.md +61 -6
  2. package/dist/browser.d.ts +86 -57
  3. package/dist/browser.js +46 -53
  4. package/dist/certification.d.ts +20 -3
  5. package/dist/certification.js +78 -2
  6. package/dist/cjs/browser.js +259 -90
  7. package/dist/cjs/certification.js +78 -2
  8. package/dist/cjs/creator.js +2 -1
  9. package/dist/cjs/engine-complete.js +213 -3
  10. package/dist/cjs/engine-parity-matrix.js +19 -4
  11. package/dist/cjs/index.js +193 -139
  12. package/dist/cjs/movement3d.js +230 -1
  13. package/dist/cjs/node.js +3 -1
  14. package/dist/cjs/physics-cert.js +147 -6
  15. package/dist/cjs/physics2d.js +10 -4
  16. package/dist/cjs/physics3d-joints.js +637 -0
  17. package/dist/cjs/physics3d-shared.js +288 -0
  18. package/dist/cjs/physics3d-solver.js +1351 -0
  19. package/dist/cjs/physics3d-vehicle.js +467 -0
  20. package/dist/cjs/physics3d.js +1057 -223
  21. package/dist/cjs/replay-bundle.js +127 -20
  22. package/dist/cjs/sample-scenes.js +3 -0
  23. package/dist/cjs/testing.js +107 -0
  24. package/dist/cli.js +17 -9
  25. package/dist/creator.d.ts +1 -1
  26. package/dist/creator.js +1 -1
  27. package/dist/engine-complete.js +214 -4
  28. package/dist/engine-parity-matrix.js +19 -4
  29. package/dist/index.d.ts +93 -90
  30. package/dist/index.js +44 -56
  31. package/dist/movement3d.d.ts +73 -0
  32. package/dist/movement3d.js +229 -1
  33. package/dist/node.d.ts +2 -0
  34. package/dist/node.js +1 -0
  35. package/dist/physics-cert.d.ts +1 -1
  36. package/dist/physics-cert.js +147 -6
  37. package/dist/physics2d.js +10 -4
  38. package/dist/physics3d-joints.d.ts +94 -0
  39. package/dist/physics3d-joints.js +634 -0
  40. package/dist/physics3d-shared.d.ts +72 -0
  41. package/dist/physics3d-shared.js +257 -0
  42. package/dist/physics3d-solver.d.ts +197 -0
  43. package/dist/physics3d-solver.js +1346 -0
  44. package/dist/physics3d-vehicle.d.ts +84 -0
  45. package/dist/physics3d-vehicle.js +463 -0
  46. package/dist/physics3d.d.ts +108 -8
  47. package/dist/physics3d.js +1006 -177
  48. package/dist/replay-bundle.d.ts +40 -1
  49. package/dist/replay-bundle.js +126 -20
  50. package/dist/sample-scenes.js +3 -0
  51. package/dist/testing.d.ts +52 -0
  52. package/dist/testing.js +45 -0
  53. package/package.json +11 -3
package/README.md CHANGED
@@ -84,6 +84,14 @@ import { createDeterministicAuthorityServer } from '@series-inc/rundot-syncplay/
84
84
  import { rundotSyncplayPlugin } from '@series-inc/rundot-syncplay/tools';
85
85
  ```
86
86
 
87
+ > The `@series-inc/rundot-syncplay/testing` entry (and its SDK mirror
88
+ > `@series-inc/rundot-game-sdk/syncplay/testing`) exposes internal labs,
89
+ > examples, fixtures, certification harnesses, and mocks for this repo's tests,
90
+ > prototypes, and the syncplay CLI. It is **unsupported** — anything there may be
91
+ > renamed or removed without notice, and it is deliberately excluded from the
92
+ > export-surface goldens. Game code must import from the package root, `/browser`,
93
+ > or `/creator` instead.
94
+
87
95
  The SDK bridge re-exports a browser-safe subset for games that already depend on
88
96
  `@series-inc/rundot-game-sdk`:
89
97
 
@@ -254,14 +262,57 @@ Implemented:
254
262
  - `lab:physics-cert` built-in fixed physics certification for fixed-arena and
255
263
  128-slot load shapes with snapshot/restore, stable collision/query ordering,
256
264
  and timing metrics.
265
+ - `lab:physics-cert -- --engine builtin-rigid` certifies the 3D rigid-body
266
+ solver (settling stack + hinge motor + grab + speculative CCD arena) against
267
+ the same four determinism gates; the contact/joint caches round-trip through
268
+ the snapshot as canonical state.
257
269
  - `lab:physics-cert -- --engine rapier2d-compat` certification for
258
270
  `@dimforge/rapier2d-compat@0.19.3`; the current pinned cert reproduces
259
271
  snapshot/restore nondeterminism, so Rapier remains render/prototype-only for
260
272
  checksummed gameplay.
273
+ - **Production-grade 3D rigid-body dynamics.** A warm-started sequential-impulse
274
+ solver (SAT + face-clipping manifolds → accumulated normal/friction impulses →
275
+ split-impulse position correction → island-based sleeping) delivers stable
276
+ stacking, full 6-DOF tumbling props, per-body axis locks (Box2D-class 2D games
277
+ on the 3D solver), impulse-based joints (`ball`, `hinge` with limits + motor,
278
+ `weld`, `distance`/rope, `spring` (soft point-to-point via
279
+ `frequencyHz`/`dampingRatio`, Box2D soft-constraint math), and the `grab`
280
+ gravity-gun/carry primitive),
281
+ speculative-contact CCD, and compound colliders. Opt-in per body via
282
+ `orientation`/`angularVel`/`mass`/`ccd`/locks; bodies without these solve as
283
+ rotation-locked rigid bodies through the same pipeline. New step options
284
+ `joints` and `velocityIterations`; mutation helpers
285
+ `applyDeterministicImpulse3D` / `setDeterministicBodyVelocity3D`; contact
286
+ events carry `normalImpulse`. The contact/joint caches live in the world and
287
+ are therefore checksummed and rollback-safe.
288
+ - **Deterministic raycast-wheel vehicles.** `stepDeterministicVehicle3D` drives
289
+ a single dynamic chassis with N suspension raycasts (wheels are rays, not
290
+ bodies — Bullet/Godot raycast-vehicle lineage): spring-damper suspension,
291
+ friction-circle tire forces (drive/steer/brake from integer deci-unit input),
292
+ steering through the fixed-point `createDeterministicMath()` trig, and an
293
+ iterated Gauss-Seidel tire solve. The stateless controller returns quantized
294
+ impulses the game applies before the next physics step (the KCC pattern) —
295
+ use the batched `applyDeterministicImpulses3D` (one canonical-world rebuild
296
+ per frame; the per-impulse singular form costs an O(bodies) rebuild per
297
+ call); the checksum covers only load-bearing outputs
298
+ (impulses, grounded flags, compressions), never cosmetic telemetry. v1 targets
299
+ static ground with flat/axis-aligned contact normals; certified by the
300
+ required `physics-rigid-vehicle` fixture, a car in the `builtin-rigid` cert
301
+ arena, a rollback-every-frame synctest scene, and a 100%-coverage
302
+ `coverage:package:physics-vehicle` shard.
303
+ - **Accelerated deterministic queries.** Raycast, overlap, and shape-cast run
304
+ through a per-world static AABB tree (BVH) built lazily on first query and
305
+ memoized by world identity — pure derived data that never enters canonical
306
+ state, with bit-identical results to a full scan (the tree only prunes;
307
+ narrow-phase tests and id-tiebroken ordering are unchanged, proven by a
308
+ merged-single-body-world oracle test). Query cost is flat in world size:
309
+ 128 wheel-length raycasts cost ~0.2 ms whether the world holds 17 or 1,000
310
+ bodies (previously ~72 ms at 1,000).
261
311
  - Public deterministic 2D physics primitives for static/dynamic/kinematic AABB
262
312
  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.
313
+ deterministic AABB and ray queries, material response (now including real
314
+ tangential friction), simple fixed/distance/spring/motor constraints,
315
+ rollback-equivalent stepping, and budget metrics.
265
316
  - Public deterministic movement primitives for KCC-like slopes, steps, ledges,
266
317
  moving platforms, elevators, one-way platforms, wall slides, jump buffering,
267
318
  coyote time, top-down acceleration/drag/sliding, nav steering, quantized FPS
@@ -648,9 +699,13 @@ materials, vectors, and interpolation floats stay outside replay checksums.
648
699
  - Built-in fixed physics certification includes package-local 2D/2.5D and 3D
649
700
  deterministic worlds with sensors/triggers, queries, layer masks, callbacks,
650
701
  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`,
702
+ deterministic angular state, and 128/512/2048-body stress samples; the
703
+ `builtin-rigid` lane additionally certifies the sequential-impulse rigid-body
704
+ solver (stacking, joints, CCD) under the four determinism gates. Remaining
705
+ limits are visual collision authoring/import, convex-hull decomposition,
706
+ dynamic mesh-vs-mesh collision, ragdolls in checksummed state, and replacing
707
+ external physics engines; the ≤2 ms/step 128-body budget awaits an
708
+ allocation-free solver pass. Rapier cert currently fails with
709
+ `knownIssueRapier910=reproduced`,
655
710
  `uninterruptedChecksum=916fe725ae2e3215`, and
656
711
  `restoredChecksum=9e42622842bffff6`.
package/dist/browser.d.ts CHANGED
@@ -1,60 +1,89 @@
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 { createDeterministicR3fRenderAdapter as createDeterministicR3fAdapter, createDeterministicR3fRenderAdapter, interpolateDeterministicRenderNumber, interpolateDeterministicRenderVec2 } from './r3f-render-adapter.js';
34
+ export { verifyReplayWithDescriptor as verifyDeterministicReplay, verifyReplay } from './replay.js';
35
+ export { createDeterministicReplayBundle, createDeterministicReplayDebugTables, createDeterministicReplayRuntimeManifest, minimizeDeterministicReplayDesync, minimizeDeterministicReplayDesyncBundle, sliceDeterministicReplayBundle, verifyDeterministicFrameRuntimeReplayBundle, verifyDeterministicReplayBundle, verifyDeterministicSelfContainedFrameRuntimeReplayBundle, verifyReplayScoreAgainstTrustedRuntime } from './replay-bundle.js';
36
+ export { defineSyncplayGame, stableDescriptorId } from './schema.js';
37
+ export { createSchemaArtifacts } from './schema-artifacts.js';
38
+ export { createDeterministicDescriptorBinarySchema, generateSchemaBinarySource, generateSchemaTypes, proveSchemaBinaryRoundTrip } from './schema-codegen.js';
39
+ export { createDeterministicBinarySerializer, deterministicDslMaxPlayers, parseDeterministicSchemaDsl, stableDeterministicDslSchemaJson } from './schema-dsl-binary.js';
40
+ export { createSyncplayOfflineRuntime as createSyncplayGameRuntime, createSyncplayOfflineRuntime } from './sdk-offline.js';
6
41
  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';
42
+ export { createSessionFromPromotionSnapshot, exportPromotionSnapshot } from './session-promotion.js';
43
+ export { base64ToBytes, bytesToBase64, createSnapshotTransferCollector, createSnapshotTransferFromBytes, decodeDeterministicStateSnapshot, DEFAULT_MAX_SNAPSHOT_BYTES, DEFAULT_SNAPSHOT_CHUNK_SIZE, deterministicRoomDescriptorHash, encodeDeterministicStateSnapshot } from './session-snapshot.js';
44
+ export { decodeDeterministicSessionMessage, deterministicSessionWireVersion, encodeDeterministicSessionMessage } from './session-wire.js';
45
+ export { createDeterministicSignalBus } from './signals.js';
46
+ export { createDeterministicSparseSet } from './sparse-set.js';
47
+ export { createDeterministicLifecycleRunner, summarizeDeterministicLifecycleCounters } from './system-lifecycle.js';
48
+ export type { CookedDeterministicAnimation, DeterministicAnimationClip, DeterministicAnimationDescriptor, DeterministicAnimationLayer, DeterministicAnimationRuntimeState, DeterministicAnimationState, DeterministicAnimationStepResult, DeterministicAnimationTrack, DeterministicAnimationTransition } from './animation.js';
49
+ export type { DeterministicAssetCookManifest, DeterministicAssetCookResult, DeterministicAssetDependency, DeterministicAssetRecord, DeterministicAssetSource, DeterministicCookedAsset, DeterministicMapMaterializationResult, DeterministicPrototypeEntity, DeterministicPrototypeMaterializationOptions, DeterministicPrototypeRuntimeValidationResult } from './asset-cooking.js';
50
+ export type { AuthorityRoomCatchUpEvent, AuthorityRoomClientNetStats, AuthorityRoomDesyncInfo, AuthorityRoomJoinResult, AuthorityRoomNetcodeStats, AuthorityRoomSnapshot, AuthorityRoomSnapshotEvent, AuthorityRoomStoredSnapshotMeta, AuthorityRoomTransport, DeterministicAuthorityRoom, DeterministicAuthorityRoomConfig, DeterministicAuthorityRoomRestoreState } from './authority-room.js';
51
+ export type { CompiledDeterministicBotDocument, DeterministicBotDocument, DeterministicBotDocumentTrace, DeterministicBotDocumentTraceCounterDelta, DeterministicBotDocumentTraceCoverage } from './bot-documents.js';
52
+ 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';
53
+ export type { CanonicalValue } from './canonical.js';
54
+ export type { StableIndexedEntry } from './collections.js';
55
+ export type { FixedAabb, FixedCircle, FixedVec2 } from './collision.js';
56
+ export type { DeterministicCommandChannelDescriptor, DeterministicCommandProtocolMetrics, DeterministicCommandTimeline, DeterministicCommandTimelineConfig, DeterministicCommandTimelineMigrationMetrics, DeterministicCommandTimelineMigrationResultInput, DeterministicCommandTimelineSnapshot, DeterministicPayloadFieldDescriptor, DeterministicPayloadFieldKind, DeterministicPlayerCommand, DeterministicRejectedCommand, DeterministicReliableCommandDefaultsMetrics } from './commands.js';
57
+ export type { CookedDeterministicConfigBundle, DeterministicConfigBundleFailureReasonInputs, DeterministicConfigBundleParityMetrics, DeterministicConfigBundleSource, DeterministicConfigBundleVerification, DeterministicConfigMigration } from './config-bundle.js';
58
+ export type { DeterministicSessionCore, DeterministicSessionInput, DeterministicSessionInputFlag, DeterministicSessionLifecycleEvent, DeterministicSessionOptions, DeterministicSessionPlayer, DeterministicSessionReplayBundle, DeterministicSessionReplayVerification, DeterministicSessionSnapshot } from './deterministic-session.js';
59
+ export type { DeterministicEffectDispatch, DeterministicEffectTarget, DeterministicEventEffectsAdapter, DeterministicEventEffectsAdapterConfig, DeterministicRenderSafeEffect } from './effects-adapter.js';
60
+ 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';
61
+ export type { DeterministicEventDeliveryScope, DeterministicEventEmitOptions, DeterministicEventPredictionState, DeterministicEventRecord, DeterministicEventTimeline } from './events.js';
62
+ export type { ConfirmedInputFrame, EncodedInput, InputAuthority, InputAuthorityConfig, InputAuthorityRestoreState, InputAuthorityStats, InputRejectionReason, InputSubmissionResult } from './input-authority.js';
63
+ export type { DeterministicInputTimelineAccumulatorState, DeterministicInputTimelineCorrection, DeterministicInputTimelineLane, DeterministicInputTimelineNegativeCases, DeterministicInputTimelineOptions, DeterministicInputTimelinePrediction, DeterministicInputTimelineReport, DeterministicInputTimelineRow, DeterministicInputTimelineVerification } from './input-timeline.js';
64
+ export type { InstantReplayInputFrame, InstantReplayResult, InstantReplayRunner, InstantReplayRunnerOptions, InstantReplayRunOptions, RunInstantReplayOptions } from './instant-replay.js';
65
+ export type { DeterministicAuthoritativeLagCompensation3DShotContext, DeterministicLagCompensatedPellet3DResult, DeterministicLagCompensatedShot3D, DeterministicLagCompensatedShot3DResult, DeterministicLagCompensatedTarget3D, DeterministicLagCompensation3DHistory, DeterministicLagCompensation3DHistoryOptions, DeterministicLagCompensation3DHistorySnapshot, DeterministicLagCompensation3DRewindSnapshot } from './lag-compensation3d.js';
66
+ export type { DeterministicLocalAuthorityClient, DeterministicLocalAuthorityInputMessage, DeterministicLocalAuthorityResult, DeterministicLocalAuthorityRuntime, DeterministicLocalAuthorityRuntimeOptions, DeterministicLocalAuthorityRuntimeSnapshot, DeterministicLocalAuthorityState } from './local-authority.js';
67
+ export type { DeterministicLocalAuthoritySnapshotIdentity, DeterministicLocalAuthoritySnapshotTransfer, DeterministicLocalAuthorityWireApplyResult, DeterministicLocalAuthorityWireAuth, DeterministicLocalAuthorityWireAuthOptions, DeterministicLocalAuthorityWireEnvelope, DeterministicLocalAuthorityWireKind, DeterministicLocalAuthorityWireReceiver, DeterministicLocalAuthorityWireReceiverOptions, DeterministicLocalAuthorityWireReceiverResult, DeterministicLocalAuthorityWireReceiverSnapshot, DeterministicLocalAuthorityWireSignOptions } from './local-authority-wire.js';
68
+ export type { DeterministicFixedQuaternion, DeterministicFixedVec2, DeterministicFixedVec3, DeterministicMath } from './math.js';
69
+ export type { DeterministicFpsAimState, DeterministicFpsInput, DeterministicKccBody, DeterministicKccInput, DeterministicKccStepResult, DeterministicLagCompensatedHitValidation, DeterministicLagCompensatedShot, DeterministicMovementCrowdMetrics, DeterministicMovementSimulationMetrics, DeterministicMovementStep, DeterministicMovementWorld, DeterministicMovingPlatform, DeterministicOneWayPlatform, DeterministicSlope, DeterministicTargetSnapshot, DeterministicTopDownBody, DeterministicTopDownBounds, DeterministicTopDownInput } from './movement.js';
70
+ export type { DeterministicKccBody3D, DeterministicKccCarrierPose3D, DeterministicKccCarryResult3D, DeterministicKccCarryState3D, DeterministicKccCollisionCandidate3D, DeterministicKccCollisionFilter3D, DeterministicKccExternalImpulse3D, DeterministicKccGeometry3D, DeterministicKccInput3D, DeterministicKccPhysicsImpulse3D, DeterministicKccProcessor3D, DeterministicKccStepResult3D, DeterministicKccWorld3D, DeterministicMovingPlatform3D, DeterministicSlope3D, DeterministicStep3D } from './movement3d.js';
71
+ export type { DeterministicAuthorityCertificationArtifact, DeterministicAuthorityCertificationVerification, DeterministicAuthorityChecksums, SyncplayClient, SyncplayClientConnection, SyncplayClientRole, SyncplayCommand, SyncplayCommandPollOptions, SyncplayCommandSubmitResult, SyncplayInput, SyncplayLifecycleResult, SyncplaySubmitResult } from './multiplayer-service.js';
72
+ export type { CookedDeterministicNavigationGraph, DeterministicFlowField, DeterministicNavEdge, DeterministicNavigationAgent, DeterministicNavigationGraphSource, DeterministicNavigationStepOptions, DeterministicNavigationStepResult, DeterministicNavNode, DeterministicNavRegion, DeterministicPathQuery, DeterministicPathResult, DeterministicTilemapSource } from './navigation.js';
73
+ export type { CookedDeterministicNavmesh, DeterministicNavmeshAgent, DeterministicNavmeshAgentStepResult, DeterministicNavmeshImportSource, DeterministicNavmeshLink, DeterministicNavmeshMovingAvoidanceObstacle, DeterministicNavmeshOffMeshTraversalState, DeterministicNavmeshOffMeshTraversalStep, DeterministicNavmeshPath, DeterministicNavmeshPoint, DeterministicNavmeshPolygon, DeterministicNavmeshSource } from './navmesh.js';
74
+ export type { NetworkedClientTransport, NetworkedSyncplayClient, NetworkedSyncplayClientInputDelayOptions, NetworkedSyncplayClientNetStats, NetworkedSyncplayClientOptions, NetworkedSyncplayClientPacingOptions } from './networked-client.js';
75
+ export type { DeterministicPauseController, DeterministicPauseState, DeterministicPauseStatus, PauseControllerOptions, PauseWrappedState } from './pause-resume.js';
76
+ export type { DeterministicBodyKind, DeterministicContactEvent2D, DeterministicContactEventType, DeterministicPhysicsAabbQuery2D, DeterministicPhysicsActivePair2D, DeterministicPhysicsBody2D, DeterministicPhysicsCircleCastQuery2D, DeterministicPhysicsConstraint2D, DeterministicPhysicsHit2D, DeterministicPhysicsQueryOptions2D, DeterministicPhysicsRaycastQuery2D, DeterministicPhysicsShape2D, DeterministicPhysicsShapeOverlapQuery2D, DeterministicPhysicsStepOptions2D, DeterministicPhysicsStepResult2D, DeterministicPhysicsWorld2D } from './physics2d.js';
77
+ export type { DeterministicContactCacheEntry3D, DeterministicJointCacheEntry3D, DeterministicPhysicsActivePair3D, DeterministicPhysicsAxisLock3D, DeterministicPhysicsBody3D, DeterministicPhysicsCallbackMask3D, DeterministicPhysicsCompoundChild3D, DeterministicPhysicsConstraint3D, DeterministicPhysicsContactDetail3D, DeterministicPhysicsContactEvent3D, DeterministicPhysicsDetailedHit3D, DeterministicPhysicsHit3D, DeterministicPhysicsImpulseApplication3D, DeterministicPhysicsOverlapQuery3D, DeterministicPhysicsPrimitiveShape3D, DeterministicPhysicsQuaternion3D, DeterministicPhysicsQueryOptions3D, DeterministicPhysicsRaycastQuery3D, DeterministicPhysicsScheduledQuery3D, DeterministicPhysicsShape3D, DeterministicPhysicsShapeCastQuery3D, DeterministicPhysicsStepResult3D, DeterministicPhysicsVec3, DeterministicPhysicsWorld3D } from './physics3d.js';
78
+ export type { DeterministicFrameRuntimeReplayBundleOptions, DeterministicFrameRuntimeReplayBundleVerification, DeterministicReplayBundle, DeterministicReplayBundleMismatch, DeterministicReplayBundleVerification, DeterministicReplayDebugTables, DeterministicReplayDesyncMinimization, DeterministicReplayRuntimeBeforeFrameId, DeterministicReplayRuntimeManifest, DeterministicReplayRuntimeManifestSource, DeterministicReplayRuntimeSystemId, DeterministicReplaySemanticModel, DeterministicReplaySemanticOperation, DeterministicReplaySliceOrigin, DeterministicReplaySnapshot, DeterministicReplayVerificationManifest, ReplayScoreVerificationReason, ReplayScoreVerificationResult } from './replay-bundle.js';
79
+ export type { AssetDescriptor, CollectionOrdering, CommandChannelDescriptor, ConfigDescriptor, DeterministicGameDescriptor, EventDescriptor, InputFieldDescriptor, InputFieldPolicy, NumericMode, PrototypeDescriptor, SchemaFieldDescriptor, SchemaFieldKind, StateFieldDescriptor, SystemDescriptor, ValidatedDeterministicGameDescriptor } from './schema.js';
80
+ export type { DeterministicSchemaArtifacts, SchemaFrameDump } from './schema-artifacts.js';
81
+ export type { SchemaBinaryProof, SchemaBinarySourceOptions, SchemaTypesOptions } from './schema-codegen.js';
82
+ export type { DeterministicBinarySerializer, DeterministicDslDeclaration, DeterministicDslDeclarationKind, DeterministicDslDictionaryEntry, DeterministicDslDictionaryFieldKind, DeterministicDslField, DeterministicDslFieldKind, DeterministicDslFixedArrayFieldKind, DeterministicDslListFieldKind, DeterministicDslScalarFieldKind, DeterministicDslScalarValue, DeterministicDslSchema, DeterministicDslSetFieldKind, DeterministicDslValue } from './schema-dsl-binary.js';
83
+ export type { OpenRoomTransport, SyncplaySession, SyncplaySessionConfig, SyncplaySessionMode } from './sdk-session.js';
84
+ export type { CollectedSnapshotTransfer, CreateSnapshotTransferOptions, DeterministicStateSnapshot, DeterministicStateSnapshotDecodeRejection, DeterministicStateSnapshotDecodeResult, SnapshotTransferCollector, SnapshotTransferCollectorOptions, SnapshotTransferCompleteResult, SnapshotTransferRejection, SnapshotTransferStepResult } from './session-snapshot.js';
85
+ export type { DeterministicSessionDecodeRejection, DeterministicSessionDecodeResult, DeterministicSessionMessage, DeterministicSessionMessageKind, DeterministicSessionRole } from './session-wire.js';
86
+ export type { DeterministicSignal, DeterministicSignalBus, DeterministicSignalBusSnapshot, DeterministicSignalSubscription } from './signals.js';
87
+ export type { DeterministicSparseSet, DeterministicSparseSetSnapshot } from './sparse-set.js';
88
+ export type { DeterministicLifecycleCounterSummary, DeterministicLifecycleRunner, DeterministicLifecycleSignal, DeterministicLifecycleSnapshot, DeterministicLifecycleSystemContext, DeterministicLifecycleSystemDescriptor, DeterministicLifecycleSystemHooks } from './system-lifecycle.js';
60
89
  export type { DeterministicStep, ReplayFile, ReplayVerificationResult } from './types.js';
package/dist/browser.js CHANGED
@@ -1,55 +1,48 @@
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 { 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 { 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';
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';
@@ -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',