@series-inc/rundot-syncplay 5.23.0-beta.7

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 (264) hide show
  1. package/README.md +610 -0
  2. package/dist/animation.d.ts +119 -0
  3. package/dist/animation.js +488 -0
  4. package/dist/asset-cooking.d.ts +82 -0
  5. package/dist/asset-cooking.js +364 -0
  6. package/dist/authority-room.d.ts +217 -0
  7. package/dist/authority-room.js +701 -0
  8. package/dist/bot-documents.d.ts +115 -0
  9. package/dist/bot-documents.js +549 -0
  10. package/dist/bot-primitives.d.ts +152 -0
  11. package/dist/bot-primitives.js +472 -0
  12. package/dist/browser.d.ts +57 -0
  13. package/dist/browser.js +53 -0
  14. package/dist/canonical.d.ts +12 -0
  15. package/dist/canonical.js +288 -0
  16. package/dist/certification.d.ts +455 -0
  17. package/dist/certification.js +1855 -0
  18. package/dist/chaos-certification.d.ts +56 -0
  19. package/dist/chaos-certification.js +1397 -0
  20. package/dist/cjs/animation.js +495 -0
  21. package/dist/cjs/asset-cooking.js +372 -0
  22. package/dist/cjs/authority-room.js +704 -0
  23. package/dist/cjs/bot-documents.js +556 -0
  24. package/dist/cjs/bot-primitives.js +482 -0
  25. package/dist/cjs/browser.js +96 -0
  26. package/dist/cjs/canonical.js +299 -0
  27. package/dist/cjs/certification.js +1860 -0
  28. package/dist/cjs/chaos-certification.js +1402 -0
  29. package/dist/cjs/collections.js +36 -0
  30. package/dist/cjs/collision.js +96 -0
  31. package/dist/cjs/commands.js +987 -0
  32. package/dist/cjs/config-bundle.js +491 -0
  33. package/dist/cjs/creator.js +30 -0
  34. package/dist/cjs/deterministic-primitives.js +134 -0
  35. package/dist/cjs/deterministic-session.js +1410 -0
  36. package/dist/cjs/ecs-lite.js +155 -0
  37. package/dist/cjs/effects-adapter.js +97 -0
  38. package/dist/cjs/engine-complete.js +2297 -0
  39. package/dist/cjs/engine-core-proof.js +70 -0
  40. package/dist/cjs/engine-parity-matrix.js +874 -0
  41. package/dist/cjs/engine-parity.js +3183 -0
  42. package/dist/cjs/engine-runtime.js +3141 -0
  43. package/dist/cjs/errors.js +22 -0
  44. package/dist/cjs/events.js +247 -0
  45. package/dist/cjs/examples/counter-duel.js +157 -0
  46. package/dist/cjs/examples/fixed-arena.js +368 -0
  47. package/dist/cjs/index.js +229 -0
  48. package/dist/cjs/input-authority.js +150 -0
  49. package/dist/cjs/input-button.js +256 -0
  50. package/dist/cjs/input-timeline.js +418 -0
  51. package/dist/cjs/instant-replay.js +66 -0
  52. package/dist/cjs/lag-compensation3d.js +837 -0
  53. package/dist/cjs/local-authority-server-runner.js +1121 -0
  54. package/dist/cjs/local-authority-wire.js +1497 -0
  55. package/dist/cjs/local-authority.js +817 -0
  56. package/dist/cjs/local-ws-adapter.js +150 -0
  57. package/dist/cjs/match-log.js +61 -0
  58. package/dist/cjs/math.js +157 -0
  59. package/dist/cjs/mock-network-adapter.js +26 -0
  60. package/dist/cjs/movement.js +703 -0
  61. package/dist/cjs/movement3d.js +1246 -0
  62. package/dist/cjs/multiclient-authority.js +308 -0
  63. package/dist/cjs/multiplayer-service.js +434 -0
  64. package/dist/cjs/navigation.js +347 -0
  65. package/dist/cjs/navmesh.js +1437 -0
  66. package/dist/cjs/networked-client.js +691 -0
  67. package/dist/cjs/networked-input-authority.js +443 -0
  68. package/dist/cjs/node.js +47 -0
  69. package/dist/cjs/number-lab.js +78 -0
  70. package/dist/cjs/offline-session.js +370 -0
  71. package/dist/cjs/package.json +1 -0
  72. package/dist/cjs/pause-resume.js +43 -0
  73. package/dist/cjs/physics-cert.js +426 -0
  74. package/dist/cjs/physics2d.js +751 -0
  75. package/dist/cjs/physics3d.js +1996 -0
  76. package/dist/cjs/prediction-culling.js +203 -0
  77. package/dist/cjs/protocol-lab.js +1299 -0
  78. package/dist/cjs/r3f-render-adapter.js +209 -0
  79. package/dist/cjs/random.js +59 -0
  80. package/dist/cjs/replay-bundle.js +1598 -0
  81. package/dist/cjs/replay-inspect.js +236 -0
  82. package/dist/cjs/replay-scoring.js +68 -0
  83. package/dist/cjs/replay.js +356 -0
  84. package/dist/cjs/reports.js +181 -0
  85. package/dist/cjs/rollback-history.js +251 -0
  86. package/dist/cjs/runtime-guards.js +111 -0
  87. package/dist/cjs/sample-lab.js +145 -0
  88. package/dist/cjs/sample-scenes.js +752 -0
  89. package/dist/cjs/schema-artifacts.js +359 -0
  90. package/dist/cjs/schema-codegen.js +544 -0
  91. package/dist/cjs/schema-dsl-binary.js +655 -0
  92. package/dist/cjs/schema.js +319 -0
  93. package/dist/cjs/sdk-offline.js +99 -0
  94. package/dist/cjs/session-promotion.js +74 -0
  95. package/dist/cjs/session-snapshot.js +265 -0
  96. package/dist/cjs/session-wire.js +216 -0
  97. package/dist/cjs/signals.js +103 -0
  98. package/dist/cjs/sparse-set.js +169 -0
  99. package/dist/cjs/synctest.js +136 -0
  100. package/dist/cjs/system-lifecycle.js +286 -0
  101. package/dist/cjs/timers.js +61 -0
  102. package/dist/cjs/tools/static-checker.js +1468 -0
  103. package/dist/cjs/types.js +2 -0
  104. package/dist/cjs/venus-mp-budget.js +125 -0
  105. package/dist/cjs/ws-frame.js +255 -0
  106. package/dist/cli.d.ts +2 -0
  107. package/dist/cli.js +11379 -0
  108. package/dist/collections.d.ts +9 -0
  109. package/dist/collections.js +30 -0
  110. package/dist/collision.d.ts +25 -0
  111. package/dist/collision.js +85 -0
  112. package/dist/commands.d.ts +137 -0
  113. package/dist/commands.js +977 -0
  114. package/dist/config-bundle.d.ts +89 -0
  115. package/dist/config-bundle.js +483 -0
  116. package/dist/creator.d.ts +20 -0
  117. package/dist/creator.js +11 -0
  118. package/dist/deterministic-primitives.d.ts +59 -0
  119. package/dist/deterministic-primitives.js +126 -0
  120. package/dist/deterministic-session.d.ts +197 -0
  121. package/dist/deterministic-session.js +1401 -0
  122. package/dist/ecs-lite.d.ts +26 -0
  123. package/dist/ecs-lite.js +152 -0
  124. package/dist/effects-adapter.d.ts +21 -0
  125. package/dist/effects-adapter.js +94 -0
  126. package/dist/engine-complete.d.ts +45 -0
  127. package/dist/engine-complete.js +2292 -0
  128. package/dist/engine-core-proof.d.ts +26 -0
  129. package/dist/engine-core-proof.js +66 -0
  130. package/dist/engine-parity-matrix.d.ts +300 -0
  131. package/dist/engine-parity-matrix.js +869 -0
  132. package/dist/engine-parity.d.ts +74 -0
  133. package/dist/engine-parity.js +3178 -0
  134. package/dist/engine-runtime.d.ts +351 -0
  135. package/dist/engine-runtime.js +3123 -0
  136. package/dist/errors.d.ts +11 -0
  137. package/dist/errors.js +17 -0
  138. package/dist/events.d.ts +45 -0
  139. package/dist/events.js +242 -0
  140. package/dist/examples/counter-duel.d.ts +43 -0
  141. package/dist/examples/counter-duel.js +150 -0
  142. package/dist/examples/fixed-arena.d.ts +110 -0
  143. package/dist/examples/fixed-arena.js +356 -0
  144. package/dist/index.d.ts +101 -0
  145. package/dist/index.js +66 -0
  146. package/dist/input-authority.d.ts +82 -0
  147. package/dist/input-authority.js +147 -0
  148. package/dist/input-button.d.ts +36 -0
  149. package/dist/input-button.js +249 -0
  150. package/dist/input-timeline.d.ts +65 -0
  151. package/dist/input-timeline.js +412 -0
  152. package/dist/instant-replay.d.ts +59 -0
  153. package/dist/instant-replay.js +62 -0
  154. package/dist/lag-compensation3d.d.ts +146 -0
  155. package/dist/lag-compensation3d.js +827 -0
  156. package/dist/local-authority-server-runner.d.ts +79 -0
  157. package/dist/local-authority-server-runner.js +1118 -0
  158. package/dist/local-authority-wire.d.ts +142 -0
  159. package/dist/local-authority-wire.js +1477 -0
  160. package/dist/local-authority.d.ts +160 -0
  161. package/dist/local-authority.js +810 -0
  162. package/dist/local-ws-adapter.d.ts +14 -0
  163. package/dist/local-ws-adapter.js +146 -0
  164. package/dist/match-log.d.ts +74 -0
  165. package/dist/match-log.js +57 -0
  166. package/dist/math.d.ts +41 -0
  167. package/dist/math.js +154 -0
  168. package/dist/mock-network-adapter.d.ts +13 -0
  169. package/dist/mock-network-adapter.js +23 -0
  170. package/dist/movement.d.ts +155 -0
  171. package/dist/movement.js +694 -0
  172. package/dist/movement3d.d.ts +195 -0
  173. package/dist/movement3d.js +1238 -0
  174. package/dist/multiclient-authority.d.ts +30 -0
  175. package/dist/multiclient-authority.js +305 -0
  176. package/dist/multiplayer-service.d.ts +153 -0
  177. package/dist/multiplayer-service.js +429 -0
  178. package/dist/navigation.d.ts +91 -0
  179. package/dist/navigation.js +338 -0
  180. package/dist/navmesh.d.ts +236 -0
  181. package/dist/navmesh.js +1423 -0
  182. package/dist/networked-client.d.ts +124 -0
  183. package/dist/networked-client.js +688 -0
  184. package/dist/networked-input-authority.d.ts +51 -0
  185. package/dist/networked-input-authority.js +439 -0
  186. package/dist/node.d.ts +22 -0
  187. package/dist/node.js +19 -0
  188. package/dist/number-lab.d.ts +15 -0
  189. package/dist/number-lab.js +75 -0
  190. package/dist/offline-session.d.ts +2 -0
  191. package/dist/offline-session.js +367 -0
  192. package/dist/pause-resume.d.ts +48 -0
  193. package/dist/pause-resume.js +40 -0
  194. package/dist/physics-cert.d.ts +40 -0
  195. package/dist/physics-cert.js +389 -0
  196. package/dist/physics2d.d.ts +142 -0
  197. package/dist/physics2d.js +741 -0
  198. package/dist/physics3d.d.ts +285 -0
  199. package/dist/physics3d.js +1979 -0
  200. package/dist/prediction-culling.d.ts +34 -0
  201. package/dist/prediction-culling.js +200 -0
  202. package/dist/protocol-lab.d.ts +115 -0
  203. package/dist/protocol-lab.js +1295 -0
  204. package/dist/r3f-render-adapter.d.ts +61 -0
  205. package/dist/r3f-render-adapter.js +203 -0
  206. package/dist/random.d.ts +13 -0
  207. package/dist/random.js +55 -0
  208. package/dist/replay-bundle.d.ts +150 -0
  209. package/dist/replay-bundle.js +1586 -0
  210. package/dist/replay-inspect.d.ts +60 -0
  211. package/dist/replay-inspect.js +228 -0
  212. package/dist/replay-scoring.d.ts +28 -0
  213. package/dist/replay-scoring.js +65 -0
  214. package/dist/replay.d.ts +17 -0
  215. package/dist/replay.js +351 -0
  216. package/dist/reports.d.ts +176 -0
  217. package/dist/reports.js +174 -0
  218. package/dist/rollback-history.d.ts +46 -0
  219. package/dist/rollback-history.js +247 -0
  220. package/dist/runtime-guards.d.ts +1 -0
  221. package/dist/runtime-guards.js +108 -0
  222. package/dist/sample-lab.d.ts +32 -0
  223. package/dist/sample-lab.js +134 -0
  224. package/dist/sample-scenes.d.ts +86 -0
  225. package/dist/sample-scenes.js +745 -0
  226. package/dist/schema-artifacts.d.ts +49 -0
  227. package/dist/schema-artifacts.js +356 -0
  228. package/dist/schema-codegen.d.ts +21 -0
  229. package/dist/schema-codegen.js +538 -0
  230. package/dist/schema-dsl-binary.d.ts +75 -0
  231. package/dist/schema-dsl-binary.js +648 -0
  232. package/dist/schema.d.ts +87 -0
  233. package/dist/schema.js +315 -0
  234. package/dist/sdk-offline.d.ts +34 -0
  235. package/dist/sdk-offline.js +96 -0
  236. package/dist/session-promotion.d.ts +26 -0
  237. package/dist/session-promotion.js +70 -0
  238. package/dist/session-snapshot.d.ts +95 -0
  239. package/dist/session-snapshot.js +255 -0
  240. package/dist/session-wire.d.ts +89 -0
  241. package/dist/session-wire.js +211 -0
  242. package/dist/signals.d.ts +31 -0
  243. package/dist/signals.js +99 -0
  244. package/dist/sparse-set.d.ts +34 -0
  245. package/dist/sparse-set.js +165 -0
  246. package/dist/synctest.d.ts +31 -0
  247. package/dist/synctest.js +133 -0
  248. package/dist/system-lifecycle.d.ts +72 -0
  249. package/dist/system-lifecycle.js +281 -0
  250. package/dist/timers.d.ts +17 -0
  251. package/dist/timers.js +53 -0
  252. package/dist/tools/index.d.ts +4 -0
  253. package/dist/tools/index.js +4 -0
  254. package/dist/tools/static-checker.d.ts +31 -0
  255. package/dist/tools/static-checker.js +1462 -0
  256. package/dist/tools/vite-plugin.d.ts +69 -0
  257. package/dist/tools/vite-plugin.js +203 -0
  258. package/dist/types.d.ts +148 -0
  259. package/dist/types.js +1 -0
  260. package/dist/venus-mp-budget.d.ts +29 -0
  261. package/dist/venus-mp-budget.js +122 -0
  262. package/dist/ws-frame.d.ts +49 -0
  263. package/dist/ws-frame.js +247 -0
  264. package/package.json +169 -0
@@ -0,0 +1,152 @@
1
+ export type DeterministicBlackboardValue = boolean | number | string;
2
+ export interface DeterministicBlackboardEntry {
3
+ readonly key: string;
4
+ readonly value: DeterministicBlackboardValue;
5
+ }
6
+ export interface DeterministicBotBlackboard {
7
+ readonly entries: readonly DeterministicBlackboardEntry[];
8
+ readonly hash: string;
9
+ }
10
+ export interface DeterministicHfsmState {
11
+ readonly id: string;
12
+ readonly parent?: string;
13
+ readonly action?: string;
14
+ }
15
+ export interface DeterministicHfsmTransition {
16
+ readonly from: string;
17
+ readonly to: string;
18
+ readonly whenKey: string;
19
+ readonly equals: DeterministicBlackboardValue;
20
+ }
21
+ export interface DeterministicHfsmDefinition {
22
+ readonly initialState: string;
23
+ readonly states: readonly DeterministicHfsmState[];
24
+ readonly transitions: readonly DeterministicHfsmTransition[];
25
+ }
26
+ export interface DeterministicHfsmAgent {
27
+ readonly state: string;
28
+ readonly transitionsTaken: number;
29
+ readonly actionLog: readonly string[];
30
+ }
31
+ export type DeterministicBehaviorTreeStatus = 'success' | 'failure' | 'running';
32
+ export interface DeterministicBehaviorTreeService {
33
+ readonly id: string;
34
+ readonly action: string;
35
+ readonly intervalFrames: number;
36
+ }
37
+ export type DeterministicBehaviorTreeNode = {
38
+ readonly id: string;
39
+ readonly type: 'sequence' | 'selector';
40
+ readonly children: readonly DeterministicBehaviorTreeNode[];
41
+ readonly services?: readonly DeterministicBehaviorTreeService[];
42
+ } | {
43
+ readonly id: string;
44
+ readonly type: 'decorator';
45
+ readonly mode: 'invert' | 'force-success' | 'force-failure';
46
+ readonly child: DeterministicBehaviorTreeNode;
47
+ readonly services?: readonly DeterministicBehaviorTreeService[];
48
+ } | {
49
+ readonly id: string;
50
+ readonly type: 'condition';
51
+ readonly key: string;
52
+ readonly equals: DeterministicBlackboardValue;
53
+ readonly services?: readonly DeterministicBehaviorTreeService[];
54
+ } | {
55
+ readonly id: string;
56
+ readonly type: 'action';
57
+ readonly action: string;
58
+ readonly status?: DeterministicBehaviorTreeStatus;
59
+ readonly services?: readonly DeterministicBehaviorTreeService[];
60
+ };
61
+ export interface DeterministicBehaviorTreeTick {
62
+ readonly status: DeterministicBehaviorTreeStatus;
63
+ readonly actions: readonly string[];
64
+ readonly visitedNodeIds: readonly string[];
65
+ }
66
+ export interface DeterministicBehaviorTreeMemory {
67
+ readonly runningNodeIds: readonly string[];
68
+ readonly completedRunningNodeIds: readonly string[];
69
+ }
70
+ export interface DeterministicBehaviorTreeStatefulTick extends DeterministicBehaviorTreeTick {
71
+ readonly memory: DeterministicBehaviorTreeMemory;
72
+ readonly resumedNodeIds: readonly string[];
73
+ readonly serviceActions: readonly string[];
74
+ readonly serviceNodeIds: readonly string[];
75
+ }
76
+ export type DeterministicUtilityCurve = 'linear' | 'inverse' | 'quadratic' | 'step';
77
+ export interface DeterministicUtilityNestedConsideration {
78
+ readonly id: string;
79
+ readonly inputKey: string;
80
+ readonly min: number;
81
+ readonly max: number;
82
+ readonly weight: number;
83
+ readonly curve?: DeterministicUtilityCurve;
84
+ }
85
+ export interface DeterministicUtilityConsideration {
86
+ readonly id: string;
87
+ readonly inputKey: string;
88
+ readonly action: string;
89
+ readonly min: number;
90
+ readonly max: number;
91
+ readonly weight: number;
92
+ readonly rank?: number;
93
+ readonly curve?: DeterministicUtilityCurve;
94
+ readonly momentumKey?: string;
95
+ readonly momentum?: number;
96
+ readonly cooldownKey?: string;
97
+ readonly cooldownPenalty?: number;
98
+ readonly nested?: readonly DeterministicUtilityNestedConsideration[];
99
+ }
100
+ export interface DeterministicUtilitySelection {
101
+ readonly action: string;
102
+ readonly considerationId: string;
103
+ readonly score: number;
104
+ readonly scores: readonly {
105
+ readonly id: string;
106
+ readonly score: number;
107
+ readonly baseScore: number;
108
+ readonly nestedScore: number;
109
+ readonly momentumScore: number;
110
+ readonly cooldownPenalty: number;
111
+ }[];
112
+ }
113
+ export interface DeterministicBotAssetSource {
114
+ readonly id: string;
115
+ readonly hfsm?: DeterministicHfsmDefinition;
116
+ readonly behaviorTree?: DeterministicBehaviorTreeNode;
117
+ readonly utility?: readonly DeterministicUtilityConsideration[];
118
+ }
119
+ export interface CookedDeterministicBotAsset {
120
+ readonly id: string;
121
+ readonly bytes: string;
122
+ readonly hash: string;
123
+ }
124
+ export interface DeterministicBotSimulationMetrics {
125
+ readonly checksum: string;
126
+ readonly blackboardHash: string;
127
+ readonly cookedBotHash: string;
128
+ readonly styles: string;
129
+ readonly hfsmTransitions: number;
130
+ readonly behaviorTreeTicks: number;
131
+ readonly behaviorRunningTicks: number;
132
+ readonly behaviorResumeTicks: number;
133
+ readonly behaviorDecoratorTicks: number;
134
+ readonly behaviorServiceTicks: number;
135
+ readonly utilitySelections: number;
136
+ readonly utilityCurveSelections: number;
137
+ readonly utilityNestedSelections: number;
138
+ readonly utilityMomentumSelections: number;
139
+ readonly utilityCooldownSuppressions: number;
140
+ readonly botReplacementSlots: number;
141
+ readonly humanInputSlots: number;
142
+ readonly botInputSlots: number;
143
+ readonly mixedHumanBotLanes: boolean;
144
+ }
145
+ export declare function createDeterministicBotBlackboard(entries: readonly DeterministicBlackboardEntry[]): DeterministicBotBlackboard;
146
+ export declare function getBlackboardValue(blackboard: DeterministicBotBlackboard, key: string): DeterministicBlackboardValue | undefined;
147
+ export declare function tickDeterministicHfsm(definition: DeterministicHfsmDefinition, agent: DeterministicHfsmAgent, blackboard: DeterministicBotBlackboard): DeterministicHfsmAgent;
148
+ export declare function tickDeterministicBehaviorTree(node: DeterministicBehaviorTreeNode, blackboard: DeterministicBotBlackboard): DeterministicBehaviorTreeTick;
149
+ export declare function tickDeterministicBehaviorTreeWithMemory(node: DeterministicBehaviorTreeNode, blackboard: DeterministicBotBlackboard, memory?: DeterministicBehaviorTreeMemory): DeterministicBehaviorTreeStatefulTick;
150
+ export declare function selectDeterministicUtility(considerations: readonly DeterministicUtilityConsideration[], blackboard: DeterministicBotBlackboard): DeterministicUtilitySelection;
151
+ export declare function cookDeterministicBotAsset(source: DeterministicBotAssetSource): CookedDeterministicBotAsset;
152
+ export declare function runDeterministicBotSimulation(players: number, frames: number, seed: number, restoreFrame?: number): DeterministicBotSimulationMetrics;
@@ -0,0 +1,472 @@
1
+ import { canonicalStringify, cloneCanonical, defaultChecksum } from './canonical.js';
2
+ export function createDeterministicBotBlackboard(entries) {
3
+ const sorted = [...entries].sort((left, right) => compareStrings(left.key, right.key));
4
+ const duplicate = sorted.find((entry, index) => index > 0 && entry.key === sorted[index - 1].key);
5
+ if (duplicate !== undefined) {
6
+ throw new Error(`Duplicate blackboard key ${duplicate.key}`);
7
+ }
8
+ return {
9
+ entries: sorted,
10
+ hash: defaultChecksum(sorted),
11
+ };
12
+ }
13
+ export function getBlackboardValue(blackboard, key) {
14
+ return blackboard.entries.find((entry) => entry.key === key)?.value;
15
+ }
16
+ export function tickDeterministicHfsm(definition, agent, blackboard) {
17
+ const states = new Map(definition.states.map((state) => [state.id, state]));
18
+ const current = states.get(agent.state);
19
+ if (current === undefined) {
20
+ throw new Error(`Unknown HFSM state ${agent.state}`);
21
+ }
22
+ const transition = definition.transitions
23
+ .filter((candidate) => candidate.from === agent.state || candidate.from === current.parent)
24
+ .sort(compareTransitions)
25
+ .find((candidate) => getBlackboardValue(blackboard, candidate.whenKey) === candidate.equals);
26
+ const nextState = transition?.to ?? agent.state;
27
+ const next = states.get(nextState);
28
+ if (next === undefined) {
29
+ throw new Error(`Unknown HFSM transition target ${nextState}`);
30
+ }
31
+ const actionLog = next.action === undefined ? agent.actionLog : [...agent.actionLog, next.action];
32
+ return {
33
+ state: nextState,
34
+ transitionsTaken: agent.transitionsTaken + (transition === undefined ? 0 : 1),
35
+ actionLog,
36
+ };
37
+ }
38
+ export function tickDeterministicBehaviorTree(node, blackboard) {
39
+ const visitedNodeIds = [];
40
+ const actions = [];
41
+ const status = evaluateBehaviorTree(node, blackboard, visitedNodeIds, actions);
42
+ return {
43
+ status,
44
+ actions,
45
+ visitedNodeIds,
46
+ };
47
+ }
48
+ export function tickDeterministicBehaviorTreeWithMemory(node, blackboard, memory = { runningNodeIds: [], completedRunningNodeIds: [] }) {
49
+ const visitedNodeIds = [];
50
+ const actions = [];
51
+ const resumedNodeIds = [];
52
+ const serviceActions = [];
53
+ const serviceNodeIds = [];
54
+ const nextMemory = {
55
+ runningNodeIds: [...memory.runningNodeIds].sort(compareStrings),
56
+ completedRunningNodeIds: [...memory.completedRunningNodeIds].sort(compareStrings),
57
+ };
58
+ const status = evaluateBehaviorTreeWithMemory(node, blackboard, visitedNodeIds, actions, resumedNodeIds, serviceActions, serviceNodeIds, nextMemory);
59
+ return {
60
+ status,
61
+ actions,
62
+ visitedNodeIds,
63
+ memory: {
64
+ runningNodeIds: nextMemory.runningNodeIds.sort(compareStrings),
65
+ completedRunningNodeIds: nextMemory.completedRunningNodeIds.sort(compareStrings),
66
+ },
67
+ resumedNodeIds: resumedNodeIds.sort(compareStrings),
68
+ serviceActions,
69
+ serviceNodeIds: serviceNodeIds.sort(compareStrings),
70
+ };
71
+ }
72
+ export function selectDeterministicUtility(considerations, blackboard) {
73
+ const scores = considerations
74
+ .map((consideration) => {
75
+ const baseScore = scoreUtilityInput(getBlackboardValue(blackboard, consideration.inputKey), consideration.min, consideration.max, consideration.weight, consideration.curve ?? 'linear');
76
+ const nestedScore = (consideration.nested ?? []).reduce((sum, nested) => sum + scoreUtilityInput(getBlackboardValue(blackboard, nested.inputKey), nested.min, nested.max, nested.weight, nested.curve ?? 'linear'), 0);
77
+ const momentumValue = consideration.momentumKey === undefined ? undefined : getBlackboardValue(blackboard, consideration.momentumKey);
78
+ const momentumScore = typeof momentumValue === 'number'
79
+ ? Math.trunc(momentumValue * (consideration.momentum ?? 0))
80
+ : momentumValue === true ? Math.trunc(consideration.momentum ?? 0) : 0;
81
+ const cooldownValue = consideration.cooldownKey === undefined ? undefined : getBlackboardValue(blackboard, consideration.cooldownKey);
82
+ const cooldownPenalty = typeof cooldownValue === 'number' && cooldownValue > 0
83
+ ? Math.trunc(cooldownValue * (consideration.cooldownPenalty ?? 1_000))
84
+ : cooldownValue === true ? Math.trunc(consideration.cooldownPenalty ?? 1_000) : 0;
85
+ const score = baseScore + nestedScore + momentumScore + (consideration.rank ?? 0) - cooldownPenalty;
86
+ return { id: consideration.id, score, baseScore, nestedScore, momentumScore, cooldownPenalty };
87
+ })
88
+ .sort((left, right) => right.score - left.score || compareStrings(left.id, right.id));
89
+ const selectedScore = scores[0];
90
+ const selected = considerations.find((consideration) => consideration.id === selectedScore.id);
91
+ if (selected === undefined) {
92
+ throw new Error('Utility selector requires at least one consideration');
93
+ }
94
+ return {
95
+ action: selected.action,
96
+ considerationId: selected.id,
97
+ score: selectedScore.score,
98
+ scores,
99
+ };
100
+ }
101
+ export function cookDeterministicBotAsset(source) {
102
+ const cooked = {
103
+ id: source.id,
104
+ hfsm: source.hfsm === undefined ? undefined : normalizeHfsm(source.hfsm),
105
+ behaviorTree: source.behaviorTree === undefined ? undefined : normalizeBehaviorTree(source.behaviorTree),
106
+ utility: source.utility === undefined
107
+ ? undefined
108
+ : [...source.utility].sort((left, right) => compareStrings(left.id, right.id)),
109
+ };
110
+ const bytes = canonicalStringify(cooked);
111
+ return {
112
+ id: source.id,
113
+ bytes,
114
+ hash: defaultChecksum(bytes),
115
+ };
116
+ }
117
+ export function runDeterministicBotSimulation(players, frames, seed, restoreFrame = -1) {
118
+ const hfsm = defaultHfsm();
119
+ const tree = defaultBehaviorTree();
120
+ const utility = defaultUtility();
121
+ const cooked = cookDeterministicBotAsset({ id: 'bot.default', hfsm, behaviorTree: tree, utility });
122
+ let bots = Array.from({ length: players }, (_, slot) => ({
123
+ slot,
124
+ lane: slot % 4 === 0 ? 'human' : 'bot',
125
+ hp: 10,
126
+ hfsm: { state: hfsm.initialState, transitionsTaken: 0, actionLog: [] },
127
+ target: (slot + 1) % players,
128
+ utility: 0,
129
+ utilityScoreBreakdown: [],
130
+ behaviorActions: [],
131
+ behaviorServiceActions: [],
132
+ behaviorStatus: 'success',
133
+ visitedBehaviorNodes: [],
134
+ behaviorMemory: { runningNodeIds: [], completedRunningNodeIds: [] },
135
+ }));
136
+ let snapshot = bots;
137
+ let hfsmTransitions = 0;
138
+ let behaviorTreeTicks = 0;
139
+ let behaviorRunningTicks = 0;
140
+ let behaviorResumeTicks = 0;
141
+ let behaviorDecoratorTicks = 0;
142
+ let behaviorServiceTicks = 0;
143
+ let utilitySelections = 0;
144
+ let utilityCurveSelections = 0;
145
+ let utilityNestedSelections = 0;
146
+ let utilityMomentumSelections = 0;
147
+ let utilityCooldownSuppressions = 0;
148
+ let humanInputSlots = 0;
149
+ let botInputSlots = 0;
150
+ for (let frame = 0; frame < frames; frame += 1) {
151
+ if (frame === restoreFrame) {
152
+ snapshot = cloneCanonical(bots);
153
+ }
154
+ if (restoreFrame >= 0 && frame === restoreFrame + 6) {
155
+ bots = cloneCanonical(snapshot);
156
+ for (let replay = restoreFrame; replay < frame; replay += 1) {
157
+ bots = stepBotFrame(bots, replay, seed, hfsm, tree, utility);
158
+ }
159
+ }
160
+ bots = stepBotFrame(bots, frame, seed, hfsm, tree, utility);
161
+ hfsmTransitions += bots.reduce((sum, bot) => sum + bot.hfsm.transitionsTaken, 0);
162
+ behaviorTreeTicks += bots.length;
163
+ behaviorRunningTicks += bots.filter((bot) => bot.behaviorStatus === 'running').length;
164
+ behaviorResumeTicks += bots.filter((bot) => bot.behaviorMemory.completedRunningNodeIds.length > 0).length;
165
+ behaviorDecoratorTicks += bots.filter((bot) => bot.visitedBehaviorNodes.includes('maybe-patrol')).length;
166
+ behaviorServiceTicks += bots.filter((bot) => bot.behaviorServiceActions.length > 0).length;
167
+ utilitySelections += bots.filter((bot) => bot.utility > 5_000).length;
168
+ utilityCurveSelections += bots.filter((bot) => bot.utilityScoreBreakdown.some((score) => score.baseScore !== 0)).length;
169
+ utilityNestedSelections += bots.filter((bot) => bot.utilityScoreBreakdown.some((score) => score.nestedScore !== 0)).length;
170
+ utilityMomentumSelections += bots.filter((bot) => bot.utilityScoreBreakdown.some((score) => score.momentumScore !== 0)).length;
171
+ utilityCooldownSuppressions += bots.filter((bot) => bot.utilityScoreBreakdown.some((score) => score.cooldownPenalty > 0)).length;
172
+ humanInputSlots += bots.filter((bot) => bot.lane === 'human').length;
173
+ botInputSlots += bots.filter((bot) => bot.lane === 'bot').length;
174
+ }
175
+ const blackboard = createDeterministicBotBlackboard(bots.map((bot) => ({
176
+ key: `slot:${bot.slot.toString().padStart(3, '0')}`,
177
+ value: `${bot.hfsm.state}:${bot.target}`,
178
+ })));
179
+ return {
180
+ checksum: defaultChecksum(bots),
181
+ blackboardHash: blackboard.hash,
182
+ cookedBotHash: cooked.hash,
183
+ styles: 'behavior-tree,hfsm,utility',
184
+ hfsmTransitions,
185
+ behaviorTreeTicks,
186
+ behaviorRunningTicks,
187
+ behaviorResumeTicks,
188
+ behaviorDecoratorTicks,
189
+ behaviorServiceTicks,
190
+ utilitySelections,
191
+ utilityCurveSelections,
192
+ utilityNestedSelections,
193
+ utilityMomentumSelections,
194
+ utilityCooldownSuppressions,
195
+ botReplacementSlots: bots.filter((bot) => bot.lane === 'bot' && bot.slot >= Math.floor(players / 2)).length,
196
+ humanInputSlots,
197
+ botInputSlots,
198
+ mixedHumanBotLanes: humanInputSlots > 0 && botInputSlots > 0,
199
+ };
200
+ }
201
+ function stepBotFrame(bots, frame, seed, hfsm, tree, utility) {
202
+ return bots.map((bot) => {
203
+ const threat = (seed + frame + bot.slot) % 10;
204
+ const health = Math.max(0, bot.hp - ((frame + bot.slot) % 17 === 0 ? 1 : 0));
205
+ const blackboard = createDeterministicBotBlackboard([
206
+ { key: 'health', value: health },
207
+ { key: 'hasTarget', value: true },
208
+ { key: 'threat', value: threat },
209
+ { key: 'ammo', value: 5 - ((frame + bot.slot) % 5) },
210
+ { key: 'lastActionAttack', value: bot.utility > 5_000 },
211
+ { key: 'attackCooldown', value: (frame + bot.slot) % 11 === 0 ? 2 : 0 },
212
+ { key: 'frame', value: frame },
213
+ ]);
214
+ const nextHfsm = tickDeterministicHfsm(hfsm, bot.hfsm, blackboard);
215
+ const treeTick = tickDeterministicBehaviorTreeWithMemory(tree, blackboard, bot.behaviorMemory);
216
+ const selected = selectDeterministicUtility(utility, blackboard);
217
+ return {
218
+ slot: bot.slot,
219
+ lane: bot.lane,
220
+ hp: health,
221
+ hfsm: nextHfsm,
222
+ target: (bot.slot + 1 + (selected.action === 'flank' ? 1 : 0)) % bots.length,
223
+ utility: selected.score,
224
+ utilityScoreBreakdown: selected.scores,
225
+ behaviorActions: treeTick.actions,
226
+ behaviorServiceActions: treeTick.serviceActions,
227
+ behaviorStatus: treeTick.status,
228
+ visitedBehaviorNodes: treeTick.visitedNodeIds,
229
+ behaviorMemory: treeTick.memory,
230
+ };
231
+ });
232
+ }
233
+ function evaluateBehaviorTree(node, blackboard, visitedNodeIds, actions) {
234
+ visitedNodeIds.push(node.id);
235
+ if (node.type === 'condition') {
236
+ return getBlackboardValue(blackboard, node.key) === node.equals ? 'success' : 'failure';
237
+ }
238
+ if (node.type === 'action') {
239
+ actions.push(node.action);
240
+ return node.status ?? 'success';
241
+ }
242
+ if (node.type === 'decorator') {
243
+ const status = evaluateBehaviorTree(node.child, blackboard, visitedNodeIds, actions);
244
+ if (node.mode === 'force-success') {
245
+ return 'success';
246
+ }
247
+ if (node.mode === 'force-failure') {
248
+ return 'failure';
249
+ }
250
+ if (status === 'success') {
251
+ return 'failure';
252
+ }
253
+ if (status === 'failure') {
254
+ return 'success';
255
+ }
256
+ return 'running';
257
+ }
258
+ if (node.type === 'sequence') {
259
+ for (const child of node.children) {
260
+ const status = evaluateBehaviorTree(child, blackboard, visitedNodeIds, actions);
261
+ if (status !== 'success') {
262
+ return status;
263
+ }
264
+ }
265
+ return 'success';
266
+ }
267
+ for (const child of node.children) {
268
+ const status = evaluateBehaviorTree(child, blackboard, visitedNodeIds, actions);
269
+ if (status !== 'failure') {
270
+ return status;
271
+ }
272
+ }
273
+ return 'failure';
274
+ }
275
+ function evaluateBehaviorTreeWithMemory(node, blackboard, visitedNodeIds, actions, resumedNodeIds, serviceActions, serviceNodeIds, memory) {
276
+ visitedNodeIds.push(node.id);
277
+ runBehaviorTreeServices(node, blackboard, serviceActions, serviceNodeIds);
278
+ if (node.type === 'condition') {
279
+ return getBlackboardValue(blackboard, node.key) === node.equals ? 'success' : 'failure';
280
+ }
281
+ if (node.type === 'action') {
282
+ actions.push(node.action);
283
+ if (node.status !== 'running') {
284
+ removeRunningNode(memory, node.id);
285
+ return node.status ?? 'success';
286
+ }
287
+ if (memory.runningNodeIds.includes(node.id)) {
288
+ removeRunningNode(memory, node.id);
289
+ if (!memory.completedRunningNodeIds.includes(node.id)) {
290
+ memory.completedRunningNodeIds.push(node.id);
291
+ }
292
+ resumedNodeIds.push(node.id);
293
+ return 'success';
294
+ }
295
+ if (!memory.completedRunningNodeIds.includes(node.id)) {
296
+ memory.runningNodeIds.push(node.id);
297
+ return 'running';
298
+ }
299
+ return 'success';
300
+ }
301
+ if (node.type === 'decorator') {
302
+ const status = evaluateBehaviorTreeWithMemory(node.child, blackboard, visitedNodeIds, actions, resumedNodeIds, serviceActions, serviceNodeIds, memory);
303
+ if (node.mode === 'force-success') {
304
+ return 'success';
305
+ }
306
+ if (node.mode === 'force-failure') {
307
+ return 'failure';
308
+ }
309
+ if (status === 'success') {
310
+ return 'failure';
311
+ }
312
+ if (status === 'failure') {
313
+ return 'success';
314
+ }
315
+ return 'running';
316
+ }
317
+ if (node.type === 'sequence') {
318
+ for (const child of node.children) {
319
+ const status = evaluateBehaviorTreeWithMemory(child, blackboard, visitedNodeIds, actions, resumedNodeIds, serviceActions, serviceNodeIds, memory);
320
+ if (status !== 'success') {
321
+ return status;
322
+ }
323
+ }
324
+ return 'success';
325
+ }
326
+ for (const child of node.children) {
327
+ const status = evaluateBehaviorTreeWithMemory(child, blackboard, visitedNodeIds, actions, resumedNodeIds, serviceActions, serviceNodeIds, memory);
328
+ if (status !== 'failure') {
329
+ return status;
330
+ }
331
+ }
332
+ return 'failure';
333
+ }
334
+ function runBehaviorTreeServices(node, blackboard, serviceActions, serviceNodeIds) {
335
+ const frame = getBlackboardValue(blackboard, 'frame');
336
+ const frameNumber = typeof frame === 'number' ? frame : 0;
337
+ for (const service of [...(node.services ?? [])].sort((left, right) => compareStrings(left.id, right.id))) {
338
+ if (service.intervalFrames <= 0) {
339
+ throw new Error(`Behavior service ${service.id} interval must be positive`);
340
+ }
341
+ if (frameNumber % service.intervalFrames === 0) {
342
+ serviceActions.push(service.action);
343
+ serviceNodeIds.push(`service:${service.id}`);
344
+ }
345
+ }
346
+ }
347
+ function scoreUtilityInput(value, min, max, weight, curve) {
348
+ const numericValue = typeof value === 'number' ? value : value === true ? max : min;
349
+ const clamped = Math.max(min, Math.min(max, numericValue));
350
+ const range = Math.max(1, max - min);
351
+ const linear = Math.trunc(((clamped - min) * 1_000) / range);
352
+ const curved = curve === 'inverse'
353
+ ? 1_000 - linear
354
+ : curve === 'quadratic'
355
+ ? Math.trunc((linear * linear) / 1_000)
356
+ : curve === 'step'
357
+ ? linear >= 500 ? 1_000 : 0
358
+ : linear;
359
+ return Math.trunc(curved * weight);
360
+ }
361
+ function removeRunningNode(memory, nodeId) {
362
+ memory.runningNodeIds = memory.runningNodeIds.filter((id) => id !== nodeId);
363
+ }
364
+ function normalizeHfsm(definition) {
365
+ return {
366
+ initialState: definition.initialState,
367
+ states: [...definition.states].sort((left, right) => compareStrings(left.id, right.id)),
368
+ transitions: [...definition.transitions].sort(compareTransitions),
369
+ };
370
+ }
371
+ function normalizeBehaviorTree(node) {
372
+ if (node.type === 'action' || node.type === 'condition') {
373
+ return { ...node, services: normalizeBehaviorServices(node.services) };
374
+ }
375
+ if (node.type === 'decorator') {
376
+ return { ...node, services: normalizeBehaviorServices(node.services), child: normalizeBehaviorTree(node.child) };
377
+ }
378
+ return {
379
+ ...node,
380
+ services: normalizeBehaviorServices(node.services),
381
+ children: node.children.map(normalizeBehaviorTree),
382
+ };
383
+ }
384
+ function normalizeBehaviorServices(services) {
385
+ if (services === undefined) {
386
+ return undefined;
387
+ }
388
+ return [...services].sort((left, right) => compareStrings(left.id, right.id));
389
+ }
390
+ function compareTransitions(left, right) {
391
+ return compareStrings(`${left.from}:${left.whenKey}:${left.to}`, `${right.from}:${right.whenKey}:${right.to}`);
392
+ }
393
+ function compareStrings(left, right) {
394
+ return left < right ? -1 : left > right ? 1 : 0;
395
+ }
396
+ function defaultHfsm() {
397
+ return {
398
+ initialState: 'idle',
399
+ states: [
400
+ { id: 'idle', action: 'wait' },
401
+ { id: 'seek', action: 'move' },
402
+ { id: 'attack', parent: 'seek', action: 'fire' },
403
+ { id: 'retreat', action: 'fallback' },
404
+ ],
405
+ transitions: [
406
+ { from: 'idle', to: 'seek', whenKey: 'hasTarget', equals: true },
407
+ { from: 'seek', to: 'attack', whenKey: 'threat', equals: 7 },
408
+ { from: 'attack', to: 'retreat', whenKey: 'health', equals: 3 },
409
+ { from: 'retreat', to: 'seek', whenKey: 'health', equals: 8 },
410
+ ],
411
+ };
412
+ }
413
+ function defaultBehaviorTree() {
414
+ return {
415
+ id: 'root',
416
+ type: 'selector',
417
+ services: [{ id: 'root-targeting-service', action: 'update-target', intervalFrames: 3 }],
418
+ children: [
419
+ {
420
+ id: 'attack-sequence',
421
+ type: 'sequence',
422
+ children: [
423
+ { id: 'has-target', type: 'condition', key: 'hasTarget', equals: true },
424
+ {
425
+ id: 'maybe-patrol',
426
+ type: 'decorator',
427
+ mode: 'force-success',
428
+ child: { id: 'patrol-if-calm', type: 'condition', key: 'threat', equals: 0 },
429
+ },
430
+ {
431
+ id: 'windup-if-danger',
432
+ type: 'selector',
433
+ children: [
434
+ {
435
+ id: 'danger-windup',
436
+ type: 'sequence',
437
+ children: [
438
+ { id: 'is-dangerous', type: 'condition', key: 'threat', equals: 9 },
439
+ { id: 'windup-action', type: 'action', action: 'windup', status: 'running' },
440
+ ],
441
+ },
442
+ { id: 'ready-action', type: 'action', action: 'ready' },
443
+ ],
444
+ },
445
+ { id: 'attack-action', type: 'action', action: 'attack' },
446
+ ],
447
+ },
448
+ { id: 'idle-action', type: 'action', action: 'idle' },
449
+ ],
450
+ };
451
+ }
452
+ function defaultUtility() {
453
+ return [
454
+ {
455
+ id: 'attack',
456
+ inputKey: 'threat',
457
+ action: 'attack',
458
+ min: 0,
459
+ max: 9,
460
+ weight: 7,
461
+ rank: 2,
462
+ curve: 'quadratic',
463
+ momentumKey: 'lastActionAttack',
464
+ momentum: 2_000,
465
+ cooldownKey: 'attackCooldown',
466
+ cooldownPenalty: 3_000,
467
+ nested: [{ id: 'ammo-ready', inputKey: 'ammo', min: 0, max: 5, weight: 2, curve: 'step' }],
468
+ },
469
+ { id: 'flank', inputKey: 'threat', action: 'flank', min: 0, max: 9, weight: 6, rank: 1, curve: 'linear' },
470
+ { id: 'retreat', inputKey: 'health', action: 'retreat', min: 0, max: 10, weight: 5, curve: 'inverse' },
471
+ ];
472
+ }
@@ -0,0 +1,57 @@
1
+ export { verifyReplay } from './replay.js';
2
+ export { verifyReplayWithDescriptor as verifyDeterministicReplay } from './replay.js';
3
+ export { createOfflineSession } from './offline-session.js';
4
+ export { createSyncplayOfflineRuntime } from './sdk-offline.js';
5
+ export { createSyncplayOfflineRuntime as createSyncplayGameRuntime } from './sdk-offline.js';
6
+ export { runNumberLab } from './number-lab.js';
7
+ export { runDeterministicEngineCoreNumericProof } from './engine-core-proof.js';
8
+ export { hydrateLabInput, labDefaultInput, labStep } from './sample-lab.js';
9
+ export { createFixedArenaDescriptor, createInitialFixedArenaState, fixedArenaDefaultInput, fixedArenaStep, projectFixedArenaReferenceView, projectFixedArenaRenderState, runFixedArenaExample, } from './examples/fixed-arena.js';
10
+ export { createDeterministicR3fRenderAdapter as createDeterministicR3fAdapter, createDeterministicR3fRenderAdapter, interpolateDeterministicRenderNumber, interpolateDeterministicRenderVec2, } from './r3f-render-adapter.js';
11
+ export * from './animation.js';
12
+ export * from './asset-cooking.js';
13
+ export * from './bot-documents.js';
14
+ export * from './bot-primitives.js';
15
+ export * from './canonical.js';
16
+ export * from './collections.js';
17
+ export * from './commands.js';
18
+ export * from './config-bundle.js';
19
+ export * from './deterministic-session.js';
20
+ export * from './effects-adapter.js';
21
+ export * from './engine-runtime.js';
22
+ export * from './events.js';
23
+ export { deterministicButtonInitialState, runDeterministicButtonFixture, runDeterministicDescriptorButtonFixture, stepDeterministicButton, } from './input-button.js';
24
+ export type { DeterministicButtonFixtureResult, DeterministicButtonState, DeterministicButtonStep, DeterministicDescriptorButtonFixtureResult, } 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 type { DeterministicAuthorityCertificationArtifact, DeterministicAuthorityCertificationVerification, DeterministicAuthorityChecksums, SyncplayClient, SyncplayClientConnection, SyncplayClientRole, SyncplayCommand, SyncplayCommandPollOptions, SyncplayCommandSubmitResult, SyncplayInput, SyncplayLifecycleResult, SyncplaySubmitResult, } from './multiplayer-service.js';
40
+ export * from './movement.js';
41
+ export * from './movement3d.js';
42
+ export * from './navigation.js';
43
+ export * from './navmesh.js';
44
+ export * from './collision.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';
56
+ export type { DeterministicEngineCoreNumericProof, DeterministicEngineCoreNumericProofOptions } from './engine-core-proof.js';
57
+ export type { DeterministicStep, ReplayFile, ReplayVerificationResult } from './types.js';