@voltro/plugin-rooms 0.0.0-stage → 0.88.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 (495) hide show
  1. package/CHANGELOG.md +24492 -0
  2. package/LICENSE +61 -0
  3. package/README.md +9204 -2
  4. package/SECURITY.md +56 -0
  5. package/THIRD-PARTY-NOTICES.md +12496 -0
  6. package/dist/actor.js +1473 -0
  7. package/dist/apiBinding.js +677 -0
  8. package/dist/apiRegistryBinding.js +398 -0
  9. package/dist/apiReservations.js +432 -0
  10. package/dist/baselines.js +72 -0
  11. package/dist/bots.d.ts +1485 -0
  12. package/dist/bots.js +562 -0
  13. package/dist/catalog.js +79 -0
  14. package/dist/checkpointJson.js +23 -0
  15. package/dist/checkpointStore.js +385 -0
  16. package/dist/client.js +55 -0
  17. package/dist/clockSync.js +50 -0
  18. package/dist/collision.js +155 -0
  19. package/dist/commandDelivery.js +100 -0
  20. package/dist/commandRecord.js +10 -0
  21. package/dist/commandWithdrawal.js +182 -0
  22. package/dist/connection.js +496 -0
  23. package/dist/controlCarrier.js +374 -0
  24. package/dist/controlRegistry.js +78 -0
  25. package/dist/controlTarget.js +44 -0
  26. package/dist/controlTransport.js +573 -0
  27. package/dist/developmentBinding.js +112 -0
  28. package/dist/directory.js +322 -0
  29. package/dist/directoryProjection.js +116 -0
  30. package/dist/errors.d.ts +125 -0
  31. package/dist/errors.js +52 -0
  32. package/dist/fixed.d.ts +284 -0
  33. package/dist/fixed.js +10 -0
  34. package/dist/fixed32.js +133 -0
  35. package/dist/fixedCollision.js +59 -0
  36. package/dist/fixedCollision32.js +108 -0
  37. package/dist/fixedMath.js +55 -0
  38. package/dist/fixedRaw.js +10 -0
  39. package/dist/fixedSlabs.js +33 -0
  40. package/dist/fixedTrig.js +47 -0
  41. package/dist/fixedTrig32.js +37 -0
  42. package/dist/fixedVectors.js +112 -0
  43. package/dist/fixedVectors32.js +94 -0
  44. package/dist/fixedWide.js +49 -0
  45. package/dist/fixedWords.js +45 -0
  46. package/dist/gateway.js +56 -0
  47. package/dist/geometry-retention-app/rooms.geometryJournalRetention.workflow.server.tsx +4 -0
  48. package/dist/geometry-retention-app/rooms.geometryJournalRetention.workflow.tsx +14 -0
  49. package/dist/geometry-worker/worker.d.mts +2 -0
  50. package/dist/geometry-worker/worker.mjs +50 -0
  51. package/dist/geometry.d.ts +2249 -0
  52. package/dist/geometry.js +40 -0
  53. package/dist/geometryActivation.js +81 -0
  54. package/dist/geometryActorInventory.js +107 -0
  55. package/dist/geometryAdminClient.js +86 -0
  56. package/dist/geometryAdminData.js +31 -0
  57. package/dist/geometryAdminFixtures.js +49 -0
  58. package/dist/geometryAdminPorts.js +4 -0
  59. package/dist/geometryAdminRpc.js +57 -0
  60. package/dist/geometryAdminRpcRoutes.js +48 -0
  61. package/dist/geometryAdminSchemas.js +38 -0
  62. package/dist/geometryAdministration.js +189 -0
  63. package/dist/geometryAdministrationPorts.js +4 -0
  64. package/dist/geometryApiBinding.js +164 -0
  65. package/dist/geometryAppStorage.js +57 -0
  66. package/dist/geometryArtifacts.js +197 -0
  67. package/dist/geometryAssetBundle.js +116 -0
  68. package/dist/geometryAssetClient.js +24 -0
  69. package/dist/geometryAssetData.js +105 -0
  70. package/dist/geometryAssetHttp.js +122 -0
  71. package/dist/geometryAssetPorts.js +4 -0
  72. package/dist/geometryAssetRpc.js +29 -0
  73. package/dist/geometryAssetRpcRoutes.js +39 -0
  74. package/dist/geometryAssetStorageGrant.js +102 -0
  75. package/dist/geometryBoxOverlap.js +109 -0
  76. package/dist/geometryCatalogueDigest.js +110 -0
  77. package/dist/geometryCellCoverage.js +84 -0
  78. package/dist/geometryCellLoader.js +27 -0
  79. package/dist/geometryChannel.js +133 -0
  80. package/dist/geometryChunkHttp.js +53 -0
  81. package/dist/geometryChunkLeases.js +21 -0
  82. package/dist/geometryClient.d.ts +1429 -0
  83. package/dist/geometryClient.js +148 -0
  84. package/dist/geometryClientChunks.js +329 -0
  85. package/dist/geometryClientDelta.js +24 -0
  86. package/dist/geometryClientHttp.js +36 -0
  87. package/dist/geometryClientInterest.js +108 -0
  88. package/dist/geometryClientStatic.js +33 -0
  89. package/dist/geometryCms.d.ts +763 -0
  90. package/dist/geometryCms.js +216 -0
  91. package/dist/geometryCommitCoordinator.js +240 -0
  92. package/dist/geometryCompactionFixture.js +83 -0
  93. package/dist/geometryCompactionStrategies.js +37 -0
  94. package/dist/geometryConnectionClient.js +22 -0
  95. package/dist/geometryDerivationFixtures.js +140 -0
  96. package/dist/geometryDerivationStrategies.js +26 -0
  97. package/dist/geometryDigest.js +12 -0
  98. package/dist/geometryEditChannel.js +69 -0
  99. package/dist/geometryEditIngress.js +262 -0
  100. package/dist/geometryEdits.js +365 -0
  101. package/dist/geometryEnvelope.js +40 -0
  102. package/dist/geometryGridRaycast.js +91 -0
  103. package/dist/geometryGridSweep.js +91 -0
  104. package/dist/geometryHeightfield.js +165 -0
  105. package/dist/geometryHeightfieldRaycast.js +73 -0
  106. package/dist/geometryHeightfieldSweep.js +84 -0
  107. package/dist/geometryHeightfieldVolume.js +44 -0
  108. package/dist/geometryHost.js +321 -0
  109. package/dist/geometryHostDirectory.js +206 -0
  110. package/dist/geometryHostMutations.js +136 -0
  111. package/dist/geometryHostStreams.js +123 -0
  112. package/dist/geometryHttpBody.js +75 -0
  113. package/dist/geometryHttpRoutes.js +111 -0
  114. package/dist/geometryImportGltf.js +299 -0
  115. package/dist/geometryImportLdtk.js +53 -0
  116. package/dist/geometryImportPng.js +143 -0
  117. package/dist/geometryImportPublication.js +66 -0
  118. package/dist/geometryImportTiled.js +38 -0
  119. package/dist/geometryImportTiles.js +135 -0
  120. package/dist/geometryImportVox.js +129 -0
  121. package/dist/geometryImportedSource.js +100 -0
  122. package/dist/geometryInspectEndpoint.js +247 -0
  123. package/dist/geometryInspection.js +91 -0
  124. package/dist/geometryInstall.js +120 -0
  125. package/dist/geometryJournalArchiveData.js +20 -0
  126. package/dist/geometryJournalArchiveIndex.js +329 -0
  127. package/dist/geometryJournalArchiveTable.js +20 -0
  128. package/dist/geometryJournalCompaction.js +99 -0
  129. package/dist/geometryJournalPatch.js +46 -0
  130. package/dist/geometryJournalRetention.js +111 -0
  131. package/dist/geometryJournalRetentionSchemas.js +35 -0
  132. package/dist/geometryJournalRetentionSweep.js +111 -0
  133. package/dist/geometryJournalRetentionWorkflow.js +27 -0
  134. package/dist/geometryJournalRetentionWorkflowData.js +30 -0
  135. package/dist/geometryJournalStorage.js +147 -0
  136. package/dist/geometryLoader.js +117 -0
  137. package/dist/geometryManifest.js +112 -0
  138. package/dist/geometryManifestChannel.js +92 -0
  139. package/dist/geometryManifestClient.js +121 -0
  140. package/dist/geometryManifestData.js +48 -0
  141. package/dist/geometryManifestPorts.js +4 -0
  142. package/dist/geometryManifestPublication.js +108 -0
  143. package/dist/geometryManifestSource.js +67 -0
  144. package/dist/geometryMigrationJournal.js +13 -0
  145. package/dist/geometryMigrationStrategies.js +6 -0
  146. package/dist/geometryMigrations.js +322 -0
  147. package/dist/geometryNativeMetadata.js +51 -0
  148. package/dist/geometryPatch.js +169 -0
  149. package/dist/geometryPersistence.js +448 -0
  150. package/dist/geometryPersistenceCapture.js +68 -0
  151. package/dist/geometryPersistenceData.js +139 -0
  152. package/dist/geometryPersistencePorts.js +4 -0
  153. package/dist/geometryPlayerAdmission.js +33 -0
  154. package/dist/geometryPlayerEditOwner.js +264 -0
  155. package/dist/geometryPlayerEdits.js +48 -0
  156. package/dist/geometryPrepared.js +187 -0
  157. package/dist/geometryPrivacyFence.js +23 -0
  158. package/dist/geometryProceduralPublication.js +90 -0
  159. package/dist/geometryProceduralWorker.js +163 -0
  160. package/dist/geometryPublication.js +109 -0
  161. package/dist/geometryRayAlgebra.js +115 -0
  162. package/dist/geometryReadClient.js +156 -0
  163. package/dist/geometryReadPorts.js +4 -0
  164. package/dist/geometryReadRpc.js +26 -0
  165. package/dist/geometryReadRpcRoutes.js +46 -0
  166. package/dist/geometryReliablePublication.js +81 -0
  167. package/dist/geometryReloadPorts.js +45 -0
  168. package/dist/geometryReloadSource.js +277 -0
  169. package/dist/geometryRenderCache.js +164 -0
  170. package/dist/geometryRenderLod.js +101 -0
  171. package/dist/geometryRollback.js +124 -0
  172. package/dist/geometryRollbackCoordinator.js +202 -0
  173. package/dist/geometryRollbackPorts.js +45 -0
  174. package/dist/geometryRollbackSource.js +208 -0
  175. package/dist/geometryRollbackStore.js +197 -0
  176. package/dist/geometrySchemas.js +26 -0
  177. package/dist/geometryServer.d.ts +2766 -0
  178. package/dist/geometryServer.js +62 -0
  179. package/dist/geometryShapeRaycast.js +110 -0
  180. package/dist/geometryShapeSegments.js +33 -0
  181. package/dist/geometryShapes.js +222 -0
  182. package/dist/geometrySnapshot.js +75 -0
  183. package/dist/geometrySnapshotChannel.js +159 -0
  184. package/dist/geometrySnapshotClient.js +158 -0
  185. package/dist/geometrySnapshotPreparation.js +75 -0
  186. package/dist/geometrySnapshotServer.js +190 -0
  187. package/dist/geometrySqlOwner.js +20 -0
  188. package/dist/geometryStorage.js +126 -0
  189. package/dist/geometryStorageGrant.js +68 -0
  190. package/dist/geometryStorageIdentity.js +8 -0
  191. package/dist/geometryTileArtifact.js +9 -0
  192. package/dist/geometryTileCodec.js +193 -0
  193. package/dist/geometryTileCollision.js +95 -0
  194. package/dist/geometryTileNavigation.js +127 -0
  195. package/dist/geometryTileView.js +34 -0
  196. package/dist/geometryVersionActivation.js +113 -0
  197. package/dist/geometryVersionClient.js +237 -0
  198. package/dist/geometryVersionCompare.js +39 -0
  199. package/dist/geometryVersionMigration.js +105 -0
  200. package/dist/geometryVoxel.js +252 -0
  201. package/dist/geometryWorldEntitySubject.js +31 -0
  202. package/dist/geometryWorldExtent.js +11 -0
  203. package/dist/geometryWorldMetadata.js +37 -0
  204. package/dist/geometryWorldStrategyFixtures.js +126 -0
  205. package/dist/geometryWorldView.js +306 -0
  206. package/dist/host.js +127 -0
  207. package/dist/hostBinding.js +276 -0
  208. package/dist/hostCellObservation.js +113 -0
  209. package/dist/hostClientCapacity.js +89 -0
  210. package/dist/hostCommandScope.js +63 -0
  211. package/dist/hostController.js +3093 -0
  212. package/dist/hostDeployment.js +64 -0
  213. package/dist/hostDrain.js +151 -0
  214. package/dist/hostDrainPorts.js +4 -0
  215. package/dist/hostDriver.js +178 -0
  216. package/dist/hostLane.js +287 -0
  217. package/dist/hostListener.js +78 -0
  218. package/dist/hostListenerBinding.js +18 -0
  219. package/dist/hostLoopObservation.js +89 -0
  220. package/dist/hostMetrics.js +55 -0
  221. package/dist/hostRegistryBinding.js +417 -0
  222. package/dist/hostSelection.js +15 -0
  223. package/dist/hostShutdown.js +46 -0
  224. package/dist/hostTurnObservation.js +52 -0
  225. package/dist/identities.js +3 -0
  226. package/dist/index.d.ts +8632 -0
  227. package/dist/index.js +231 -0
  228. package/dist/inputReceipts.js +62 -0
  229. package/dist/inputRedundancy.js +54 -0
  230. package/dist/inspect.js +237 -0
  231. package/dist/lockstep.d.ts +436 -0
  232. package/dist/lockstep.js +381 -0
  233. package/dist/lockstepAdmission.js +261 -0
  234. package/dist/lockstepAdmissionCodec.js +93 -0
  235. package/dist/lockstepAdmissionPorts.js +4 -0
  236. package/dist/lockstepClientSession.js +577 -0
  237. package/dist/lockstepDefinition.js +147 -0
  238. package/dist/lockstepHostLoop.js +242 -0
  239. package/dist/lockstepInitialAdmission.js +66 -0
  240. package/dist/lockstepInitialStrategyFixtures.js +44 -0
  241. package/dist/lockstepJournal.js +394 -0
  242. package/dist/lockstepJournalCodec.js +253 -0
  243. package/dist/lockstepJournalPorts.js +4 -0
  244. package/dist/lockstepJournalRebuild.js +207 -0
  245. package/dist/lockstepJournalRows.js +56 -0
  246. package/dist/lockstepMembers.js +130 -0
  247. package/dist/lockstepMessages.js +46 -0
  248. package/dist/lockstepOwnedRoom.js +763 -0
  249. package/dist/lockstepPolicies.js +83 -0
  250. package/dist/lockstepReact.js +46 -0
  251. package/dist/lockstepRecoveryTruth.js +120 -0
  252. package/dist/lockstepRosterConfig.js +31 -0
  253. package/dist/lockstepSeed.js +11 -0
  254. package/dist/lockstepSeedFixture.js +19 -0
  255. package/dist/lockstepServer.d.ts +3897 -0
  256. package/dist/lockstepServer.js +324 -0
  257. package/dist/lockstepServerConfig.js +100 -0
  258. package/dist/lockstepServerRoles.js +402 -0
  259. package/dist/lockstepServerStrategyFixtures.js +32 -0
  260. package/dist/lockstepStrategies.js +5 -0
  261. package/dist/lockstepStrategyFixtures.js +136 -0
  262. package/dist/lockstepTerminal.js +89 -0
  263. package/dist/lockstepTerminalPorts.js +4 -0
  264. package/dist/lockstepTransport.js +772 -0
  265. package/dist/lockstepTransportConfig.js +31 -0
  266. package/dist/lockstepWireRoster.js +33 -0
  267. package/dist/matchRoomProvider.js +31 -0
  268. package/dist/matchRooms.js +18 -0
  269. package/dist/membershipObserver.js +46 -0
  270. package/dist/moderation.js +97 -0
  271. package/dist/movementSpecials.js +103 -0
  272. package/dist/ownership.js +16 -0
  273. package/dist/ownershipWithdrawal.js +17 -0
  274. package/dist/pcg32.js +95 -0
  275. package/dist/ports.d.ts +1241 -0
  276. package/dist/ports.js +10 -0
  277. package/dist/quaternion.js +69 -0
  278. package/dist/react.d.ts +406 -0
  279. package/dist/react.js +108 -0
  280. package/dist/reaper-app/rooms.reaper.workflow.server.tsx +5 -0
  281. package/dist/reaper-app/rooms.reaper.workflow.tsx +13 -0
  282. package/dist/reaper.js +242 -0
  283. package/dist/reaperSchemas.js +41 -0
  284. package/dist/reaperWorkflow.js +69 -0
  285. package/dist/recovery.js +188 -0
  286. package/dist/recoverySeats.js +25 -0
  287. package/dist/replay.d.ts +273 -0
  288. package/dist/replay.js +484 -0
  289. package/dist/replayPorts.js +4 -0
  290. package/dist/replayRecording.js +66 -0
  291. package/dist/replaySchema.js +156 -0
  292. package/dist/replayStorage.d.ts +149 -0
  293. package/dist/replayStorage.js +484 -0
  294. package/dist/reservationBatch.js +421 -0
  295. package/dist/reservationSchemas.js +16 -0
  296. package/dist/reservations.js +258 -0
  297. package/dist/reservePort.js +68 -0
  298. package/dist/resolvedOptions.js +3 -0
  299. package/dist/room.d.ts +1006 -0
  300. package/dist/room.js +283 -0
  301. package/dist/roomAccessSweep.js +94 -0
  302. package/dist/roomAppCommandControl.js +58 -0
  303. package/dist/roomAuthoringStrategy.js +16 -0
  304. package/dist/roomErasure.js +197 -0
  305. package/dist/roomPoolRuntimeDefaults.js +23 -0
  306. package/dist/roomPoolSelection.js +18 -0
  307. package/dist/roomPoolTopology.js +211 -0
  308. package/dist/rpc.d.ts +551 -0
  309. package/dist/rpc.js +111 -0
  310. package/dist/rpcClient.js +151 -0
  311. package/dist/rpcRoutes.js +27 -0
  312. package/dist/runtime.js +1122 -0
  313. package/dist/schemaHistory.js +97 -0
  314. package/dist/seatStore.js +150 -0
  315. package/dist/seatStrategyFixtures.js +51 -0
  316. package/dist/seatSubject.js +31 -0
  317. package/dist/seats.js +129 -0
  318. package/dist/serverSession.js +810 -0
  319. package/dist/serverSessionConfig.js +42 -0
  320. package/dist/sessionAdmission.js +52 -0
  321. package/dist/sidecarAdmission.js +102 -0
  322. package/dist/sidecarConfig.js +115 -0
  323. package/dist/sidecarConfigPublication.js +63 -0
  324. package/dist/sidecarHostListener.js +207 -0
  325. package/dist/sidecarIpc.js +204 -0
  326. package/dist/sidecarPeer.js +309 -0
  327. package/dist/sidecarProcessPort.js +27 -0
  328. package/dist/sidecarRuntime.js +167 -0
  329. package/dist/sidecarSelection.js +141 -0
  330. package/dist/sidecarWire.js +177 -0
  331. package/dist/sidecarWrites.js +162 -0
  332. package/dist/simulation.d.ts +391 -0
  333. package/dist/simulation.js +281 -0
  334. package/dist/simulationAuthoring.js +28 -0
  335. package/dist/simulationBytes.js +26 -0
  336. package/dist/simulationConformance.js +304 -0
  337. package/dist/simulationInputHistoryCapture.js +34 -0
  338. package/dist/simulationInputHistoryWire.js +192 -0
  339. package/dist/simulationOptionsWire.js +77 -0
  340. package/dist/simulationRecoveryWire.js +133 -0
  341. package/dist/simulationReplay.js +126 -0
  342. package/dist/simulationSnapshotWire.js +111 -0
  343. package/dist/simulationState.js +177 -0
  344. package/dist/snapshotBlob.js +125 -0
  345. package/dist/snapshotBlobCleanup.js +92 -0
  346. package/dist/snapshotBlobIndex.js +37 -0
  347. package/dist/snapshotBudget.js +79 -0
  348. package/dist/snapshotChain.js +184 -0
  349. package/dist/snapshotErasure.js +171 -0
  350. package/dist/snapshotInspection.js +104 -0
  351. package/dist/snapshotSegmentBlobs.js +57 -0
  352. package/dist/snapshotUploads.js +165 -0
  353. package/dist/socketTransport.js +252 -0
  354. package/dist/spatial.js +103 -0
  355. package/dist/spectatorPolicy.js +25 -0
  356. package/dist/spectatorProducer.js +88 -0
  357. package/dist/startFailureCause.js +3 -0
  358. package/dist/stateCodec.js +657 -0
  359. package/dist/strategies.d.ts +210 -0
  360. package/dist/strategies.js +8 -0
  361. package/dist/strategiesServer.d.ts +286 -0
  362. package/dist/strategiesServer.js +11 -0
  363. package/dist/strategyFixtures.js +181 -0
  364. package/dist/streamFraming.js +121 -0
  365. package/dist/streamTransport.js +265 -0
  366. package/dist/subjectAdmission.js +49 -0
  367. package/dist/subjectPrivacy.js +280 -0
  368. package/dist/subjectPrivacyBinding.js +89 -0
  369. package/dist/systemManifest.js +181 -0
  370. package/dist/tables.js +158 -0
  371. package/dist/testHarness.js +88 -0
  372. package/dist/testing.d.ts +3684 -0
  373. package/dist/testing.js +220 -0
  374. package/dist/testingPorts.js +270 -0
  375. package/dist/testingServer.d.ts +4060 -0
  376. package/dist/testingServer.js +18 -0
  377. package/dist/transform.d.ts +692 -0
  378. package/dist/transform.js +216 -0
  379. package/dist/transform3d.js +117 -0
  380. package/dist/transformCollection.js +23 -0
  381. package/dist/transformCollection3d.js +23 -0
  382. package/dist/transformCollectionCore.js +155 -0
  383. package/dist/transformFrames.js +120 -0
  384. package/dist/transformPrediction3d.js +126 -0
  385. package/dist/transformRules.js +122 -0
  386. package/dist/transformSchemas.js +19 -0
  387. package/dist/transport.js +31 -0
  388. package/dist/transportAuthoring.js +28 -0
  389. package/dist/transportCleanup.js +21 -0
  390. package/dist/transportConformance.js +123 -0
  391. package/dist/transportConnector.js +81 -0
  392. package/dist/transportEndpoints.js +37 -0
  393. package/dist/transportsServer.d.ts +5515 -0
  394. package/dist/transportsServer.js +6 -0
  395. package/dist/viewProjection.js +15 -0
  396. package/dist/web.d.ts +2286 -0
  397. package/dist/web.js +517 -0
  398. package/dist/webTransportClient.js +172 -0
  399. package/dist/wire.d.ts +992 -0
  400. package/dist/wire.js +491 -0
  401. package/dist/withdrawalPort.js +27 -0
  402. package/dist/world.d.ts +1894 -0
  403. package/dist/world.js +332 -0
  404. package/dist/worldActorReceipts.js +47 -0
  405. package/dist/worldActorTransferSnapshot.js +13 -0
  406. package/dist/worldAdmissionPending.js +7 -0
  407. package/dist/worldBoundaryCoordinator.js +147 -0
  408. package/dist/worldCatalog.js +80 -0
  409. package/dist/worldCellAllocation.js +202 -0
  410. package/dist/worldCellDestination.js +67 -0
  411. package/dist/worldCells.js +488 -0
  412. package/dist/worldChange.js +31 -0
  413. package/dist/worldClient.js +663 -0
  414. package/dist/worldClientControl.js +140 -0
  415. package/dist/worldClientPendingInput.js +15 -0
  416. package/dist/worldClientRpc.js +132 -0
  417. package/dist/worldClientRpcRoutes.js +42 -0
  418. package/dist/worldClientSchemas.js +27 -0
  419. package/dist/worldCommands.js +139 -0
  420. package/dist/worldData.js +41 -0
  421. package/dist/worldDefaultBinding.js +376 -0
  422. package/dist/worldDefaultGroupAdmission.js +81 -0
  423. package/dist/worldDefaultGroupAppServices.js +30 -0
  424. package/dist/worldDefaultGroupCompensation.js +108 -0
  425. package/dist/worldDefaultGroupContinuation.js +95 -0
  426. package/dist/worldDefaultGroupControl.js +71 -0
  427. package/dist/worldDefaultGroupMembers.js +84 -0
  428. package/dist/worldDefaultGroups.js +20 -0
  429. package/dist/worldDefaultPending.js +78 -0
  430. package/dist/worldDefaultService.js +244 -0
  431. package/dist/worldEntities.js +2979 -0
  432. package/dist/worldEntityCodec.js +20 -0
  433. package/dist/worldEntityHandoffView.js +153 -0
  434. package/dist/worldGeometry.js +169 -0
  435. package/dist/worldGhostAdmission.js +64 -0
  436. package/dist/worldGhostDestination.js +117 -0
  437. package/dist/worldGhostGateway.js +131 -0
  438. package/dist/worldGhostHandshake.js +107 -0
  439. package/dist/worldGhostHost.js +41 -0
  440. package/dist/worldGhostIngress.js +131 -0
  441. package/dist/worldGhostNeighborhood.js +69 -0
  442. package/dist/worldGhostNeighbors.js +85 -0
  443. package/dist/worldGhostOutbound.js +109 -0
  444. package/dist/worldGhostPublisher.js +215 -0
  445. package/dist/worldGhostReceiver.js +212 -0
  446. package/dist/worldGhostSender.js +145 -0
  447. package/dist/worldGhostSocket.js +77 -0
  448. package/dist/worldGhostWire.js +171 -0
  449. package/dist/worldGroupCommand.js +48 -0
  450. package/dist/worldGroupDeadline.js +114 -0
  451. package/dist/worldGroupPreparation.js +114 -0
  452. package/dist/worldGroupReadyControl.js +127 -0
  453. package/dist/worldGroupSupervisor.js +119 -0
  454. package/dist/worldHandoffMetrics.js +58 -0
  455. package/dist/worldHandoffView.js +99 -0
  456. package/dist/worldHostSource.js +68 -0
  457. package/dist/worldInspectEndpoint.js +249 -0
  458. package/dist/worldInspection.js +108 -0
  459. package/dist/worldInstanceAdmission.js +30 -0
  460. package/dist/worldInstanceAllocation.js +115 -0
  461. package/dist/worldInstanceDestination.js +63 -0
  462. package/dist/worldInstanceExpiry.js +281 -0
  463. package/dist/worldInstanceExpirySupervisor.js +87 -0
  464. package/dist/worldInstanceLifecycle.js +102 -0
  465. package/dist/worldInstanceState.js +51 -0
  466. package/dist/worldInstances.js +477 -0
  467. package/dist/worldJoin.js +55 -0
  468. package/dist/worldLayers.js +150 -0
  469. package/dist/worldLeases.js +77 -0
  470. package/dist/worldManifest.js +24 -0
  471. package/dist/worldMovement.js +62 -0
  472. package/dist/worldPersistence.js +133 -0
  473. package/dist/worldProjection.js +220 -0
  474. package/dist/worldReact.js +109 -0
  475. package/dist/worldRecoveryActor.js +34 -0
  476. package/dist/worldReturnAnchor.js +48 -0
  477. package/dist/worldRoomHooks.js +56 -0
  478. package/dist/worldRoomPool.js +26 -0
  479. package/dist/worldRoomSteps.js +132 -0
  480. package/dist/worldSeatBinding.js +35 -0
  481. package/dist/worldServer.d.ts +6936 -0
  482. package/dist/worldServer.js +48 -0
  483. package/dist/worldSourceSeatPending.js +8 -0
  484. package/dist/worldStrategyFixtures.js +163 -0
  485. package/dist/worldTesting.js +26 -0
  486. package/dist/worldTransitionDefaults.js +197 -0
  487. package/dist/worldTransitionExecutor.js +518 -0
  488. package/dist/worldTransitionGroup.js +112 -0
  489. package/dist/worldTransitionPhysicalSteps.js +39 -0
  490. package/dist/worldTransitionResolver.js +227 -0
  491. package/dist/worldTransitionSeatGroup.js +63 -0
  492. package/dist/worldTransitionSeats.js +259 -0
  493. package/dist/worldTransitionState.js +94 -0
  494. package/dist/worldTransitions.js +100 -0
  495. package/package.json +189 -4
@@ -0,0 +1,4060 @@
1
+ import { Context } from 'effect';
2
+ import { DeclaredAccess } from '@voltro/protocol';
3
+ import { Duration } from 'effect';
4
+ import { Effect } from 'effect';
5
+ import { Layer } from 'effect';
6
+ import { PluginPrivacyRequest } from '@voltro/protocol';
7
+ import { Schema } from 'effect';
8
+ import { SessionSecrets } from '@voltro/protocol/session';
9
+ import { Subject } from '@voltro/protocol';
10
+ import { YieldableError } from 'effect/Cause';
11
+
12
+ declare type AnySchema = Schema.Codec<unknown, unknown>;
13
+
14
+ /** Configuration consumers never invoke a player callback. Its player type
15
+ * stays author-owned; this inventory type does not erase it into an input. */
16
+ declare type AnyWorldDescriptor = WorldDescriptor<never>;
17
+
18
+ export declare class BotClient {
19
+ readonly transport: RoomTransport;
20
+ readonly maxRetainedFrames: number;
21
+ private readonly received;
22
+ private readonly unsubscribe;
23
+ constructor(transport: RoomTransport, maxRetainedFrames?: number);
24
+ send(frame: RoomFrame): Promise<void>;
25
+ frames(): ReadonlyArray<RoomFrame>;
26
+ close(): void;
27
+ }
28
+
29
+ declare class BudgetExceeded extends BudgetExceeded_base {
30
+ get message(): string;
31
+ }
32
+
33
+ declare const BudgetExceeded_base: Schema.Class<BudgetExceeded, Schema.TaggedStruct<"BudgetExceeded", {
34
+ readonly budget: Schema.String;
35
+ readonly limit: Schema.Number;
36
+ }>, YieldableError>;
37
+
38
+ declare type CollisionBody2D = {
39
+ readonly kind: 'circle';
40
+ readonly radius: number;
41
+ } | {
42
+ readonly kind: 'aabb';
43
+ readonly halfWidth: number;
44
+ readonly halfHeight: number;
45
+ };
46
+
47
+ declare interface CollisionResult2D {
48
+ readonly transform: Transform2D;
49
+ readonly collided: ReadonlyArray<string>;
50
+ readonly iterations: number;
51
+ }
52
+
53
+ /** Compare provided observations only. Runner identity/artifacts/exit status
54
+ * must be established outside this pure helper before any engine claim. */
55
+ export declare const compareSimulationConformanceTraces: <S extends AnySchema, I extends AnySchema, O extends AnySchema>(simulation: Simulation<S, I, O>, expected: SimulationConformanceTrace, actual: SimulationConformanceTrace, offeredLimits?: SimulationConformanceLimits) => {
56
+ readonly scope: "provided-trace-comparison";
57
+ readonly ticks: number;
58
+ readonly comparisons: number;
59
+ };
60
+
61
+ /**
62
+ * A real Room actor with one real server session per player and the real
63
+ * client session, joined over seeded in-memory networks (`NetSim`). For example
64
+ * tests of Room code: inputs, state convergence and reconnects, without a Host
65
+ * process, SQL or sockets. Seats are an in-memory admission, not the SQL store.
66
+ */
67
+ export declare const connectTestRoomClients: <S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>, O extends Schema.Codec<unknown, unknown>>(descriptor: RoomDescriptor<S, I, O>, initial: S["Type"], options: O["Type"], config: TestRoomClientsOptions) => Promise<TestRoomClients<S, I, O>>;
68
+
69
+ /** Source-portable fixture construction only. It never initializes simulation
70
+ * state, and the entire typed matrix is captured before a conformance run. */
71
+ export declare const createSimulationConformanceCase: <S extends AnySchema, I extends AnySchema, O extends AnySchema>(simulation: Simulation<S, I, O>, offered: SimulationConformanceCaseOptions<I["Type"], O["Type"]>) => SimulationConformanceCase;
72
+
73
+ export declare const createTestRoom: <S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>, O extends Schema.Codec<unknown, unknown>>(descriptor: RoomDescriptor<S, I, O>, initial: S["Type"], options: O["Type"], config: {
74
+ readonly tenantId: string;
75
+ readonly id?: string;
76
+ readonly clock?: VirtualRoomClock;
77
+ }) => {
78
+ readonly actor: RoomActor<S, I, O>;
79
+ readonly clock: VirtualRoomClock;
80
+ step(milliseconds: number): number;
81
+ };
82
+
83
+ /** Whole byte/layout/count/schema admission precedes any simulation init. */
84
+ export declare const decodeSimulationConformanceCase: <S extends AnySchema, I extends AnySchema, O extends AnySchema>(simulation: Simulation<S, I, O>, offered: Uint8Array, offeredLimits?: SimulationConformanceLimits) => SimulationConformanceCase;
85
+
86
+ /** SCF/v1 is an offline reproducibility artifact, not a Room frame, remote
87
+ * authentication grant, snapshot or process-execution receipt. */
88
+ export declare const encodeSimulationConformanceCase: <S extends AnySchema, I extends AnySchema, O extends AnySchema>(simulation: Simulation<S, I, O>, offered: SimulationConformanceCase, offeredLimits?: SimulationConformanceLimits) => Uint8Array;
89
+
90
+ export declare const fakeRoomAppCommandLayer: (overrides?: RoomAppCommandFixtureOverrides) => Layer.Layer<RoomAppCommandPort>;
91
+
92
+ export declare const fakeRoomAppCommandService: (overrides?: RoomAppCommandFixtureOverrides) => Context.Service.Shape<typeof RoomAppCommandPort>;
93
+
94
+ export declare const fakeRoomCheckpointLayer: (overrides?: RoomCheckpointFixtureOverrides) => Layer.Layer<RoomCheckpointPort>;
95
+
96
+ export declare const fakeRoomCheckpointService: (overrides?: RoomCheckpointFixtureOverrides) => Context.Service.Shape<typeof RoomCheckpointPort>;
97
+
98
+ export declare const fakeRoomDirectoryLayer: (overrides?: RoomDirectoryFixtureOverrides) => Layer.Layer<RoomDirectoryPort>;
99
+
100
+ export declare const fakeRoomDirectoryService: (overrides?: RoomDirectoryFixtureOverrides) => Context.Service.Shape<typeof RoomDirectoryPort>;
101
+
102
+ export declare const fakeRoomErasureLayer: (overrides?: RoomErasureFixtureOverrides) => Layer.Layer<RoomErasurePort>;
103
+
104
+ export declare const fakeRoomErasureService: (overrides?: RoomErasureFixtureOverrides) => Context.Service.Shape<typeof RoomErasurePort>;
105
+
106
+ export declare const fakeRoomExternalWorkWithdrawalLayer: (overrides?: RoomExternalWorkWithdrawalFixtureOverrides) => Layer.Layer<RoomExternalWorkWithdrawalPort>;
107
+
108
+ export declare const fakeRoomExternalWorkWithdrawalService: (overrides?: RoomExternalWorkWithdrawalFixtureOverrides) => Context.Service.Shape<typeof RoomExternalWorkWithdrawalPort>;
109
+
110
+ export declare const fakeRoomHostAdoptionLayer: (overrides?: RoomAdoptionFixtureOverrides) => Layer.Layer<RoomHostAdoptionPort>;
111
+
112
+ export declare const fakeRoomHostAdoptionService: (overrides?: RoomAdoptionFixtureOverrides) => Context.Service.Shape<typeof RoomHostAdoptionPort>;
113
+
114
+ export declare const fakeRoomHostControlLayer: (overrides?: RoomHostControlFixtureOverrides) => Layer.Layer<RoomHostControlPort>;
115
+
116
+ export declare const fakeRoomHostControlService: (overrides?: RoomHostControlFixtureOverrides) => Context.Service.Shape<typeof RoomHostControlPort>;
117
+
118
+ export declare const fakeRoomHostDrainLayer: (overrides?: RoomHostDrainFixtureOverrides) => Layer.Layer<RoomHostDrainPort>;
119
+
120
+ /** Explicit replacement seam; never manufactures a successful SQL handoff. */
121
+ export declare const fakeRoomHostDrainService: (overrides?: RoomHostDrainFixtureOverrides) => Context.Service.Shape<typeof RoomHostDrainPort>;
122
+
123
+ export declare const fakeRoomHostKickLayer: (overrides?: RoomHostKickFixtureOverrides) => Layer.Layer<RoomHostKickPort>;
124
+
125
+ export declare const fakeRoomHostKickService: (overrides?: RoomHostKickFixtureOverrides) => Context.Service.Shape<typeof RoomHostKickPort>;
126
+
127
+ export declare const fakeRoomHostWithdrawalLayer: (overrides?: RoomHostWithdrawalFixtureOverrides) => Layer.Layer<RoomHostWithdrawalPort>;
128
+
129
+ export declare const fakeRoomHostWithdrawalService: (overrides?: RoomHostWithdrawalFixtureOverrides) => Context.Service.Shape<typeof RoomHostWithdrawalPort>;
130
+
131
+ export declare const fakeRoomLockstepAdmissionLayer: (overrides?: RoomLockstepAdmissionFixtureOverrides) => Layer.Layer<RoomLockstepAdmissionPort>;
132
+
133
+ /** Complete failing replacement seam; no SQL/seed/identity success is fabricated. */
134
+ export declare const fakeRoomLockstepAdmissionService: (overrides?: RoomLockstepAdmissionFixtureOverrides) => Context.Service.Shape<typeof RoomLockstepAdmissionPort>;
135
+
136
+ export declare const fakeRoomLockstepJournalLayer: (overrides?: RoomLockstepJournalFixtureOverrides) => Layer.Layer<RoomLockstepJournalPort>;
137
+
138
+ /** Explicit failing replacement seam, never an SQL/auth/history emulator. */
139
+ export declare const fakeRoomLockstepJournalService: (overrides?: RoomLockstepJournalFixtureOverrides) => Context.Service.Shape<typeof RoomLockstepJournalPort>;
140
+
141
+ export declare const fakeRoomLockstepTerminalLayer: (overrides?: RoomLockstepTerminalFixtureOverrides) => Layer.Layer<RoomLockstepTerminalPort>;
142
+
143
+ export declare const fakeRoomLockstepTerminalService: (overrides?: RoomLockstepTerminalFixtureOverrides) => Context.Service.Shape<typeof RoomLockstepTerminalPort>;
144
+
145
+ export declare const fakeRoomReaperLayer: (overrides?: RoomReaperFixtureOverrides) => Layer.Layer<RoomReaperPort>;
146
+
147
+ export declare const fakeRoomReaperService: (overrides?: RoomReaperFixtureOverrides) => Context.Service.Shape<typeof RoomReaperPort>;
148
+
149
+ export declare const fakeRoomRecoveryLayer: (overrides?: RoomRecoveryFixtureOverrides) => Layer.Layer<RoomRecoveryPort>;
150
+
151
+ export declare const fakeRoomRecoveryService: (overrides?: RoomRecoveryFixtureOverrides) => Context.Service.Shape<typeof RoomRecoveryPort>;
152
+
153
+ export declare const fakeRoomReplayLayer: (overrides?: RoomReplayFixtureOverrides) => Layer.Layer<RoomReplayPort>;
154
+
155
+ export declare const fakeRoomReplayService: (overrides?: RoomReplayFixtureOverrides) => Context.Service.Shape<typeof RoomReplayPort>;
156
+
157
+ export declare const fakeRoomReserveLayer: (overrides?: RoomReserveFixtureOverrides) => Layer.Layer<RoomReservePort>;
158
+
159
+ /** Explicit service seam for consumers testing replacement of the reservation
160
+ * system. Unconfigured methods refuse; this never emulates or proves SQL/auth. */
161
+ export declare const fakeRoomReserveService: (overrides?: RoomReserveFixtureOverrides) => Context.Service.Shape<typeof RoomReservePort>;
162
+
163
+ export declare const fakeRoomSnapshotBlobLayer: (overrides?: RoomSnapshotBlobFixtureOverrides) => Layer.Layer<RoomSnapshotBlobPort>;
164
+
165
+ export declare const fakeRoomSnapshotBlobService: (overrides?: RoomSnapshotBlobFixtureOverrides) => Context.Service.Shape<typeof RoomSnapshotBlobPort>;
166
+
167
+ export declare const fakeRoomSubjectPrivacyLayer: (overrides?: RoomSubjectPrivacyFixtureOverrides) => Layer.Layer<RoomSubjectPrivacyPort>;
168
+
169
+ export declare const fakeRoomSubjectPrivacyService: (overrides?: RoomSubjectPrivacyFixtureOverrides) => Context.Service.Shape<typeof RoomSubjectPrivacyPort>;
170
+
171
+ export declare const fakeWorldClientControlLayer: (overrides?: WorldClientControlFixtureOverrides) => Layer.Layer<WorldClientControlPort>;
172
+
173
+ export declare const fakeWorldClientControlService: (overrides?: WorldClientControlFixtureOverrides) => Context.Service.Shape<typeof WorldClientControlPort>;
174
+
175
+ export declare const fakeWorldTransitionLayer: (overrides?: WorldTransitionFixtureOverrides) => Layer.Layer<WorldTransitionPort>;
176
+
177
+ /** Fail-closed fixture. It owns no fake transition, entity or durable success. */
178
+ export declare const fakeWorldTransitionService: (overrides?: WorldTransitionFixtureOverrides) => Context.Service.Shape<typeof WorldTransitionPort>;
179
+
180
+ /** Exact reduced integer ratio over admitted coordinates/differences of magnitude <= u32.
181
+ * Shared 2D/3D slab arithmetic; never round a fraction before comparing it. */
182
+ declare interface FixedSlabFraction {
183
+ readonly numerator: number;
184
+ readonly denominator: number;
185
+ }
186
+
187
+ declare interface GeometryArtifact<C extends GeometryChunk = GeometryChunk> {
188
+ readonly chunk: C;
189
+ readonly blobSha256: string;
190
+ /** Canonical declared content/layout, excluding actual address/version only. */
191
+ readonly contentSha256: string;
192
+ bytes(): Uint8Array;
193
+ }
194
+
195
+ declare type GeometryArtifactLimits<K extends GeometryKind> = K extends '2d-tiles' ? Partial<GeometryTileLimits> : K extends '2d-heightfield' ? Partial<GeometryHeightfieldLimits> : K extends '3d-shapes' ? Partial<GeometryShapesLimits> : Partial<GeometryVoxelLimits>;
196
+
197
+ declare interface GeometryBoxOverlapOptions {
198
+ readonly maxTests?: number;
199
+ }
200
+
201
+ declare type GeometryChunk = GeometryTileChunk | GeometryHeightfieldChunk | GeometryShapesChunk | GeometryVoxelChunk;
202
+
203
+ declare type GeometryCollisionDerive = (context: GeometryDerivationContext) => GeometryChunk;
204
+
205
+ /** Actual World/native preparation/CPU facade; no SQL/Host/whole-system flag. */
206
+ export declare const geometryCollisionDeriveSlotFixture: {
207
+ kind: "slot";
208
+ defaultImplementation: GeometryCollisionDerive;
209
+ defaultProbe: {
210
+ run: () => Effect.Effect<boolean | GeometryTilePathStatus, never, never>;
211
+ expected: boolean;
212
+ };
213
+ overrideProbe: {
214
+ run: () => Effect.Effect<boolean | GeometryTilePathStatus, never, never>;
215
+ expected: boolean;
216
+ };
217
+ };
218
+
219
+ declare type GeometryCompaction = (context: GeometryCompactionContext) => GeometryPatch;
220
+
221
+ /** Genuine immutable native artifacts only. Compaction preserves the current
222
+ * truth; it cannot authorize a different edit, owner, revision or SQL write. */
223
+ declare interface GeometryCompactionContext {
224
+ readonly static: GeometryArtifact;
225
+ readonly current: GeometryArtifact;
226
+ readonly limits: GeometryPatchLimits;
227
+ readonly codecLimits: GeometryArtifactLimits<GeometryKind>;
228
+ }
229
+
230
+ /** Actual World-selected native preparation; excludes SQL/Host/system acceptance. */
231
+ export declare const geometryCompactionSlotFixture: {
232
+ kind: "slot";
233
+ defaultImplementation: GeometryCompaction;
234
+ defaultProbe: {
235
+ run: () => Effect.Effect<"refused" | "preserved", never, never>;
236
+ expected: string;
237
+ };
238
+ overrideProbe: {
239
+ run: () => Effect.Effect<"refused" | "preserved", never, never>;
240
+ expected: string;
241
+ };
242
+ };
243
+
244
+ declare interface GeometryCompactionStrategies {
245
+ readonly compaction: GeometryCompaction;
246
+ }
247
+
248
+ declare interface GeometryDeltaMigrationFrom {
249
+ readonly static: GeometryArtifact;
250
+ readonly current: GeometryArtifact;
251
+ readonly revision: number;
252
+ }
253
+
254
+ declare interface GeometryDeltaMigrationTo {
255
+ readonly static: GeometryArtifact;
256
+ }
257
+
258
+ /** Outside-Tick native data only. No query callback, provider, actor, Store or
259
+ * authority capability is accepted as a derivation result. */
260
+ declare interface GeometryDerivationContext {
261
+ readonly chunk: GeometryChunk;
262
+ readonly codecLimits: GeometryArtifactLimits<GeometryKind>;
263
+ }
264
+
265
+ declare interface GeometryDerivationStrategies {
266
+ readonly collisionDerive: GeometryCollisionDerive;
267
+ readonly navDerive: GeometryNavDerive;
268
+ }
269
+
270
+ /** Trusted server snapshot. Never derive these rights, positions, budgets or
271
+ * catalogs from the intent body. App policy must recheck authority at commit. */
272
+ declare interface GeometryEditAuthority {
273
+ readonly dynamicEnabled: boolean;
274
+ readonly ownsChunk: boolean;
275
+ readonly canBuild: boolean;
276
+ readonly cooldownReady: boolean;
277
+ readonly remainingOps: number;
278
+ readonly maxReachRaw: number;
279
+ readonly maxHeightUnits: number;
280
+ readonly position: {
281
+ readonly xRaw: number;
282
+ readonly yRaw: number;
283
+ readonly zRaw: number;
284
+ };
285
+ readonly materials: ReadonlyArray<GeometryTileMaterial>;
286
+ readonly shapes: ReadonlyArray<GeometryShapeTemplate>;
287
+ }
288
+
289
+ declare interface GeometryEditContext {
290
+ readonly chunk: GeometryChunk;
291
+ readonly intent: GeometryEditIntent;
292
+ readonly authority: GeometryEditAuthority;
293
+ readonly placementId: string;
294
+ readonly codecLimits?: GeometryArtifactLimits<GeometryKind> | undefined;
295
+ }
296
+
297
+ /** Player requests an action and its target, never solidity, shape dimensions,
298
+ * an authoritative player position, revision, owner, full chunk or Delta bytes. */
299
+ declare type GeometryEditIntent = {
300
+ readonly op: 'setTile';
301
+ readonly x: number;
302
+ readonly y: number;
303
+ readonly material: string;
304
+ } | {
305
+ readonly op: 'raiseHeight';
306
+ readonly x: number;
307
+ readonly y: number;
308
+ readonly units: number;
309
+ } | {
310
+ readonly op: 'setVoxel';
311
+ readonly x: number;
312
+ readonly y: number;
313
+ readonly z: number;
314
+ readonly material: string;
315
+ } | {
316
+ readonly op: 'placeShape';
317
+ readonly template: string;
318
+ readonly xRaw: number;
319
+ readonly yRaw: number;
320
+ readonly zRaw: number;
321
+ } | {
322
+ readonly op: 'removeShape';
323
+ readonly id: string;
324
+ };
325
+
326
+ declare interface GeometryEditStrategies {
327
+ /** Pure policy slot. Current native Session/SQL ownership and codec integrity cannot be overridden by this slot. */
328
+ readonly opValidator: (context: GeometryEditContext) => void;
329
+ /** Pure rule slot; returned chunk is admitted under the original identity/layout/profile. */
330
+ readonly applyOp: (context: GeometryEditContext) => GeometryChunk;
331
+ }
332
+
333
+ declare type GeometryGenerator = (context: GeometryProceduralContext) => GeometryChunk;
334
+
335
+ declare interface GeometryGridRayHit {
336
+ readonly kind: '2d-tiles' | '3d-voxel';
337
+ readonly scope: GeometryPersistenceScope;
338
+ readonly revision: number;
339
+ readonly cell: {
340
+ readonly x: number;
341
+ readonly y: number;
342
+ readonly z?: number;
343
+ };
344
+ /** Exact reduced infimum entry fraction on the offered segment, not a
345
+ * rounded contact point or a floating-point distance. */
346
+ readonly fraction: {
347
+ readonly numerator: number;
348
+ readonly denominator: number;
349
+ };
350
+ readonly visitedCells: number;
351
+ }
352
+
353
+ declare interface GeometryGridRayOptions {
354
+ readonly maxVisitedCells?: number;
355
+ }
356
+
357
+ declare interface GeometryGridSweepHit {
358
+ readonly kind: '2d-tiles' | '3d-voxel';
359
+ readonly scope: GeometryPersistenceScope;
360
+ readonly revision: number;
361
+ readonly cell: {
362
+ readonly x: number;
363
+ readonly y: number;
364
+ readonly z?: number;
365
+ };
366
+ /** Infimum/supremum of positive-volume overlap, clipped to [0,1]. Contact
367
+ * alone is not an overlap; fractions are exact reduced integer ratios. */
368
+ readonly entry: FixedSlabFraction;
369
+ readonly exit: FixedSlabFraction;
370
+ readonly initialOverlap: boolean;
371
+ readonly testedCells: number;
372
+ }
373
+
374
+ /** A half-open raw box `[min, max)` on all three axes; a heightfield box needs its z extent. */
375
+ declare interface GeometryHeightfieldBoxRaw {
376
+ readonly minXRaw: number;
377
+ readonly minYRaw: number;
378
+ readonly minZRaw: number;
379
+ readonly maxXRaw: number;
380
+ readonly maxYRaw: number;
381
+ readonly maxZRaw: number;
382
+ }
383
+
384
+ declare type GeometryHeightfieldChunk = (typeof GeometryHeightfieldChunkSchema)["Type"];
385
+
386
+ declare const GeometryHeightfieldChunkSchema: Schema.Struct<{
387
+ readonly kind: Schema.Literal<"2d-heightfield">;
388
+ readonly formatVersion: Schema.Literal<1>;
389
+ readonly address: Schema.Struct<{
390
+ readonly worldId: Schema.String;
391
+ readonly layerSetId: Schema.String;
392
+ readonly cx: Schema.Int;
393
+ readonly cy: Schema.Int;
394
+ }>;
395
+ readonly version: Schema.String;
396
+ readonly width: Schema.Int;
397
+ readonly height: Schema.Int;
398
+ readonly sampleSpacingRaw: Schema.Int;
399
+ readonly baseHeightRaw: Schema.Int;
400
+ readonly heightQuantumRaw: Schema.Int;
401
+ readonly heights: Schema.$Array<Schema.Int>;
402
+ }>;
403
+
404
+ declare interface GeometryHeightfieldLimits {
405
+ readonly maxSide: number;
406
+ readonly maxSamples: number;
407
+ readonly maxBytes: number;
408
+ }
409
+
410
+ declare interface GeometryHeightfieldRayHit {
411
+ readonly kind: '2d-heightfield';
412
+ readonly scope: GeometryPersistenceScope;
413
+ readonly revision: number;
414
+ /** The first point on the segment at or below the surface, in global raw units. */
415
+ readonly point: GeometryHeightfieldRayPoint;
416
+ /** Exact reduced position on the offered segment whose raw-grid point is `point`. */
417
+ readonly fraction: {
418
+ readonly numerator: number;
419
+ readonly denominator: number;
420
+ };
421
+ readonly visitedSamples: number;
422
+ }
423
+
424
+ declare interface GeometryHeightfieldRayPoint {
425
+ readonly xRaw: number;
426
+ readonly yRaw: number;
427
+ readonly zRaw: number;
428
+ }
429
+
430
+ declare interface GeometryHeightfieldSweepHit {
431
+ readonly kind: '2d-heightfield';
432
+ /** The first box position along the path that reaches under the surface, on the raw grid. */
433
+ readonly box: GeometryHeightfieldBoxRaw;
434
+ /** Exact reduced position of `box` on the path: raw steps along the longest axis over its length. */
435
+ readonly fraction: {
436
+ readonly numerator: number;
437
+ readonly denominator: number;
438
+ };
439
+ /** The start box already reaches under the surface (fraction 0). */
440
+ readonly initialOverlap: boolean;
441
+ /** Overlap evaluations used, coarse and refining together. */
442
+ readonly evaluations: number;
443
+ }
444
+
445
+ declare type GeometryKind = GeometryChunk['kind'];
446
+
447
+ /** Pure native data rule only; no SQL, actor, journal, permission or Subject. */
448
+ declare type GeometryMigrateDelta = (from: GeometryDeltaMigrationFrom, to: GeometryDeltaMigrationTo) => GeometryChunk | null;
449
+
450
+ declare type GeometryNavDerive = (context: GeometryDerivationContext) => GeometryTileChunk | null;
451
+
452
+ export declare const geometryNavDeriveSlotFixture: {
453
+ kind: "slot";
454
+ defaultImplementation: GeometryNavDerive;
455
+ defaultProbe: {
456
+ run: () => Effect.Effect<boolean | GeometryTilePathStatus, never, never>;
457
+ expected: string;
458
+ };
459
+ overrideProbe: {
460
+ run: () => Effect.Effect<boolean | GeometryTilePathStatus, never, never>;
461
+ expected: string;
462
+ };
463
+ };
464
+
465
+ declare interface GeometryPatch {
466
+ readonly metadata: GeometryPatchMetadata;
467
+ bytes(): Uint8Array;
468
+ }
469
+
470
+ declare interface GeometryPatchLimits {
471
+ readonly maxBytes: number;
472
+ readonly maxMetadataBytes: number;
473
+ }
474
+
475
+ declare type GeometryPatchMetadata = (typeof GeometryPatchMetadataSchema)["Type"];
476
+
477
+ declare const GeometryPatchMetadataSchema: Schema.Struct<{
478
+ readonly kind: Schema.Literals<readonly ["2d-tiles", "2d-heightfield", "3d-shapes", "3d-voxel"]>;
479
+ readonly formatVersion: Schema.Literal<1>;
480
+ readonly worldId: Schema.String;
481
+ readonly layerSetId: Schema.String;
482
+ readonly cx: Schema.Int;
483
+ readonly cy: Schema.Int;
484
+ readonly cz: Schema.optional<Schema.Int>;
485
+ readonly version: Schema.String;
486
+ readonly baseRevision: Schema.Int;
487
+ readonly revision: Schema.Int;
488
+ readonly baseBlobSha256: Schema.String;
489
+ readonly blobSha256: Schema.String;
490
+ readonly baseContentSha256: Schema.String;
491
+ readonly contentSha256: Schema.String;
492
+ readonly changed: Schema.Boolean;
493
+ readonly stateSchemaHash: Schema.Int;
494
+ }>;
495
+
496
+ declare type GeometryPersistenceError = ProtocolError | BudgetExceeded;
497
+
498
+ declare interface GeometryPersistenceScope {
499
+ readonly tenantId: string;
500
+ readonly kind: GeometryKind;
501
+ readonly worldId: string;
502
+ readonly version: string;
503
+ readonly layerSetId: string;
504
+ readonly cx: number;
505
+ readonly cy: number;
506
+ readonly cz?: number | undefined;
507
+ }
508
+
509
+ declare interface GeometryPersistenceSubject {
510
+ readonly id: string;
511
+ readonly kind: 'user' | 'guest';
512
+ }
513
+
514
+ declare interface GeometryPreparedScope {
515
+ readonly tenantId: string;
516
+ readonly kind: GeometryKind;
517
+ readonly worldId: string;
518
+ readonly layerSetId: string;
519
+ readonly version: string;
520
+ }
521
+
522
+ declare interface GeometryProceduralContext {
523
+ readonly seed: number;
524
+ readonly kind: GeometryKind;
525
+ readonly address: GeometryChunk['address'];
526
+ readonly version: string;
527
+ }
528
+
529
+ declare type GeometryShape = (typeof GeometryShapeSchema)["Type"];
530
+
531
+ declare interface GeometryShapeRayHit {
532
+ readonly kind: '3d-shapes';
533
+ readonly scope: GeometryPersistenceScope;
534
+ readonly revision: number;
535
+ /** Native LOCAL shape; scope identifies its owning chunk. */
536
+ readonly shape: GeometryShape;
537
+ /** Encloses the exact infimum entry time; width <= 2^-52. Presentation only.
538
+ * Selection and ownership decisions never use these rounded bounds. */
539
+ readonly fractionBounds: {
540
+ readonly lower: number;
541
+ readonly upper: number;
542
+ };
543
+ readonly visitedChunks: number;
544
+ readonly testedShapes: number;
545
+ }
546
+
547
+ declare const GeometryShapeSchema: Schema.Union<readonly [Schema.Struct<{
548
+ readonly halfXRaw: Schema.Int;
549
+ readonly halfYRaw: Schema.Int;
550
+ readonly halfZRaw: Schema.Int;
551
+ readonly id: Schema.String;
552
+ readonly xRaw: Schema.Int;
553
+ readonly yRaw: Schema.Int;
554
+ readonly zRaw: Schema.Int;
555
+ readonly kind: Schema.Literal<"aabb">;
556
+ }>, Schema.Struct<{
557
+ readonly radiusRaw: Schema.Int;
558
+ readonly id: Schema.String;
559
+ readonly xRaw: Schema.Int;
560
+ readonly yRaw: Schema.Int;
561
+ readonly zRaw: Schema.Int;
562
+ readonly kind: Schema.Literal<"sphere">;
563
+ }>]>;
564
+
565
+ declare type GeometryShapesChunk = (typeof GeometryShapesChunkSchema)["Type"];
566
+
567
+ declare const GeometryShapesChunkSchema: Schema.Struct<{
568
+ readonly kind: Schema.Literal<"3d-shapes">;
569
+ readonly formatVersion: Schema.Literal<1>;
570
+ readonly address: Schema.Struct<{
571
+ readonly worldId: Schema.String;
572
+ readonly layerSetId: Schema.String;
573
+ readonly cx: Schema.Int;
574
+ readonly cy: Schema.Int;
575
+ readonly cz: Schema.Int;
576
+ }>;
577
+ readonly version: Schema.String;
578
+ readonly extentXRaw: Schema.Int;
579
+ readonly extentYRaw: Schema.Int;
580
+ readonly extentZRaw: Schema.Int;
581
+ readonly shapes: Schema.$Array<Schema.Union<readonly [Schema.Struct<{
582
+ readonly halfXRaw: Schema.Int;
583
+ readonly halfYRaw: Schema.Int;
584
+ readonly halfZRaw: Schema.Int;
585
+ readonly id: Schema.String;
586
+ readonly xRaw: Schema.Int;
587
+ readonly yRaw: Schema.Int;
588
+ readonly zRaw: Schema.Int;
589
+ readonly kind: Schema.Literal<"aabb">;
590
+ }>, Schema.Struct<{
591
+ readonly radiusRaw: Schema.Int;
592
+ readonly id: Schema.String;
593
+ readonly xRaw: Schema.Int;
594
+ readonly yRaw: Schema.Int;
595
+ readonly zRaw: Schema.Int;
596
+ readonly kind: Schema.Literal<"sphere">;
597
+ }>]>>;
598
+ }>;
599
+
600
+ declare interface GeometryShapesLimits {
601
+ readonly maxShapes: number;
602
+ readonly maxBytes: number;
603
+ }
604
+
605
+ declare type GeometryShapeTemplate = {
606
+ readonly key: string;
607
+ readonly kind: 'aabb';
608
+ readonly halfXRaw: number;
609
+ readonly halfYRaw: number;
610
+ readonly halfZRaw: number;
611
+ } | {
612
+ readonly key: string;
613
+ readonly kind: 'sphere';
614
+ readonly radiusRaw: number;
615
+ };
616
+
617
+ declare type GeometrySource = {
618
+ readonly _tag: 'GeometrySource';
619
+ readonly kind: 'cms';
620
+ readonly key: string;
621
+ readonly channel: string;
622
+ } | {
623
+ readonly _tag: 'GeometrySource';
624
+ readonly kind: 'imported';
625
+ readonly directory: string;
626
+ } | {
627
+ readonly _tag: 'GeometrySource';
628
+ readonly kind: 'procedural';
629
+ readonly seed: number;
630
+ readonly generator: GeometryGenerator;
631
+ };
632
+
633
+ declare type GeometryTileChunk = (typeof GeometryTileChunkSchema)["Type"];
634
+
635
+ declare const GeometryTileChunkSchema: Schema.Struct<{
636
+ readonly kind: Schema.Literal<"2d-tiles">;
637
+ readonly formatVersion: Schema.Literal<1>;
638
+ readonly address: Schema.Struct<{
639
+ readonly worldId: Schema.String;
640
+ readonly layerSetId: Schema.String;
641
+ readonly cx: Schema.Int;
642
+ readonly cy: Schema.Int;
643
+ }>;
644
+ readonly version: Schema.String;
645
+ readonly width: Schema.Int;
646
+ readonly height: Schema.Int;
647
+ readonly tileSizeRaw: Schema.Int;
648
+ readonly palette: Schema.$Array<Schema.Struct<{
649
+ readonly key: Schema.String;
650
+ readonly solid: Schema.Boolean;
651
+ }>>;
652
+ readonly runs: Schema.$Array<Schema.Struct<{
653
+ readonly paletteIndex: Schema.Int;
654
+ readonly length: Schema.Int;
655
+ }>>;
656
+ }>;
657
+
658
+ declare interface GeometryTileCollisionOptions {
659
+ /** Total visited cells across every solver query, including its final check.
660
+ * May only narrow the world's maxOverlapTests. */
661
+ readonly maxTests?: number;
662
+ /** Existing discrete solver limit; defaults to 8, maximum 256. */
663
+ readonly maxIterations?: number;
664
+ }
665
+
666
+ declare interface GeometryTileLimits {
667
+ readonly maxSide: number;
668
+ readonly maxCells: number;
669
+ readonly maxPalette: number;
670
+ readonly maxRuns: number;
671
+ readonly maxBytes: number;
672
+ }
673
+
674
+ declare type GeometryTileMaterial = (typeof GeometryTileMaterialSchema)["Type"];
675
+
676
+ declare const GeometryTileMaterialSchema: Schema.Struct<{
677
+ readonly key: Schema.String;
678
+ readonly solid: Schema.Boolean;
679
+ }>;
680
+
681
+ declare type GeometryTilePathStatus = 'pending' | 'found' | 'unreachable' | 'budget-exhausted' | 'cancelled';
682
+
683
+ declare interface GeometryVersionMigrationStrategies {
684
+ readonly migrateDelta?: GeometryMigrateDelta;
685
+ }
686
+
687
+ declare type GeometryVoxelChunk = (typeof GeometryVoxelChunkSchema)["Type"];
688
+
689
+ declare const GeometryVoxelChunkSchema: Schema.Struct<{
690
+ readonly kind: Schema.Literal<"3d-voxel">;
691
+ readonly formatVersion: Schema.Literal<1>;
692
+ readonly address: Schema.Struct<{
693
+ readonly worldId: Schema.String;
694
+ readonly layerSetId: Schema.String;
695
+ readonly cx: Schema.Int;
696
+ readonly cy: Schema.Int;
697
+ readonly cz: Schema.Int;
698
+ }>;
699
+ readonly version: Schema.String;
700
+ readonly side: Schema.Int;
701
+ readonly voxelSizeRaw: Schema.Int;
702
+ readonly palette: Schema.$Array<Schema.Struct<{
703
+ readonly key: Schema.String;
704
+ readonly solid: Schema.Boolean;
705
+ }>>;
706
+ readonly sections: Schema.$Array<Schema.Struct<{
707
+ readonly sx: Schema.Int;
708
+ readonly sy: Schema.Int;
709
+ readonly sz: Schema.Int;
710
+ readonly runs: Schema.$Array<Schema.Struct<{
711
+ readonly paletteIndex: Schema.Int;
712
+ readonly length: Schema.Int;
713
+ }>>;
714
+ }>>;
715
+ }>;
716
+
717
+ declare interface GeometryVoxelLimits {
718
+ readonly maxSide: number;
719
+ readonly maxVoxels: number;
720
+ readonly maxPalette: number;
721
+ readonly maxSections: number;
722
+ readonly maxRunsPerSection: number;
723
+ readonly maxBytes: number;
724
+ }
725
+
726
+ export declare const geometryWorldApplyOpSlotFixture: {
727
+ kind: "slot";
728
+ defaultImplementation: (context: GeometryEditContext) => GeometryChunk;
729
+ defaultProbe: {
730
+ run: () => Effect.Effect<boolean, never, never>;
731
+ expected: boolean;
732
+ };
733
+ overrideProbe: {
734
+ run: () => Effect.Effect<boolean, never, never>;
735
+ expected: boolean;
736
+ };
737
+ };
738
+
739
+ /** Nonempty half-open raw box. Three-dimensional kinds require both Z fields. */
740
+ declare interface GeometryWorldBoxRaw {
741
+ readonly minXRaw: number;
742
+ readonly minYRaw: number;
743
+ readonly maxXRaw: number;
744
+ readonly maxYRaw: number;
745
+ readonly minZRaw?: number;
746
+ readonly maxZRaw?: number;
747
+ }
748
+
749
+ /** Actual World declaration plus native pure edit pipeline. Not Host/SQL or
750
+ * complete geometry-system conformance; the app still supplies current authority. */
751
+ export declare const geometryWorldOpValidatorSlotFixture: {
752
+ kind: "slot";
753
+ defaultImplementation: (context: GeometryEditContext) => void;
754
+ defaultProbe: {
755
+ run: () => Effect.Effect<string, never, never>;
756
+ expected: string;
757
+ };
758
+ overrideProbe: {
759
+ run: () => Effect.Effect<"accepted" | "custom-refused", never, never>;
760
+ expected: string;
761
+ };
762
+ };
763
+
764
+ declare interface GeometryWorldPointRaw {
765
+ readonly xRaw: number;
766
+ readonly yRaw: number;
767
+ readonly zRaw?: number;
768
+ }
769
+
770
+ declare type GeometryWorldRayHit = GeometryGridRayHit | GeometryShapeRayHit | GeometryHeightfieldRayHit;
771
+
772
+ declare interface GeometryWorldRayOptions extends GeometryGridRayOptions {
773
+ /** Shapes only; narrows maxOverlapTests for the total shape scan. */
774
+ readonly maxTests?: number;
775
+ }
776
+
777
+ declare interface GeometryWorldShapeHit {
778
+ readonly scope: GeometryPersistenceScope;
779
+ readonly revision: number;
780
+ readonly shape: GeometryShape;
781
+ }
782
+
783
+ declare interface GeometryWorldView {
784
+ readonly kind: GeometryKind;
785
+ readonly scope: GeometryPreparedScope;
786
+ /** Discrete AABB/circle resolution in world units against current tile data.
787
+ * Reuses the Transform solver; no swept movement or velocity integration. */
788
+ collide(transform: Transform2D, body: CollisionBody2D, options?: GeometryTileCollisionOptions): CollisionResult2D;
789
+ /** Tiles/voxels only. Unloaded coordinates refuse, never implicit empty terrain. */
790
+ materialAtRaw(point: GeometryWorldPointRaw): GeometryTileMaterial;
791
+ /** Tiles/voxels/shapes: the stored solidity. Heightfields (points with `zRaw`): terrain is solid at and
792
+ * below its surface, the same surface `raycastRaw` hits. Heightfield material is not invented. */
793
+ solidAtRaw(point: GeometryWorldPointRaw): boolean;
794
+ /** Heightfield only, with exact existing native interpolation. */
795
+ heightAtRaw(point: GeometryWorldPointRaw): number;
796
+ /** Shapes only; hit volumes retain native LOCAL coordinates and exact chunk scope. */
797
+ shapesAtRaw(point: GeometryWorldPointRaw): ReadonlyArray<GeometryWorldShapeHit>;
798
+ /** Tiles/voxels return exact rational entry; shapes select exact quadratic
799
+ * entry and expose enclosing presentation bounds; heightfields (points with
800
+ * `zRaw`) return the first sampled point at or below the surface, refined to
801
+ * one raw unit (`raycastGeometryHeightfield`). Missing coverage refuses. */
802
+ raycastRaw(from: GeometryWorldPointRaw, to: GeometryWorldPointRaw, options?: GeometryWorldRayOptions): GeometryWorldRayHit | null;
803
+ /** Tiles/voxels/closed native shapes, clipped by half-open chunk ownership. Heightfields need the z extent:
804
+ * the box touches terrain when the highest surface point over its footprint is at or above `minZRaw`
805
+ * (`overlapsGeometryHeightfieldBox`). Nonempty half-open raw boxes only; missing data or work exhaustion refuses. */
806
+ overlapsBoxRaw(box: GeometryWorldBoxRaw, options?: GeometryBoxOverlapOptions): boolean;
807
+ /** Translation-only tile/voxel sweep. Shares maxOverlapTests; validates the
808
+ * whole swept bounding region before publishing the earliest overlap. */
809
+ sweepBoxRaw(from: GeometryWorldBoxRaw, to: GeometryWorldBoxRaw, options?: GeometryBoxOverlapOptions): GeometryGridSweepHit | null;
810
+ /** Heightfields only (boxes with a z extent): the first raw-grid position that reaches under the surface
811
+ * (`sweepGeometryHeightfieldBox`), coarse steps of a quarter sample spacing, at most
812
+ * `geometry.budgets.maxRayCells` overlap evaluations of `maxTests` reads each. */
813
+ sweepHeightfieldBoxRaw(from: GeometryHeightfieldBoxRaw, to: GeometryHeightfieldBoxRaw, options?: GeometryBoxOverlapOptions): GeometryHeightfieldSweepHit | null;
814
+ }
815
+
816
+ declare type LockstepDesyncAction = 'resync' | 'end' | 'flag';
817
+
818
+ declare interface LockstepDesyncContext {
819
+ readonly tick: number;
820
+ readonly playerId: number;
821
+ readonly expected: Uint64Words;
822
+ readonly received: Uint64Words;
823
+ }
824
+
825
+ export declare const lockstepDesyncSlotFixture: {
826
+ kind: "slot";
827
+ defaultImplementation: (_incident: LockstepDesyncContext, configuredAction: LockstepDesyncAction) => LockstepDesyncAction;
828
+ defaultProbe: {
829
+ run: () => Effect.Effect< LockstepDesyncAction, never, never>;
830
+ expected: string;
831
+ };
832
+ overrideProbe: {
833
+ run: () => Effect.Effect< LockstepDesyncAction, never, never>;
834
+ expected: string;
835
+ };
836
+ };
837
+
838
+ export declare const lockstepHashSlotFixture: {
839
+ kind: "slot";
840
+ defaultImplementation: <S extends Schema.Codec<unknown, unknown>>(codec: SimulationStateCodec<S>, state: S["Type"]) => Uint64Words;
841
+ defaultProbe: {
842
+ run: () => Effect.Effect<boolean, never, never>;
843
+ expected: boolean;
844
+ };
845
+ overrideProbe: {
846
+ run: () => Effect.Effect<number, never, never>;
847
+ expected: number;
848
+ };
849
+ };
850
+
851
+ export declare const lockstepInitialPlayerSlotFixture: {
852
+ kind: "slot";
853
+ defaultImplementation: (offered: RoomLockstepInitialPlayerContext) => number;
854
+ defaultProbe: {
855
+ run: () => Effect.Effect<number, never, never>;
856
+ expected: number;
857
+ };
858
+ overrideProbe: {
859
+ run: () => Effect.Effect<number, never, never>;
860
+ expected: number;
861
+ };
862
+ };
863
+
864
+ export declare const lockstepInitialStartSlotFixture: {
865
+ kind: "slot";
866
+ defaultImplementation: (offered: RoomLockstepInitialRosterContext) => boolean;
867
+ defaultProbe: {
868
+ run: () => Effect.Effect<boolean, never, never>;
869
+ expected: boolean;
870
+ };
871
+ overrideProbe: {
872
+ run: () => Effect.Effect<boolean, never, never>;
873
+ expected: boolean;
874
+ };
875
+ };
876
+
877
+ /** Actual local consumers, not passing full-system/engine/host conformance. */
878
+ export declare const lockstepInputPredictionSlotFixture: {
879
+ kind: "slot";
880
+ defaultImplementation: <I>(last: I, _context: {
881
+ readonly playerId: number;
882
+ readonly tick: number;
883
+ }) => I;
884
+ defaultProbe: {
885
+ run: () => Effect.Effect<number, never, never>;
886
+ expected: number;
887
+ };
888
+ overrideProbe: {
889
+ run: () => Effect.Effect<number, never, never>;
890
+ expected: number;
891
+ };
892
+ };
893
+
894
+ export declare const lockstepReconnectSlotFixture: {
895
+ kind: "slot";
896
+ defaultImplementation: (options?: Partial<{
897
+ readonly graceMs: number;
898
+ }>) => {
899
+ readonly graceMs: number;
900
+ };
901
+ defaultProbe: {
902
+ run: () => Effect.Effect<number, never, never>;
903
+ expected: number;
904
+ };
905
+ overrideProbe: {
906
+ run: () => Effect.Effect<number, never, never>;
907
+ expected: number;
908
+ };
909
+ };
910
+
911
+ /** Actual role constructor captures the lag used by its genuine input queue;
912
+ * live Session queue behavior is exercised by the common admission source. */
913
+ export declare const lockstepRefereeLagSlotFixture: {
914
+ kind: "slot";
915
+ defaultImplementation: (configuredTicks: number) => number;
916
+ defaultProbe: {
917
+ run: () => Effect.Effect<number, never, never>;
918
+ expected: number;
919
+ };
920
+ overrideProbe: {
921
+ run: () => Effect.Effect<number, never, never>;
922
+ expected: number;
923
+ };
924
+ };
925
+
926
+ export declare const lockstepSeedSlotFixture: {
927
+ kind: "slot";
928
+ defaultImplementation: () => number;
929
+ defaultProbe: {
930
+ run: () => Effect.Effect<boolean, never, never>;
931
+ expected: boolean;
932
+ };
933
+ overrideProbe: {
934
+ run: () => Effect.Effect<number, never, never>;
935
+ expected: number;
936
+ };
937
+ };
938
+
939
+ declare interface LockstepStallPolicy {
940
+ readonly afterTicks: number;
941
+ readonly action: 'pause' | 'drop-player';
942
+ }
943
+
944
+ declare interface LockstepStallPolicyOptions {
945
+ readonly afterTicks?: number;
946
+ readonly action?: 'pause' | 'drop-player';
947
+ }
948
+
949
+ export declare const lockstepStallPolicySlotFixture: {
950
+ kind: "slot";
951
+ defaultImplementation: (offered: LockstepStallPolicyOptions) => LockstepStallPolicy;
952
+ defaultProbe: {
953
+ run: () => Effect.Effect<"action" | "waiting", never, never>;
954
+ expected: string;
955
+ };
956
+ overrideProbe: {
957
+ run: () => Effect.Effect<"action" | "waiting", never, never>;
958
+ expected: string;
959
+ };
960
+ };
961
+
962
+ /** Seeded network, not a transport-performance claim. Reliable loss stalls;
963
+ * datagram loss drops. Both halves share one owned virtual time source. */
964
+ export declare class NetSim {
965
+ private readonly options;
966
+ readonly clock: VirtualRoomClock;
967
+ readonly client: RoomTransport;
968
+ readonly server: RoomTransport;
969
+ private readonly signals;
970
+ private readonly listeners;
971
+ private readonly deliveries;
972
+ private readonly queued;
973
+ private readonly lastReliableAt;
974
+ private readonly dropped;
975
+ private readonly maxQueuedBytes;
976
+ private readonly maxDatagramBytes;
977
+ private readonly maxInFlightDatagrams;
978
+ private seed;
979
+ private seq;
980
+ constructor(options: NetSimOptions);
981
+ private random;
982
+ private latency;
983
+ private transport;
984
+ advance(milliseconds: number): void;
985
+ private close;
986
+ }
987
+
988
+ export declare interface NetSimOptions {
989
+ readonly seed: number;
990
+ readonly latencyMs: number;
991
+ readonly jitterMs: number;
992
+ readonly lossRate: number;
993
+ readonly maxQueuedBytes?: number;
994
+ readonly maxDatagramBytes?: number;
995
+ readonly maxInFlightDatagrams?: number;
996
+ readonly datagrams?: boolean;
997
+ }
998
+
999
+ declare class NotRoomMember extends NotRoomMember_base {
1000
+ }
1001
+
1002
+ declare const NotRoomMember_base: Schema.Class<NotRoomMember, Schema.TaggedStruct<"NotRoomMember", {
1003
+ readonly sessionId: Schema.String;
1004
+ }>, YieldableError>;
1005
+
1006
+ /** PCG-XSH-RR 64/32. Numeric seeds are unsigned 32-bit; word seeds retain 64 bits.
1007
+ * Algorithm reference: https://www.pcg-random.org/using-pcg-c-basic.html
1008
+ * No global generator, BigInt, native dependency or implicit time/entropy seed. */
1009
+ declare class Pcg32 {
1010
+ #private;
1011
+ constructor(seed: Pcg32Seed, stream?: Pcg32Seed, maxRejectionAttempts?: number);
1012
+ get maxRejectionAttempts(): number;
1013
+ nextU32(): number;
1014
+ /** Rejection removes modulo bias. Exhaustion consumes exactly the bounded
1015
+ * draws and fails; it never returns a biased fallback or substitutes entropy. */
1016
+ bounded(bound: number): number;
1017
+ snapshot(): Pcg32Snapshot;
1018
+ restore(offered: Pcg32Snapshot): void;
1019
+ clone(): Pcg32;
1020
+ /** Exact skip-ahead modulo 2^64; at most 32 iterations for this delta API. */
1021
+ advance(delta: number): void;
1022
+ }
1023
+
1024
+ declare type Pcg32Seed = number | Uint64Words;
1025
+
1026
+ declare interface Pcg32Snapshot {
1027
+ readonly stateHi: number;
1028
+ readonly stateLo: number;
1029
+ readonly incrementHi: number;
1030
+ readonly incrementLo: number;
1031
+ }
1032
+
1033
+ declare class ProtocolError extends ProtocolError_base {
1034
+ get message(): string;
1035
+ }
1036
+
1037
+ declare const ProtocolError_base: Schema.Class<ProtocolError, Schema.TaggedStruct<"ProtocolError", {
1038
+ readonly detail: Schema.String;
1039
+ }>, YieldableError>;
1040
+
1041
+ declare const ReserveRoomInput: Schema.Union<readonly [Schema.Struct<{
1042
+ readonly mode: Schema.Literals<readonly ["join", "create"]>;
1043
+ readonly room: Schema.NonEmptyString;
1044
+ readonly options: Schema.Unknown;
1045
+ readonly pool: Schema.optional<Schema.String>;
1046
+ }>, Schema.Struct<{
1047
+ readonly mode: Schema.Literal<"joinById">;
1048
+ readonly roomId: Schema.NonEmptyString;
1049
+ readonly role: Schema.optional<Schema.Literals<readonly ["player", "spectator"]>>;
1050
+ }>]>;
1051
+
1052
+ declare type ReserveRoomInput = typeof ReserveRoomInput.Type;
1053
+
1054
+ /** One authoritative actor. This module contains no store, socket or timer. */
1055
+ declare class RoomActor<S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>, O extends Schema.Codec<unknown, unknown>> {
1056
+ readonly id: string;
1057
+ readonly descriptor: RoomDescriptor<S, I, O>;
1058
+ private readonly clock;
1059
+ readonly tenantId: string;
1060
+ private currentState;
1061
+ private lastGoodState;
1062
+ private lastGoodTick;
1063
+ readonly options: (O)["Type"];
1064
+ private readonly members;
1065
+ private readonly grace;
1066
+ private readonly inputs;
1067
+ private readonly outbox;
1068
+ private readonly clientOperations;
1069
+ private readonly schedules;
1070
+ private readonly extensionDurationMs;
1071
+ private readonly extensionOverruns;
1072
+ private tick;
1073
+ private droppedTicks;
1074
+ private commandSeq;
1075
+ readonly epoch: number;
1076
+ private nextTickAt;
1077
+ private emptyAt;
1078
+ private locked;
1079
+ private disposed;
1080
+ private publicationHeldAt;
1081
+ private drainFrozen;
1082
+ private drainAt;
1083
+ private retiring;
1084
+ private faulted;
1085
+ private ticking;
1086
+ private lastNow;
1087
+ private readonly app;
1088
+ private readonly scheduler;
1089
+ private readonly worldPreviews;
1090
+ private readonly worldReceipts;
1091
+ private readonly deferredWorldLeaves;
1092
+ private worldMovement;
1093
+ private worldMovementClamps;
1094
+ private worldMovementMargin;
1095
+ private worldMovementIntents;
1096
+ private worldFinalizationHold;
1097
+ private readonly worldPublishedTransitions;
1098
+ private lifecycleTail;
1099
+ private lifecycleRequests;
1100
+ private lifecycleActive;
1101
+ private readonly geometry;
1102
+ constructor(id: string, descriptor: RoomDescriptor<S, I, O>, initialState: (S)["Type"], options: (O)["Type"], clock: RoomClock, tenantId: string, recovery?: RoomActorRecovery, geometry?: GeometryWorldView);
1103
+ get state(): RoomState<(S)["Type"]>;
1104
+ private now;
1105
+ private ensureOpen;
1106
+ private stage;
1107
+ private schedule;
1108
+ join(client: RoomClient): void;
1109
+ joinAsync(client: RoomClient, signal?: AbortSignal): Promise<void>;
1110
+ /** Only a trusted SQL seat adapter supplies this cursor; player Hello/input
1111
+ * never contains it. The successful lifecycle commits cursor and membership. */
1112
+ /** `authorizeCommit` runs before the join hook and again before publication; the World
1113
+ * member its first run returns reaches `onJoin` as `world`. */
1114
+ joinReservedAsync(client: RoomClient, consumed: RoomConsumedSeat, signal?: AbortSignal, authorizeCommit?: () => Promise<RoomWorldMember | undefined | void>): Promise<void>;
1115
+ /** Trusted Host-only pending membership. The caller must separately establish
1116
+ * current SQL transition/Seat authority; the marker itself grants nothing. */
1117
+ joinWorldReservedAsync(client: RoomClient, consumed: RoomConsumedSeat, authorize: () => Promise<void | 'pending' | 'committed' | 'settled'>, signal?: AbortSignal): Promise<void>;
1118
+ /** The author's view of a transition arrival becoming an active member (`world.onMemberEnter`). */
1119
+ private worldMemberEntered;
1120
+ /** The committed World point of one entity through `world.movement.position`: the last good state, never a
1121
+ * draft. Null without a movement hook, without that entity, or without a finite point. */
1122
+ worldEntityPoint(entityId: string): WorldPoint | null;
1123
+ /** Release only after the Host has persisted actual target enter and rechecked
1124
+ * SQL authority. The retained canonical enter receipt is required locally. */
1125
+ activateWorldReservedAsync(binding: WorldTargetSeatBinding, authorize: () => Promise<void>): Promise<void>;
1126
+ private assertWorldMemberEntity;
1127
+ isWorldPending(sessionId: string): boolean;
1128
+ /** Explicit trusted local-host admission. Authentication still follows the
1129
+ * descriptor; the resulting capability is bound to this exact Member object,
1130
+ * so a stale bot cannot submit to or release a later reused session ID. */
1131
+ joinBotAsync(client: RoomClient, countsAsPlayer?: boolean, signal?: AbortSignal): Promise<RoomActorBotLease>;
1132
+ playerCount(): number;
1133
+ availablePlayerSlots(): number;
1134
+ monotonicNow(): number;
1135
+ roster(): ReadonlyArray<Pick<RoomClient, 'sessionId' | 'subjectId' | 'tenantId'> & {
1136
+ readonly isBot: boolean;
1137
+ readonly countsAsPlayer: boolean;
1138
+ }>;
1139
+ /** Check identity/lock and current counted/grace capacity before replacing a
1140
+ * bot. Full prepareJoin repeats these immediately before membership commit. */
1141
+ humanAdmissionNeedsReplacement(client: RoomClient): boolean;
1142
+ private prepareClientIdentity;
1143
+ private prepareJoin;
1144
+ leave(sessionId: string, reason?: RoomLeaveReason): void;
1145
+ leaveAsync(sessionId: string, reason?: RoomLeaveReason, signal?: AbortSignal): Promise<void>;
1146
+ private prepareLeave;
1147
+ private assertWorldArrival;
1148
+ private enterWorldDraft;
1149
+ /** Execute actual target admission on an isolated draft. Nothing is published
1150
+ * or receipted here. Author Effects receive prepare phase and must supply their
1151
+ * own external idempotency/compensation; this is not an ownership commit. */
1152
+ previewWorldEnter(input: Parameters<RoomActor<S, I, O>['applyWorldHook']>[1], maxBytes: number, signal?: AbortSignal): Promise<void>;
1153
+ /** Trusted server lifecycle only. The caller supplies the configured World
1154
+ * byte budget and current epoch; this grants no SQL/transition admission. */
1155
+ applyWorldHook(operation: 'enter' | 'exit' | 'ghost', input: RoomWorldHookInput<RoomWorldEntity<(S)["Type"]>>, maxBytes: number, signal?: AbortSignal, authorizeCommit?: () => Promise<void>, replaceExitReceipt?: boolean, previousGhost?: RoomWorldHookInput<RoomWorldEntity<(S)["Type"]>>, retainGhostProjection?: boolean, promoteGhosts?: ReadonlyArray<RoomWorldHookInput<RoomWorldEntity<(S)["Type"]>>>): Promise<void>;
1156
+ private assertWorldHookResult;
1157
+ private assertWorldEnterVacant;
1158
+ /** Trusted Host terminal-proof path only; it checkpoints the removal before
1159
+ * returning. No gameplay state or external effect is undone here. */
1160
+ retireWorldReceipt(requestId: string, operation: 'enter' | 'exit' | 'ghost'): Promise<void>;
1161
+ /** Failed transition compensation, guarded before draft publication. The
1162
+ * author removes its projection in onGhost phase rollback; no source rewind. */
1163
+ cancelWorldGhost(input: Parameters<RoomActor<S, I, O>['applyWorldHook']>[1], maxBytes: number, authorize: () => Promise<void>): Promise<void>;
1164
+ cancelWorldPreview(requestId: string, authorize: () => Promise<void>): Promise<void>;
1165
+ hasWorldReceipt(requestId: string, operation: 'enter' | 'exit' | 'ghost'): boolean;
1166
+ worldReceiptSnapshot(): ReadonlyArray<RoomWorldReceipt>;
1167
+ /** Capture the actual current actor entity, never a caller-provided replacement.
1168
+ * Returned data is detached bounded JSON; persistence remains outside the tick. */
1169
+ captureWorldEntity(entityId: string, epoch: number, maxBytes: number): Promise<{
1170
+ readonly entity: RoomWorldEntity<(S)["Type"]>;
1171
+ readonly data: unknown;
1172
+ }>;
1173
+ configureWorldCellMovement(epoch: number, bounds?: WorldBounds, marginUnits?: number): Promise<void>;
1174
+ worldMovementSnapshot(): {
1175
+ readonly bound: boolean;
1176
+ readonly clamped: number;
1177
+ };
1178
+ captureWorldMovement(epoch: number): Promise<WorldMovementObservation>;
1179
+ private constrainWorldMovement;
1180
+ listWorldEntityIds(epoch: number, maximum: number, maxBytes: number): Promise<ReadonlyArray<string>>;
1181
+ captureWorldProjection(entityId: string, epoch: number, maxBytes: number): Promise<{
1182
+ readonly entity: RoomWorldEntity<(S)["Type"]>;
1183
+ readonly data: unknown;
1184
+ readonly tick: number;
1185
+ }>;
1186
+ private captureWorldEntityOwned;
1187
+ /** Trusted Host handoff: one bounded room hold survives ambiguous durable writes.
1188
+ * Completion must follow checkpoint acknowledgement; never release by timeout. */
1189
+ finalizeWorldExit(input: {
1190
+ readonly afterglow?: {
1191
+ readonly requestId: string;
1192
+ readonly expiresAt: number;
1193
+ };
1194
+ readonly subjectId?: string;
1195
+ readonly epoch: number;
1196
+ readonly entityId: string;
1197
+ readonly requestId: string;
1198
+ readonly location: WorldEntityLocation;
1199
+ }, maxBytes: number, retain: (capture: {
1200
+ readonly entity: RoomWorldEntity<(S)["Type"]>;
1201
+ readonly data: unknown;
1202
+ }) => Promise<void>, authorize: () => Promise<void>, expectedEntity?: unknown, signal?: AbortSignal): Promise<void>;
1203
+ /** The actual Runtime supplies the synchronous bounded reliable enqueue. No
1204
+ * network completion is awaited while the lifecycle/SQL fence is held. */
1205
+ notifyWorldHandoff(input: Omit<RoomWorldHandoffFrame, 'tick'>, authorize: () => Promise<void>, enqueue: (frame: RoomWorldHandoffFrame) => void): Promise<void>;
1206
+ /** Only the actual Host may call this after its durable checkpoint succeeds. */
1207
+ completeWorldFinalization(requestId: string, authorize: () => Promise<void>): Promise<void>;
1208
+ worldFinalizationAfterglow(): {
1209
+ readonly requestId: string;
1210
+ readonly expiresAt: number;
1211
+ } | undefined;
1212
+ worldFinalizationRequest(): string | null;
1213
+ isWorldFinalizationHeld(): boolean;
1214
+ /** Recovery-only source reconstruction from final durable capture. Caller owns
1215
+ * unpublished successor/recovery authority and checkpoints before fence clear. */
1216
+ reconcileWorldSource(input: {
1217
+ readonly epoch: number;
1218
+ readonly requestId: string;
1219
+ readonly entity: RoomWorldEntity<(S)["Type"]>;
1220
+ readonly location: WorldEntityLocation;
1221
+ }, maxBytes: number, authorize: () => Promise<void>, signal?: AbortSignal): Promise<void>;
1222
+ private assertSynchronousLifecycle;
1223
+ private serializeLifecycle;
1224
+ private mutateMemberAsync;
1225
+ private pruneGrace;
1226
+ private mutateMember;
1227
+ /** encodedBytes is measured by the host transport, never supplied by a player. */
1228
+ input(sessionId: string, seq: number, tickHint: number, payload: unknown, encodedBytes: number): boolean;
1229
+ private send;
1230
+ private extension;
1231
+ holdPublication(): void;
1232
+ releasePublication(): void;
1233
+ /** Called by the host's single monotonic loop. Catch-up never spins unbounded. */
1234
+ advance(): number;
1235
+ drainOutbox(): ReadonlyArray<RoomOutboxCommand>;
1236
+ private stageClientOperation;
1237
+ /** Transport callbacks are invoked only by the supervisor after advance. */
1238
+ flushClientOperations(): void;
1239
+ /** Ordinary socket members and reconnect grace only. Local bots own no SQL
1240
+ * seat. Queued-but-unapplied inputs never become applied receipts; discarded
1241
+ * pending World inputs carry a separate durable rejection cursor. */
1242
+ inputReceiptSnapshot(): ReadonlyArray<RoomInputReceipt>;
1243
+ /** Runtime-only confirmation after the actual checkpoint port acknowledges.
1244
+ * Inputs arriving during the write remain unconfirmed and block activation. */
1245
+ confirmInputCheckpoint(receipts: ReadonlyArray<RoomInputReceipt>): void;
1246
+ lastAppliedInputSeq(sessionId: string): number;
1247
+ lock(): void;
1248
+ unlock(): void;
1249
+ dispose(): void;
1250
+ isDisposed(): boolean;
1251
+ isLifecycleBusy(): boolean;
1252
+ /** Permanent local simulation fence before the final planned-handoff snapshot. */
1253
+ freezeForDrain(): Promise<void>;
1254
+ /** Only after real SQL ownership handoff. No leave/dispose game hooks, SQL,
1255
+ * or new commands may run after the saved state has moved to its successor. */
1256
+ releaseTransferred(): void;
1257
+ disposeAsync(signal?: AbortSignal): Promise<void>;
1258
+ isRetiring(): boolean;
1259
+ /** Only the supervisor calls this after the final hibernated SQL receipt.
1260
+ * Hibernate pauses a durable room; it must not run game-ending onDispose. */
1261
+ releaseHibernated(): void;
1262
+ isFaulted(): boolean;
1263
+ commandCursor(): number;
1264
+ scheduleSnapshot(): ReadonlyArray<RoomScheduleSnapshot>;
1265
+ lastGoodSnapshot(): {
1266
+ readonly tick: number;
1267
+ readonly state: RoomState<(S)["Type"]>;
1268
+ };
1269
+ metrics(): RoomActorMetrics;
1270
+ }
1271
+
1272
+ declare interface RoomActorBotLease {
1273
+ readonly sessionId: string;
1274
+ isCurrent(): boolean;
1275
+ input(seq: number, tickHint: number, payload: unknown, encodedBytes: number): boolean;
1276
+ leave(signal?: AbortSignal): Promise<void>;
1277
+ }
1278
+
1279
+ declare interface RoomActorMetrics {
1280
+ readonly tick: number;
1281
+ readonly droppedTicks: number;
1282
+ readonly queuedInputs: number;
1283
+ readonly outboxCommands: number;
1284
+ readonly clients: number;
1285
+ readonly extensionDurationMs: Readonly<Record<string, number>>;
1286
+ readonly extensionOverruns: Readonly<Record<string, number>>;
1287
+ }
1288
+
1289
+ declare interface RoomActorRecovery {
1290
+ /** SQL ownership generation; a new owner must use a strictly newer epoch. */
1291
+ readonly epoch: number;
1292
+ readonly commandCursor: number;
1293
+ readonly tick?: number;
1294
+ readonly rehydrate?: boolean;
1295
+ readonly worldReceipts?: ReadonlyArray<RoomWorldReceipt> | undefined;
1296
+ readonly schedules?: ReadonlyArray<RoomScheduleSnapshot>;
1297
+ }
1298
+
1299
+ export declare type RoomAdoptionFixtureOverrides = Partial<Context.Service.Shape<typeof RoomHostAdoptionPort>>;
1300
+
1301
+ /** Commands are staged in memory and drained outside the tick. */
1302
+ declare interface RoomAppBridge {
1303
+ publish(event: string, payload: unknown, options: {
1304
+ readonly key: string;
1305
+ }): string;
1306
+ run(descriptor: string, input: unknown): string;
1307
+ }
1308
+
1309
+ declare interface RoomAppCommand {
1310
+ readonly roomId: string;
1311
+ readonly tenantId: string;
1312
+ readonly requestId: string;
1313
+ readonly command: RoomOutboxCommand;
1314
+ }
1315
+
1316
+ export declare const roomAppCommandFakeLayer: Layer.Layer<RoomAppCommandPort, never, never>;
1317
+
1318
+ export declare type RoomAppCommandFixtureOverrides = Partial<Context.Service.Shape<typeof RoomAppCommandPort>>;
1319
+
1320
+ /** Application dispatch must implement durable idempotency by requestId. */
1321
+ declare class RoomAppCommandPort extends RoomAppCommandPort_base {
1322
+ }
1323
+
1324
+ declare const RoomAppCommandPort_base: Context.ServiceClass<RoomAppCommandPort, "@voltro/RoomAppCommandPort", {
1325
+ deliver(command: RoomAppCommand): Effect.Effect<void, ProtocolError>;
1326
+ }>;
1327
+
1328
+ export declare const roomAppCommandPortFixture: {
1329
+ kind: "port";
1330
+ tag: Context.Service<RoomAppCommandPort, {
1331
+ deliver(command: RoomAppCommand): Effect.Effect<void, ProtocolError>;
1332
+ }>;
1333
+ fakeLayer: Layer.Layer<RoomAppCommandPort, never, never>;
1334
+ probe: {
1335
+ run: () => Effect.Effect<string, never, never>;
1336
+ expected: string;
1337
+ };
1338
+ };
1339
+
1340
+ declare class RoomAuthoringError extends RoomAuthoringError_base {
1341
+ get message(): string;
1342
+ }
1343
+
1344
+ declare const RoomAuthoringError_base: Schema.Class<RoomAuthoringError, Schema.TaggedStruct<"RoomAuthoringError", {
1345
+ readonly room: Schema.String;
1346
+ readonly detail: Schema.String;
1347
+ }>, YieldableError>;
1348
+
1349
+ declare interface RoomAuthoringStrategies<S = unknown> {
1350
+ readonly budgets?: (options: Readonly<Partial<RoomBudgets>>) => RoomBudgets;
1351
+ readonly reconnectPolicy?: (options: Readonly<Partial<{
1352
+ readonly graceMs: number;
1353
+ }>>) => {
1354
+ readonly graceMs: number;
1355
+ };
1356
+ readonly snapshotPolicy?: (options: Readonly<Partial<RoomSnapshotPolicy<S>>>) => RoomSnapshotPolicy<S>;
1357
+ readonly spectatorPolicy?: (options: Readonly<Partial<RoomSpectatorPolicy>>) => RoomSpectatorPolicy;
1358
+ }
1359
+
1360
+ declare interface RoomBudgets {
1361
+ readonly inputsPerSecond: number;
1362
+ readonly bytesPerSecond: number;
1363
+ readonly burst: number;
1364
+ readonly maxQueuedInputs: number;
1365
+ readonly maxOutboxCommands: number;
1366
+ readonly maxScheduledHooks: number;
1367
+ readonly maxQueuedLifecycleHooks: number;
1368
+ readonly maxNpcs: number;
1369
+ /** A player input acting on state older than this many milliseconds behind the newest state
1370
+ * the Host sent that client is dropped (it arrived too late to apply fairly). */
1371
+ readonly inputLatencyBudgetMs: number;
1372
+ }
1373
+
1374
+ /** Actual descriptor admission exercises defaults and configured overrides.
1375
+ * These fixtures do not register a passing whole-system manifest. */
1376
+ export declare const roomBudgetsSlotFixture: {
1377
+ kind: "slot";
1378
+ defaultImplementation: (overrides?: Partial< RoomBudgets>) => RoomBudgets;
1379
+ defaultProbe: {
1380
+ run: () => Effect.Effect<number, never, never>;
1381
+ expected: number;
1382
+ };
1383
+ overrideProbe: {
1384
+ run: () => Effect.Effect<number, never, never>;
1385
+ expected: number;
1386
+ };
1387
+ };
1388
+
1389
+ declare interface RoomChannel {
1390
+ readonly schema: Schema.Codec<unknown, unknown>;
1391
+ readonly direction: 'both' | 'server' | 'client';
1392
+ readonly reliable: boolean;
1393
+ }
1394
+
1395
+ declare interface RoomCheckpoint {
1396
+ readonly requestId: string;
1397
+ readonly roomId: string;
1398
+ readonly tenantId: string;
1399
+ readonly epoch: number;
1400
+ readonly revision: number;
1401
+ readonly tick: number;
1402
+ readonly commandCursor: number;
1403
+ readonly bytes: Uint8Array;
1404
+ readonly schemaHash: number;
1405
+ readonly schedules: ReadonlyArray<RoomScheduleSnapshot>;
1406
+ readonly worldReceipts?: ReadonlyArray<RoomWorldReceipt> | undefined;
1407
+ readonly inputReceipts: ReadonlyArray<RoomInputReceipt>;
1408
+ readonly commands: ReadonlyArray<RoomOutboxCommand>;
1409
+ readonly publication?: 'held' | undefined;
1410
+ /** Earliest World epoch represented by an interrupted held adoption. */
1411
+ readonly worldRecoveryEpoch?: number | undefined;
1412
+ readonly disposition: 'live' | 'faulted' | 'disposed' | 'hibernating' | 'hibernated';
1413
+ /** The Room's own listing (`RoomDefinition.listing`), written to the directory with a live checkpoint. */
1414
+ readonly listing?: RoomListing | undefined;
1415
+ readonly snapshot?: {
1416
+ readonly mode: 'full' | 'delta';
1417
+ readonly fullEvery: number;
1418
+ readonly keepFulls: number;
1419
+ readonly store: 'auto';
1420
+ readonly maxInlineBytes: number;
1421
+ };
1422
+ }
1423
+
1424
+ export declare const roomCheckpointFakeLayer: Layer.Layer<RoomCheckpointPort, never, never>;
1425
+
1426
+ export declare type RoomCheckpointFixtureOverrides = Partial<Context.Service.Shape<typeof RoomCheckpointPort>>;
1427
+
1428
+ /** Browser-safe service contracts. Server adapters and fixture Layers share
1429
+ * these exact Tags; imports of server-owned data shapes are erased types. */
1430
+ declare class RoomCheckpointPort extends RoomCheckpointPort_base {
1431
+ }
1432
+
1433
+ declare const RoomCheckpointPort_base: Context.ServiceClass<RoomCheckpointPort, "@voltro/RoomCheckpointPort", {
1434
+ commit(checkpoint: RoomCheckpoint): Effect.Effect<void, ProtocolError | RoomHibernatePending>;
1435
+ load(roomId: string, tenantId: string): Effect.Effect<RoomCheckpoint | null, ProtocolError>;
1436
+ pending(roomId: string, tenantId: string, limit: number): Effect.Effect<ReadonlyArray<RoomOutboxCommand>, ProtocolError>;
1437
+ acknowledge(roomId: string, tenantId: string, requestId: string): Effect.Effect<void, ProtocolError>;
1438
+ /** Optional: retire a command whose handler keeps failing (marked failed, no longer pending).
1439
+ * Without it, a failing command is retried on every turn. */
1440
+ readonly park?: (roomId: string, tenantId: string, requestId: string) => Effect.Effect<void, ProtocolError>;
1441
+ }>;
1442
+
1443
+ export declare const roomCheckpointPortFixture: {
1444
+ kind: "port";
1445
+ tag: Context.Service<RoomCheckpointPort, {
1446
+ commit(checkpoint: RoomCheckpoint): Effect.Effect<void, ProtocolError | RoomHibernatePending>;
1447
+ load(roomId: string, tenantId: string): Effect.Effect< RoomCheckpoint | null, ProtocolError>;
1448
+ pending(roomId: string, tenantId: string, limit: number): Effect.Effect<ReadonlyArray< RoomOutboxCommand>, ProtocolError>;
1449
+ acknowledge(roomId: string, tenantId: string, requestId: string): Effect.Effect<void, ProtocolError>;
1450
+ readonly park?: (roomId: string, tenantId: string, requestId: string) => Effect.Effect<void, ProtocolError>;
1451
+ }>;
1452
+ fakeLayer: Layer.Layer<RoomCheckpointPort, never, never>;
1453
+ probe: {
1454
+ run: () => Effect.Effect<string, never, never>;
1455
+ expected: string;
1456
+ };
1457
+ };
1458
+
1459
+ declare interface RoomClient {
1460
+ readonly sessionId: string;
1461
+ readonly subjectId: string | null;
1462
+ readonly tenantId: string;
1463
+ /** App data the API resolved for this seat (`seatAttributes` on the Rooms API binding), signed into
1464
+ * the seat; absent without one. Not a secret from the player: it travels in their seat token. */
1465
+ readonly attributes?: RoomSeatAttributes | undefined;
1466
+ /** Actor-owned classification, never accepted from a socket input. */
1467
+ readonly isBot?: boolean | undefined;
1468
+ readonly countsAsPlayer?: boolean | undefined;
1469
+ send(channel: string, payload: unknown): void;
1470
+ kick(reason: string): void;
1471
+ }
1472
+
1473
+ declare interface RoomClientInputRecovery {
1474
+ readonly nextSeq: number;
1475
+ readonly lastAppliedSeq: number;
1476
+ }
1477
+
1478
+ declare interface RoomClock {
1479
+ now(): number;
1480
+ }
1481
+
1482
+ declare interface RoomClockSamplingOptions {
1483
+ readonly maxPendingPings: number;
1484
+ readonly pingTimeoutMs: number;
1485
+ }
1486
+
1487
+ /** Syncs independent monotonic clocks; wall-clock changes do not participate. */
1488
+ declare class RoomClockSync {
1489
+ private readonly clock;
1490
+ private readonly samples;
1491
+ private lastServerNow;
1492
+ private provisionalOffset;
1493
+ constructor(clock: RoomClock);
1494
+ /** Welcome gives an approximate clock anchor, never an RTT measurement. */
1495
+ anchor(serverTimeMs: number, receivedAt?: number): void;
1496
+ reset(): void;
1497
+ pong(clientTimeMs: number, serverTimeMs: number, receivedAt?: number): void;
1498
+ stats(): {
1499
+ readonly rttMs: number | null;
1500
+ readonly offsetMs: number | null;
1501
+ };
1502
+ serverNow(): number | null;
1503
+ }
1504
+
1505
+ /** Every admitted session of one Room (a maintenance drain); `reason` is shown to each player. */
1506
+ declare interface RoomCloseInput {
1507
+ readonly tenantId: string;
1508
+ readonly roomId: string;
1509
+ readonly reason: string;
1510
+ }
1511
+
1512
+ declare interface RoomCodecLimits {
1513
+ readonly maxBytes: number;
1514
+ readonly maxCollectionLength: number;
1515
+ readonly maxFieldId: number;
1516
+ }
1517
+
1518
+ declare interface RoomConsumedSeat {
1519
+ readonly lastAppliedSeq: number;
1520
+ readonly discardedThrough?: number;
1521
+ readonly worldTarget?: WorldTargetSeatBinding;
1522
+ }
1523
+
1524
+ declare type RoomControlError = ProtocolError | BudgetExceeded | NotRoomMember | RoomAuthoringError | RoomForbidden | RoomFull | RoomGone | RoomLocked | RoomPoolWaking | RoomsClosed | SeatExpired;
1525
+
1526
+ declare interface RoomCreation {
1527
+ /** Server-owned stable retry key. Requires staged creation; never a client
1528
+ * permission or a request to resurrect a retired Room. */
1529
+ readonly creationKey?: string;
1530
+ /** Server-owned explicit QA override; canonical room ownership otherwise. */
1531
+ readonly pool?: string | undefined;
1532
+ readonly tenantId: string;
1533
+ readonly name: string;
1534
+ readonly maxClients: number;
1535
+ readonly metadata: Readonly<Record<string, unknown>>;
1536
+ readonly private: boolean;
1537
+ readonly options?: unknown;
1538
+ /** Remains unavailable until its first authoritative checkpoint commits. */
1539
+ readonly staged?: boolean;
1540
+ }
1541
+
1542
+ declare interface RoomDatagramLane {
1543
+ readonly maxDatagramBytes: number;
1544
+ send(frame: Uint8Array): void;
1545
+ onFrame(listener: (frame: Uint8Array, receivedAt: number) => void): () => void;
1546
+ }
1547
+
1548
+ declare interface RoomDefinition<S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>, O extends Schema.Codec<unknown, unknown>> {
1549
+ readonly name: string;
1550
+ readonly mode?: 'state-sync';
1551
+ readonly state: S;
1552
+ readonly auth?: 'subject' | 'public';
1553
+ readonly guards?: DeclaredAccess;
1554
+ readonly openAccess?: string | undefined;
1555
+ readonly input: I;
1556
+ readonly options: O;
1557
+ /** Author-owned initial state; no game values are guessed by the host. */
1558
+ readonly initialState?: (options: (O)["Type"]) => (S)["Type"];
1559
+ readonly tickRate?: number;
1560
+ readonly sendRate?: number;
1561
+ readonly maxClients?: number;
1562
+ readonly maxCatchUpTicks?: number;
1563
+ readonly lifecycleTimeoutMs?: number;
1564
+ readonly budgets?: Partial<RoomBudgets>;
1565
+ readonly strategies?: RoomAuthoringStrategies<(S)["Type"]> | undefined;
1566
+ readonly reconnect?: {
1567
+ readonly graceMs: number;
1568
+ };
1569
+ readonly autoDispose?: {
1570
+ readonly afterEmptyMs: number;
1571
+ readonly hibernate?: boolean;
1572
+ };
1573
+ readonly snapshot?: Partial<RoomSnapshotPolicy<(S)["Type"]>>;
1574
+ /** Opt-in shared history; host must supply the actual common view/admission. */
1575
+ readonly spectator?: Partial<RoomSpectatorPolicy> | undefined;
1576
+ readonly messages?: Readonly<Record<string, RoomChannel>>;
1577
+ readonly view?: (context: RoomViewContext<(S)["Type"]>) => (S)["Type"];
1578
+ readonly viewBudgetMs?: number;
1579
+ /** How the Room appears in `rooms.list`, derived from its state: `private` takes it off the list
1580
+ * (it stays joinable by ID), `locked` refuses every new seat, `metadata` is shown to listers.
1581
+ * Omitted fields keep their current value. The Host writes a change with the next checkpoint,
1582
+ * which a change triggers at once. Synchronous and pure, like `view`. */
1583
+ readonly listing?: (context: RoomListingContext<(S)["Type"], (O)["Type"]>) => RoomListing;
1584
+ readonly extensions?: ReadonlyArray<RoomExtension<(S)["Type"], (I)["Type"]>>;
1585
+ readonly world?: RoomWorldHooks<(S)["Type"]> | undefined;
1586
+ readonly onCreate?: RoomSyncHook<Omit<RoomMemberContext<(S)["Type"], (O)["Type"]>, 'client'>>;
1587
+ readonly onRehydrate?: RoomSyncHook<Omit<RoomMemberContext<(S)["Type"], (O)["Type"]>, 'client'>>;
1588
+ readonly onJoin?: RoomLifecycleHook<RoomMemberContext<(S)["Type"], (O)["Type"]>>;
1589
+ readonly onLeave?: RoomLifecycleHook<RoomMemberContext<(S)["Type"], (O)["Type"]> & {
1590
+ readonly reason: RoomLeaveReason;
1591
+ }>;
1592
+ readonly onTick: RoomSyncHook<RoomTickContext<(S)["Type"], (I)["Type"]>>;
1593
+ readonly onSchedule?: RoomSyncHook<RoomTickContext<(S)["Type"], (I)["Type"]> & {
1594
+ readonly label: string;
1595
+ }>;
1596
+ readonly onDispose?: RoomLifecycleHook<{
1597
+ readonly state: RoomState<(S)["Type"]> | undefined;
1598
+ readonly app: RoomAppBridge;
1599
+ readonly geometry?: GeometryWorldView;
1600
+ }> | undefined;
1601
+ }
1602
+
1603
+ declare interface RoomDeliveredState<S> {
1604
+ readonly epoch: number;
1605
+ readonly tick: number;
1606
+ /** Local transport observation, not an authoritative server timestamp. */
1607
+ readonly receivedAt: number;
1608
+ readonly state: S;
1609
+ }
1610
+
1611
+ declare interface RoomDescriptor<S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>, O extends Schema.Codec<unknown, unknown>> extends RoomDefinition<S, I, O> {
1612
+ readonly _tag: 'RoomDescriptor';
1613
+ readonly auth: 'subject' | 'public';
1614
+ readonly guards: DeclaredAccess;
1615
+ readonly tickRate: number;
1616
+ readonly sendRate: number;
1617
+ readonly maxClients: number;
1618
+ readonly maxCatchUpTicks: number;
1619
+ readonly lifecycleTimeoutMs: number;
1620
+ readonly budgets: RoomBudgets;
1621
+ readonly view: (context: RoomViewContext<(S)["Type"]>) => (S)["Type"];
1622
+ readonly reconnect: {
1623
+ readonly graceMs: number;
1624
+ };
1625
+ readonly autoDispose: {
1626
+ readonly afterEmptyMs: number;
1627
+ readonly hibernate: boolean;
1628
+ };
1629
+ readonly snapshot: RoomSnapshotPolicy<(S)["Type"]>;
1630
+ readonly spectator?: RoomSpectatorPolicy | undefined;
1631
+ readonly messages: Readonly<Record<string, RoomChannel>>;
1632
+ readonly viewBudgetMs: number;
1633
+ readonly extensions: ReadonlyArray<RoomExtension<(S)["Type"], (I)["Type"]>>;
1634
+ }
1635
+
1636
+ declare type RoomDirectoryError = ProtocolError | BudgetExceeded | RoomForbidden | RoomFull | RoomGone | RoomPoolWaking;
1637
+
1638
+ export declare const roomDirectoryFakeLayer: Layer.Layer<RoomDirectoryPort, never, never>;
1639
+
1640
+ export declare type RoomDirectoryFixtureOverrides = Partial<Context.Service.Shape<typeof RoomDirectoryPort>>;
1641
+
1642
+ declare interface RoomDirectoryListing {
1643
+ readonly pool?: string | undefined;
1644
+ readonly id: string;
1645
+ readonly name: string;
1646
+ readonly hostId: string;
1647
+ readonly tenantId: string;
1648
+ readonly metadata: Readonly<Record<string, unknown>>;
1649
+ readonly clients: number;
1650
+ readonly maxClients: number;
1651
+ readonly locked: boolean;
1652
+ readonly epoch: number;
1653
+ }
1654
+
1655
+ declare class RoomDirectoryPort extends RoomDirectoryPort_base {
1656
+ }
1657
+
1658
+ declare const RoomDirectoryPort_base: Context.ServiceClass<RoomDirectoryPort, "@voltro/RoomDirectoryPort", {
1659
+ register(input: RoomHostRegistration): Effect.Effect<RoomHostListing, RoomDirectoryError>;
1660
+ heartbeat(hostId: string, load: RoomHostRegistration["load"]): Effect.Effect<void, RoomDirectoryError>;
1661
+ setReady(hostId: string, ready: boolean): Effect.Effect<void, RoomDirectoryError>;
1662
+ hosts(region: string, pool?: string): Effect.Effect<ReadonlyArray<RoomHostListing>, RoomDirectoryError>;
1663
+ observeOwnership(roomId: string, tenantId: string): Effect.Effect<RoomOwnershipObservation | null, RoomDirectoryError>;
1664
+ selectHost(region: string, routing?: RoomHostRouting): Effect.Effect<RoomHostListing, RoomDirectoryError>;
1665
+ createOwnedRoom(hostId: string, input: RoomCreation): Effect.Effect<RoomDirectoryListing, RoomDirectoryError>;
1666
+ abandonCreation(hostId: string, roomId: string, tenantId: string): Effect.Effect<void, RoomDirectoryError>;
1667
+ unregister(hostId: string): Effect.Effect<void, RoomDirectoryError>;
1668
+ list(tenantId: string, name: string, limit: number): Effect.Effect<ReadonlyArray<RoomDirectoryListing>, RoomDirectoryError>;
1669
+ setListing(hostId: string, roomId: string, tenantId: string, epoch: number, listing: {
1670
+ readonly metadata: Readonly<Record<string, unknown>>;
1671
+ readonly locked: boolean;
1672
+ readonly private: boolean;
1673
+ }): Effect.Effect<void, RoomDirectoryError>;
1674
+ }>;
1675
+
1676
+ export declare const roomDirectoryPortFixture: {
1677
+ kind: "port";
1678
+ tag: Context.Service<RoomDirectoryPort, {
1679
+ register(input: RoomHostRegistration): Effect.Effect< RoomHostListing, RoomDirectoryError>;
1680
+ heartbeat(hostId: string, load: RoomHostRegistration["load"]): Effect.Effect<void, RoomDirectoryError>;
1681
+ setReady(hostId: string, ready: boolean): Effect.Effect<void, RoomDirectoryError>;
1682
+ hosts(region: string, pool?: string): Effect.Effect<ReadonlyArray< RoomHostListing>, RoomDirectoryError>;
1683
+ observeOwnership(roomId: string, tenantId: string): Effect.Effect< RoomOwnershipObservation | null, RoomDirectoryError>;
1684
+ selectHost(region: string, routing?: RoomHostRouting): Effect.Effect< RoomHostListing, RoomDirectoryError>;
1685
+ createOwnedRoom(hostId: string, input: RoomCreation): Effect.Effect< RoomDirectoryListing, RoomDirectoryError>;
1686
+ abandonCreation(hostId: string, roomId: string, tenantId: string): Effect.Effect<void, RoomDirectoryError>;
1687
+ unregister(hostId: string): Effect.Effect<void, RoomDirectoryError>;
1688
+ list(tenantId: string, name: string, limit: number): Effect.Effect<ReadonlyArray< RoomDirectoryListing>, RoomDirectoryError>;
1689
+ setListing(hostId: string, roomId: string, tenantId: string, epoch: number, listing: {
1690
+ readonly metadata: Readonly<Record<string, unknown>>;
1691
+ readonly locked: boolean;
1692
+ readonly private: boolean;
1693
+ }): Effect.Effect<void, RoomDirectoryError>;
1694
+ }>;
1695
+ fakeLayer: Layer.Layer<RoomDirectoryPort, never, never>;
1696
+ probe: {
1697
+ run: () => Effect.Effect<string, never, never>;
1698
+ expected: string;
1699
+ };
1700
+ };
1701
+
1702
+ /** Exact last committed boundary supplied by the quiesced local owner. No client RPC. */
1703
+ declare type RoomDrainHandoff = RoomDrainRoom & ({
1704
+ readonly mode: 'state-sync';
1705
+ readonly revision: number;
1706
+ } | {
1707
+ readonly mode: 'lockstep';
1708
+ readonly admissionDigest: string;
1709
+ readonly journalDigest: string | null;
1710
+ });
1711
+
1712
+ declare interface RoomDrainReceipt {
1713
+ readonly hostId: string;
1714
+ readonly roomId: string;
1715
+ readonly tenantId: string;
1716
+ readonly epoch: number;
1717
+ readonly state: 'orphaned';
1718
+ readonly tick: number;
1719
+ }
1720
+
1721
+ declare interface RoomDrainRoom {
1722
+ readonly roomId: string;
1723
+ readonly tenantId: string;
1724
+ readonly epoch: number;
1725
+ readonly tick: number;
1726
+ }
1727
+
1728
+ export declare const roomErasureFakeLayer: Layer.Layer<RoomErasurePort>;
1729
+
1730
+ export declare type RoomErasureFixtureOverrides = Partial<Context.Service.Shape<typeof RoomErasurePort>>;
1731
+
1732
+ declare interface RoomErasureInput {
1733
+ readonly roomId: string;
1734
+ readonly tenantId: string;
1735
+ /** The caller retains this identity across uncertain outcomes and restart. */
1736
+ readonly requestId: string;
1737
+ }
1738
+
1739
+ /** Whole selected room, not a subject-selection/export policy. */
1740
+ declare class RoomErasurePort extends RoomErasurePort_base {
1741
+ }
1742
+
1743
+ declare const RoomErasurePort_base: Context.ServiceClass<RoomErasurePort, "@voltro/RoomErasurePort", {
1744
+ erase(input: RoomErasureInput): Effect.Effect<void, ProtocolError>;
1745
+ }>;
1746
+
1747
+ export declare const roomErasurePortFixture: {
1748
+ kind: "port";
1749
+ tag: typeof RoomErasurePort;
1750
+ fakeLayer: Layer.Layer<RoomErasurePort, never, never>;
1751
+ probe: {
1752
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
1753
+ expected: string;
1754
+ };
1755
+ };
1756
+
1757
+ declare interface RoomExtension<S, I> {
1758
+ readonly name: string;
1759
+ readonly fields: ReadonlyArray<Extract<keyof S, string>>;
1760
+ readonly channel: string;
1761
+ readonly tickBudgetMs: number;
1762
+ readonly beforeTick?: RoomSyncHook<RoomExtensionContext<S, I>>;
1763
+ readonly afterTick?: RoomSyncHook<RoomExtensionContext<S, I>>;
1764
+ }
1765
+
1766
+ declare interface RoomExtensionContext<S, I> {
1767
+ /** Prepared native CPU queries only, installed before actor lifecycle. */
1768
+ readonly geometry?: GeometryWorldView | undefined;
1769
+ readonly state: RoomState<Partial<S>>;
1770
+ readonly tick: number;
1771
+ readonly dt: number;
1772
+ readonly inputs: ReadonlyArray<Omit<RoomInput<I>, 'client'> & {
1773
+ readonly client: Pick<RoomClient, 'sessionId' | 'subjectId' | 'tenantId' | 'isBot' | 'countsAsPlayer' | 'attributes'>;
1774
+ }>;
1775
+ readonly clock: RoomClock;
1776
+ send(sessionId: string, payload: unknown): void;
1777
+ }
1778
+
1779
+ export declare const roomExternalWorkWithdrawalFakeLayer: Layer.Layer<RoomExternalWorkWithdrawalPort>;
1780
+
1781
+ export declare type RoomExternalWorkWithdrawalFixtureOverrides = Partial<Context.Service.Shape<typeof RoomExternalWorkWithdrawalPort>>;
1782
+
1783
+ /** App-owned work spawned by room commands needs its own durable withdrawal.
1784
+ * A dispatch ACK or actor shutdown does not establish that this work ended. */
1785
+ declare class RoomExternalWorkWithdrawalPort extends RoomExternalWorkWithdrawalPort_base {
1786
+ }
1787
+
1788
+ declare const RoomExternalWorkWithdrawalPort_base: Context.ServiceClass<RoomExternalWorkWithdrawalPort, "@voltro/RoomExternalWorkWithdrawalPort", {
1789
+ withdraw(input: RoomHostWithdrawalInput & {
1790
+ readonly requestId: string;
1791
+ }): Effect.Effect<void, ProtocolError>;
1792
+ }>;
1793
+
1794
+ export declare const roomExternalWorkWithdrawalPortFixture: {
1795
+ kind: "port";
1796
+ tag: typeof RoomExternalWorkWithdrawalPort;
1797
+ fakeLayer: Layer.Layer<RoomExternalWorkWithdrawalPort, never, never>;
1798
+ probe: {
1799
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
1800
+ expected: string;
1801
+ };
1802
+ };
1803
+
1804
+ declare class RoomForbidden extends RoomForbidden_base {
1805
+ }
1806
+
1807
+ declare const RoomForbidden_base: Schema.Class<RoomForbidden, Schema.TaggedStruct<"RoomForbidden", {
1808
+ readonly roomId: Schema.String;
1809
+ }>, YieldableError>;
1810
+
1811
+ declare type RoomFrame = RoomWorldHandoffFrame | {
1812
+ readonly kind: 'Hello';
1813
+ readonly protocolVersion: number;
1814
+ readonly token: Uint8Array;
1815
+ readonly schemaHash: number;
1816
+ readonly resumeFromTick?: number;
1817
+ readonly transportCaps: number;
1818
+ } | {
1819
+ readonly kind: 'Input';
1820
+ readonly firstSeq: number;
1821
+ readonly inputs: ReadonlyArray<{
1822
+ readonly tickHint: number;
1823
+ readonly payload: Uint8Array;
1824
+ }>;
1825
+ readonly ackTick?: number;
1826
+ }
1827
+ /** `lossPermille`: the client's estimated loss of state datagrams (0–1000), once it has one. */
1828
+ | {
1829
+ readonly kind: 'Ack';
1830
+ readonly tick: number;
1831
+ readonly lossPermille?: number;
1832
+ } | {
1833
+ readonly kind: 'Ping';
1834
+ readonly clientTimeMs: number;
1835
+ } | {
1836
+ readonly kind: 'ClientMessage' | 'ServerMessage';
1837
+ readonly channelId: number;
1838
+ readonly payload: Uint8Array;
1839
+ } | {
1840
+ readonly kind: 'Leave';
1841
+ readonly reason: number;
1842
+ } | {
1843
+ readonly kind: 'Welcome';
1844
+ readonly sessionId: string;
1845
+ readonly tick: number;
1846
+ readonly serverTimeMs: number;
1847
+ readonly epoch: number;
1848
+ readonly baseline: Uint8Array;
1849
+ readonly transformRules: Uint8Array;
1850
+ } | {
1851
+ readonly kind: 'Delta';
1852
+ readonly tick: number;
1853
+ readonly baseTick: number;
1854
+ readonly patch: Uint8Array;
1855
+ readonly inputAck?: RoomFrameInputReceipt;
1856
+ } | {
1857
+ readonly kind: 'Full';
1858
+ readonly tick: number;
1859
+ readonly epoch: number;
1860
+ readonly baseline: Uint8Array;
1861
+ readonly inputAck?: RoomFrameInputReceipt;
1862
+ } | {
1863
+ readonly kind: 'InputAck';
1864
+ readonly lastAppliedSeq: number;
1865
+ readonly tick: number;
1866
+ readonly flags: number;
1867
+ }
1868
+ /** `deltaDatagramsSent`: state deltas this Session sent as datagrams so far, for the client's loss estimate. */
1869
+ | {
1870
+ readonly kind: 'Pong';
1871
+ readonly clientTimeMs: number;
1872
+ readonly serverTimeMs: number;
1873
+ readonly tick: number;
1874
+ readonly deltaDatagramsSent?: number;
1875
+ } | {
1876
+ readonly kind: 'Kick';
1877
+ readonly code: number;
1878
+ readonly reason: string;
1879
+ } | {
1880
+ readonly kind: 'Migrate';
1881
+ readonly address?: string;
1882
+ readonly graceMs: number;
1883
+ } | {
1884
+ readonly kind: 'Error';
1885
+ readonly code: number;
1886
+ readonly detail: string;
1887
+ } | {
1888
+ readonly kind: 'LsInput';
1889
+ readonly firstTick: number;
1890
+ readonly inputs: ReadonlyArray<Uint8Array>;
1891
+ } | {
1892
+ readonly kind: 'LsInputs';
1893
+ readonly firstTick: number;
1894
+ readonly matrices: ReadonlyArray<RoomLockstepInputMatrix>;
1895
+ } | {
1896
+ readonly kind: 'LsHash';
1897
+ readonly tick: number;
1898
+ readonly hi: number;
1899
+ readonly lo: number;
1900
+ } | {
1901
+ readonly kind: 'LsDesync';
1902
+ readonly tick: number;
1903
+ readonly action: 'resync';
1904
+ readonly snapshot: Uint8Array;
1905
+ } | {
1906
+ readonly kind: 'LsDesync';
1907
+ readonly tick: number;
1908
+ readonly action: 'end' | 'flag';
1909
+ readonly snapshot?: never;
1910
+ } | {
1911
+ readonly kind: 'LsStart';
1912
+ readonly startTick: number;
1913
+ readonly seed: number;
1914
+ readonly options: Uint8Array;
1915
+ readonly serverTimeMs: number;
1916
+ readonly localPlayerId: number;
1917
+ readonly roster: ReadonlyArray<RoomLockstepWirePlayer>;
1918
+ readonly history?: Uint8Array;
1919
+ readonly snapshot?: Uint8Array;
1920
+ } | {
1921
+ readonly kind: 'LsStall';
1922
+ readonly waitingFor: RoomLockstepPlayerMask;
1923
+ }
1924
+ /** A player admitted after Start: from `tick` on, every matrix carries its `slot`. */
1925
+ | {
1926
+ readonly kind: 'LsJoin';
1927
+ readonly tick: number;
1928
+ readonly slot: number;
1929
+ readonly playerId: number;
1930
+ };
1931
+
1932
+ declare interface RoomFrameInputReceipt {
1933
+ readonly lastAppliedSeq: number;
1934
+ readonly flags: number;
1935
+ }
1936
+
1937
+ declare class RoomFull extends RoomFull_base {
1938
+ }
1939
+
1940
+ declare const RoomFull_base: Schema.Class<RoomFull, Schema.TaggedStruct<"RoomFull", {
1941
+ readonly roomId: Schema.String;
1942
+ }>, YieldableError>;
1943
+
1944
+ export declare const roomGeometryAdministrationFakeLayer: Layer.Layer<RoomGeometryAdministrationPort, never, never>;
1945
+
1946
+ /** API administration resolves actual current SQL Host; wire inputs never select it. */
1947
+ declare class RoomGeometryAdministrationPort extends RoomGeometryAdministrationPort_base {
1948
+ }
1949
+
1950
+ declare const RoomGeometryAdministrationPort_base: Context.ServiceClass<RoomGeometryAdministrationPort, "@voltro/RoomGeometryAdministrationPort", {
1951
+ reload(roomId: string, request: RoomGeometryReloadRequest, subject: Subject): Effect.Effect<void, GeometryPersistenceError>;
1952
+ rollback(roomId: string, request: RoomGeometryRollbackRequest, subject: Subject): Effect.Effect<void, GeometryPersistenceError>;
1953
+ /** The chunk view: present when the administration knows the Worlds. */
1954
+ readonly chunks?: (roomId: string, subject: Subject) => Effect.Effect<RoomGeometryChunks, GeometryPersistenceError>;
1955
+ }>;
1956
+
1957
+ export declare const roomGeometryAdministrationPortFixture: {
1958
+ kind: "port";
1959
+ tag: typeof RoomGeometryAdministrationPort;
1960
+ fakeLayer: Layer.Layer<RoomGeometryAdministrationPort, never, never>;
1961
+ probe: {
1962
+ run: () => Effect.Effect<"ProtocolError" | "BudgetExceeded" | "unexpectedSuccess", never, never>;
1963
+ expected: string;
1964
+ };
1965
+ };
1966
+
1967
+ /** The changed chunks a World cell Room owns, newest first. `truncated` when more exist than the read returns. */
1968
+ declare interface RoomGeometryChunks {
1969
+ readonly roomId: string;
1970
+ readonly worldId: string;
1971
+ readonly zoneId: string;
1972
+ readonly cellId: string;
1973
+ readonly chunks: ReadonlyArray<RoomGeometryChunkState>;
1974
+ readonly truncated: boolean;
1975
+ }
1976
+
1977
+ /** One chunk a World cell Room owns that players changed: its durable revision and whether it
1978
+ * still differs from its static version (`changed: false` after a reset). */
1979
+ declare interface RoomGeometryChunkState {
1980
+ readonly cx: number;
1981
+ readonly cy: number;
1982
+ readonly cz?: number | undefined;
1983
+ readonly layerSetId: string;
1984
+ readonly version: string;
1985
+ readonly revision: number;
1986
+ readonly changed: boolean;
1987
+ readonly updatedAt: number;
1988
+ }
1989
+
1990
+ export declare const roomGeometryControlFakeLayer: Layer.Layer<RoomGeometryControlPort, never, never>;
1991
+
1992
+ /** Existing authenticated API-to-Host carrier. Caller authority must be
1993
+ * resolved again at the actual Host; success joins native CPU admission and
1994
+ * retained cleanup, never merely receipt publication. No player state input. */
1995
+ declare class RoomGeometryControlPort extends RoomGeometryControlPort_base {
1996
+ }
1997
+
1998
+ declare const RoomGeometryControlPort_base: Context.ServiceClass<RoomGeometryControlPort, "@voltro/RoomGeometryControlPort", {
1999
+ reload(hostId: string, roomId: string, request: RoomGeometryReloadRequest, subject: Subject): Effect.Effect<void, RoomControlError>;
2000
+ rollback(hostId: string, roomId: string, request: RoomGeometryRollbackRequest, subject: Subject): Effect.Effect<void, RoomControlError>;
2001
+ }>;
2002
+
2003
+ /** Same actual Tag/fail-closed replacement, not complete-system acceptance. */
2004
+ export declare const roomGeometryControlPortFixture: {
2005
+ kind: "port";
2006
+ tag: typeof RoomGeometryControlPort;
2007
+ fakeLayer: Layer.Layer<RoomGeometryControlPort, never, never>;
2008
+ probe: {
2009
+ run: () => Effect.Effect<"RoomAuthoringError" | "ProtocolError" | "RoomsClosed" | "RoomFull" | "RoomPoolWaking" | "RoomLocked" | "RoomGone" | "RoomForbidden" | "SeatExpired" | "NotRoomMember" | "BudgetExceeded" | "unexpectedSuccess", never, never>;
2010
+ expected: string;
2011
+ };
2012
+ };
2013
+
2014
+ declare interface RoomGeometryReloadRequest {
2015
+ readonly version: string;
2016
+ readonly requestId: string;
2017
+ }
2018
+
2019
+ /** Administrative intention only. World/version/owner/authority/baseline/patch
2020
+ * are resolved by the actual Host/source, never accepted as client state. */
2021
+ declare interface RoomGeometryRollbackRequest {
2022
+ readonly cx: number;
2023
+ readonly cy: number;
2024
+ readonly cz?: number | undefined;
2025
+ /** The actor whose changes are undone; `null` undoes every actor's changes (chunk reset to its static baseline). */
2026
+ readonly target: GeometryPersistenceSubject | null;
2027
+ readonly requestId: string;
2028
+ }
2029
+
2030
+ declare class RoomGone extends RoomGone_base {
2031
+ }
2032
+
2033
+ declare const RoomGone_base: Schema.Class<RoomGone, Schema.TaggedStruct<"RoomGone", {
2034
+ readonly roomId: Schema.String;
2035
+ }>, YieldableError>;
2036
+
2037
+ /** Durable work/capacity is still owned; this is backpressure, not completion. */
2038
+ declare class RoomHibernatePending extends RoomHibernatePending_base {
2039
+ }
2040
+
2041
+ declare const RoomHibernatePending_base: Schema.Class<RoomHibernatePending, Schema.TaggedStruct<"RoomHibernatePending", {
2042
+ readonly roomId: Schema.String;
2043
+ }>, YieldableError>;
2044
+
2045
+ export declare const roomHostAdoptionFakeLayer: Layer.Layer<RoomHostAdoptionPort, never, never>;
2046
+
2047
+ declare class RoomHostAdoptionPort extends RoomHostAdoptionPort_base {
2048
+ }
2049
+
2050
+ declare const RoomHostAdoptionPort_base: Context.ServiceClass<RoomHostAdoptionPort, "@voltro/RoomHostAdoptionPort", {
2051
+ adopt(hostId: string, roomId: string, tenantId: string, priorEpoch: number): Effect.Effect<void, ProtocolError>;
2052
+ }>;
2053
+
2054
+ export declare const roomHostAdoptionPortFixture: {
2055
+ kind: "port";
2056
+ tag: Context.Service<RoomHostAdoptionPort, {
2057
+ adopt(hostId: string, roomId: string, tenantId: string, priorEpoch: number): Effect.Effect<void, ProtocolError>;
2058
+ }>;
2059
+ fakeLayer: Layer.Layer<RoomHostAdoptionPort, never, never>;
2060
+ probe: {
2061
+ run: () => Effect.Effect<string, never, never>;
2062
+ expected: string;
2063
+ };
2064
+ };
2065
+
2066
+ export declare const roomHostControlFakeLayer: Layer.Layer<RoomHostControlPort, never, never>;
2067
+
2068
+ export declare type RoomHostControlFixtureOverrides = Partial<Context.Service.Shape<typeof RoomHostControlPort>>;
2069
+
2070
+ /** API-to-host transport seam. The target executes on its existing controller;
2071
+ * resolved Subjects are trusted server inputs, never player-supplied authority. */
2072
+ declare class RoomHostControlPort extends RoomHostControlPort_base {
2073
+ }
2074
+
2075
+ declare const RoomHostControlPort_base: Context.ServiceClass<RoomHostControlPort, "@voltro/RoomHostControlPort", {
2076
+ /** `attributes`: app data the API resolved for this seat; the Host signs it into the seat. */
2077
+ reserve(hostId: string, input: ReserveRoomInput, subject: Subject, attributes?: RoomSeatAttributes): Effect.Effect<RoomReservation, RoomControlError>;
2078
+ resume(hostId: string, sessionId: string, subject: Subject, attributes?: RoomSeatAttributes): Effect.Effect<RoomReservation, RoomControlError>;
2079
+ leave(hostId: string, sessionId: string, token: Uint8Array, subject: Subject): Effect.Effect<{
2080
+ readonly ok: true;
2081
+ }, RoomControlError>;
2082
+ }>;
2083
+
2084
+ export declare const roomHostControlPortFixture: {
2085
+ kind: "port";
2086
+ tag: Context.Service<RoomHostControlPort, {
2087
+ reserve(hostId: string, input: ReserveRoomInput, subject: Subject, attributes?: RoomSeatAttributes): Effect.Effect< RoomReservation, RoomControlError>;
2088
+ resume(hostId: string, sessionId: string, subject: Subject, attributes?: RoomSeatAttributes): Effect.Effect< RoomReservation, RoomControlError>;
2089
+ leave(hostId: string, sessionId: string, token: Uint8Array, subject: Subject): Effect.Effect<{
2090
+ readonly ok: true;
2091
+ }, RoomControlError>;
2092
+ }>;
2093
+ fakeLayer: Layer.Layer<RoomHostControlPort, never, never>;
2094
+ probe: {
2095
+ run: () => Effect.Effect<string, never, never>;
2096
+ expected: string;
2097
+ };
2098
+ };
2099
+
2100
+ declare type RoomHostDrainError = ProtocolError | BudgetExceeded | RoomForbidden | RoomGone;
2101
+
2102
+ export declare const roomHostDrainFakeLayer: Layer.Layer<RoomHostDrainPort, never, never>;
2103
+
2104
+ export declare type RoomHostDrainFixtureOverrides = Partial<Context.Service.Shape<typeof RoomHostDrainPort>>;
2105
+
2106
+ declare class RoomHostDrainPort extends RoomHostDrainPort_base {
2107
+ }
2108
+
2109
+ declare const RoomHostDrainPort_base: Context.ServiceClass<RoomHostDrainPort, "@voltro/RoomHostDrainPort", {
2110
+ /** Irreversibly fences new SQL routing for this exact registered process. */
2111
+ begin(): Effect.Effect<void, RoomHostDrainError>;
2112
+ /** Requires the caller to have stopped simulation/session mutation first.
2113
+ * This only commits SQL handoff; it neither stops the actor nor migrates clients. */
2114
+ handoff(input: RoomDrainHandoff): Effect.Effect<RoomDrainReceipt, RoomHostDrainError>;
2115
+ }>;
2116
+
2117
+ export declare const roomHostDrainPortFixture: {
2118
+ kind: "port";
2119
+ tag: typeof RoomHostDrainPort;
2120
+ fakeLayer: Layer.Layer<RoomHostDrainPort, never, never>;
2121
+ probe: {
2122
+ run: () => Effect.Effect<("ProtocolError" | "RoomGone" | "RoomForbidden" | "BudgetExceeded" | "unexpected-success")[], never, never>;
2123
+ expected: string[];
2124
+ };
2125
+ };
2126
+
2127
+ export declare const roomHostKickFakeLayer: Layer.Layer<RoomHostKickPort>;
2128
+
2129
+ export declare type RoomHostKickFixtureOverrides = Partial<Context.Service.Shape<typeof RoomHostKickPort>>;
2130
+
2131
+ /** API-to-host operator kick on the owning Host's existing controller. */
2132
+ declare class RoomHostKickPort extends RoomHostKickPort_base {
2133
+ }
2134
+
2135
+ declare const RoomHostKickPort_base: Context.ServiceClass<RoomHostKickPort, "@voltro/RoomHostKickPort", {
2136
+ kick(hostId: string, input: RoomKickInput): Effect.Effect<RoomKickReceipt, RoomControlError>;
2137
+ close(hostId: string, input: RoomCloseInput): Effect.Effect<RoomKickReceipt, RoomControlError>;
2138
+ }>;
2139
+
2140
+ export declare const roomHostKickPortFixture: {
2141
+ kind: "port";
2142
+ tag: typeof RoomHostKickPort;
2143
+ fakeLayer: Layer.Layer<RoomHostKickPort, never, never>;
2144
+ probe: {
2145
+ run: () => Effect.Effect<"RoomAuthoringError" | "ProtocolError" | "RoomsClosed" | "RoomFull" | "RoomPoolWaking" | "RoomLocked" | "RoomGone" | "RoomForbidden" | "SeatExpired" | "NotRoomMember" | "BudgetExceeded" | "unexpected-success", never, never>;
2146
+ expected: string;
2147
+ };
2148
+ };
2149
+
2150
+ declare interface RoomHostListing {
2151
+ readonly pool?: string | undefined;
2152
+ readonly clientCapacity?: number | undefined;
2153
+ readonly id: string;
2154
+ readonly address: string;
2155
+ readonly webTransportAddress?: string | undefined;
2156
+ readonly webTransportCertificateHash?: string | undefined;
2157
+ readonly region: string;
2158
+ readonly capacity: number;
2159
+ readonly rooms: number;
2160
+ readonly clients: number;
2161
+ readonly cpu: number;
2162
+ readonly lastHeartbeatAt: number;
2163
+ /** Last registered SQL routing admission, not proof of membership liveness. */
2164
+ readonly ready: boolean;
2165
+ /** Process identity, never a sender-clock liveness deadline. */
2166
+ readonly membership?: {
2167
+ readonly instanceId: string | undefined;
2168
+ readonly startedAt: number;
2169
+ } | undefined;
2170
+ }
2171
+
2172
+ declare interface RoomHostObservation {
2173
+ readonly hostId: string;
2174
+ readonly state: 'observing' | 'presumed-unreachable';
2175
+ readonly sqlSilenceMs: number;
2176
+ readonly membershipSilenceMs: number;
2177
+ }
2178
+
2179
+ declare interface RoomHostRegistration {
2180
+ readonly pool?: string | undefined;
2181
+ readonly clientCapacity?: number | undefined;
2182
+ readonly address: string;
2183
+ readonly webTransportAddress?: string | undefined;
2184
+ readonly webTransportCertificateHash?: string | undefined;
2185
+ readonly region: string;
2186
+ readonly capacity: number;
2187
+ readonly load: {
2188
+ readonly rooms: number;
2189
+ readonly clients: number;
2190
+ readonly cpu: number;
2191
+ };
2192
+ readonly ready?: boolean;
2193
+ readonly membership?: {
2194
+ readonly instanceId: string | undefined;
2195
+ readonly startedAt: number;
2196
+ } | undefined;
2197
+ }
2198
+
2199
+ declare interface RoomHostRouting {
2200
+ readonly name: string;
2201
+ readonly tenantId: string;
2202
+ readonly pool?: string | undefined;
2203
+ }
2204
+
2205
+ export declare const roomHostWithdrawalFakeLayer: Layer.Layer<RoomHostWithdrawalPort>;
2206
+
2207
+ export declare type RoomHostWithdrawalFixtureOverrides = Partial<Context.Service.Shape<typeof RoomHostWithdrawalPort>>;
2208
+
2209
+ declare type RoomHostWithdrawalInput = typeof RoomHostWithdrawalInputSchema.Type;
2210
+
2211
+ /** Trusted outside-tick withdrawal, never player-supplied state or authority. */
2212
+ declare const RoomHostWithdrawalInputSchema: Schema.Struct<{
2213
+ readonly roomId: Schema.String;
2214
+ readonly tenantId: Schema.String;
2215
+ readonly priorEpoch: Schema.Int;
2216
+ readonly withdrawnEpoch: Schema.Int;
2217
+ }>;
2218
+
2219
+ /** Trusted coordinator waits for the exact former owner's local actor/session/
2220
+ * command lane after a newer SQL withdrawal. No player RPC mounts this port. */
2221
+ declare class RoomHostWithdrawalPort extends RoomHostWithdrawalPort_base {
2222
+ }
2223
+
2224
+ declare const RoomHostWithdrawalPort_base: Context.ServiceClass<RoomHostWithdrawalPort, "@voltro/RoomHostWithdrawalPort", {
2225
+ withdraw(hostId: string, input: RoomHostWithdrawalInput): Effect.Effect<void, ProtocolError>;
2226
+ }>;
2227
+
2228
+ export declare const roomHostWithdrawalPortFixture: {
2229
+ kind: "port";
2230
+ tag: typeof RoomHostWithdrawalPort;
2231
+ fakeLayer: Layer.Layer<RoomHostWithdrawalPort, never, never>;
2232
+ probe: {
2233
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
2234
+ expected: string;
2235
+ };
2236
+ };
2237
+
2238
+ declare interface RoomInput<I> {
2239
+ readonly client: RoomClient;
2240
+ readonly seq: number;
2241
+ readonly tickHint: number;
2242
+ readonly input: I;
2243
+ }
2244
+
2245
+ /** Captured outside the tick and stored with the exact state it describes. */
2246
+ declare interface RoomInputReceipt {
2247
+ readonly sessionId: string;
2248
+ readonly subjectId: string | null;
2249
+ readonly lastAppliedSeq: number;
2250
+ /** Intentionally discarded pending World input; never an applied ACK. */
2251
+ readonly discardedThrough?: number;
2252
+ }
2253
+
2254
+ declare interface RoomInputRedundancyOptions {
2255
+ /** Input count is a redundancy budget, never a delivery guarantee. */
2256
+ readonly inputRedundancy: number;
2257
+ readonly maxInputHistoryBytes: number;
2258
+ }
2259
+
2260
+ declare interface RoomKickInput {
2261
+ readonly tenantId: string;
2262
+ readonly roomId: string;
2263
+ readonly subjectId: string;
2264
+ readonly reason: string;
2265
+ }
2266
+
2267
+ declare interface RoomKickReceipt {
2268
+ readonly kicked: number;
2269
+ }
2270
+
2271
+ declare type RoomLeaveReason = 'left' | 'kicked' | 'reconnecting' | 'timeout' | 'disposed';
2272
+
2273
+ /** Lifecycle Effects are run by the host outside the synchronous tick. `void` admits block bodies;
2274
+ * a returned Promise is refused at runtime with an authoring error. */
2275
+ declare type RoomLifecycleHook<C> = (context: C) => void | Effect.Effect<void, unknown>;
2276
+
2277
+ /** A Room's own listing; scalar metadata only, at most 16 keys and 2 KiB. */
2278
+ declare interface RoomListing {
2279
+ readonly metadata?: Readonly<Record<string, RoomScalar>>;
2280
+ readonly private?: boolean;
2281
+ readonly locked?: boolean;
2282
+ }
2283
+
2284
+ declare interface RoomListingContext<S, O> {
2285
+ readonly state: S;
2286
+ readonly options: O;
2287
+ }
2288
+
2289
+ declare class RoomLocked extends RoomLocked_base {
2290
+ }
2291
+
2292
+ declare const RoomLocked_base: Schema.Class<RoomLocked, Schema.TaggedStruct<"RoomLocked", {
2293
+ readonly roomId: Schema.String;
2294
+ }>, YieldableError>;
2295
+
2296
+ declare interface RoomLockstepAdmission {
2297
+ readonly version: 1;
2298
+ readonly roomId: string;
2299
+ readonly tenantId: string;
2300
+ readonly ownerEpoch: number;
2301
+ readonly hostId: string;
2302
+ readonly initial: {
2303
+ readonly requestId: string;
2304
+ readonly creatorSubjectId: string;
2305
+ readonly name: string;
2306
+ readonly seed: number;
2307
+ readonly options: string;
2308
+ readonly stateSchemaHash: number;
2309
+ readonly inputSchemaHash: number;
2310
+ };
2311
+ readonly adoption: {
2312
+ readonly requestId: string;
2313
+ readonly priorEpoch: number;
2314
+ } | null;
2315
+ readonly digest: string;
2316
+ }
2317
+
2318
+ export declare const roomLockstepAdmissionFakeLayer: Layer.Layer<RoomLockstepAdmissionPort>;
2319
+
2320
+ export declare type RoomLockstepAdmissionFixtureOverrides = Partial<Context.Service.Shape<typeof RoomLockstepAdmissionPort>>;
2321
+
2322
+ /** Trusted complete outside-tick SQL creation capability, never a player state RPC. */
2323
+ declare class RoomLockstepAdmissionPort extends RoomLockstepAdmissionPort_base {
2324
+ }
2325
+
2326
+ declare const RoomLockstepAdmissionPort_base: Context.ServiceClass<RoomLockstepAdmissionPort, "@voltro/RoomLockstepAdmissionPort", {
2327
+ prepare(input: RoomLockstepCreation): Effect.Effect<RoomLockstepAdmission, ProtocolError>;
2328
+ publish(scope: RoomLockstepRosterScope): Effect.Effect<RoomLockstepAdmission, ProtocolError>;
2329
+ load(scope: RoomLockstepRosterScope): Effect.Effect<RoomLockstepAdmission | null, ProtocolError>;
2330
+ adopt(scope: RoomLockstepRosterScope, priorEpoch: number, requestId: string): Effect.Effect<RoomLockstepAdmission, ProtocolError>;
2331
+ exportSubject(scope: RoomLockstepRosterScope, subjectId: string): Effect.Effect<RoomLockstepCreationExport | null, ProtocolError>;
2332
+ erase(scope: RoomLockstepRosterScope, requestId: string): Effect.Effect<void, ProtocolError>;
2333
+ }>;
2334
+
2335
+ export declare const roomLockstepAdmissionPortFixture: {
2336
+ kind: "port";
2337
+ tag: typeof RoomLockstepAdmissionPort;
2338
+ fakeLayer: Layer.Layer<RoomLockstepAdmissionPort, never, never>;
2339
+ probe: {
2340
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
2341
+ expected: string;
2342
+ };
2343
+ };
2344
+
2345
+ declare interface RoomLockstepCreation extends RoomLockstepRosterScope {
2346
+ readonly requestId: string;
2347
+ readonly creatorSubjectId: string;
2348
+ readonly seed: number;
2349
+ readonly options: unknown;
2350
+ }
2351
+
2352
+ declare interface RoomLockstepCreationExport {
2353
+ readonly roomId: string;
2354
+ readonly name: string;
2355
+ readonly requestId: string;
2356
+ readonly seed: number;
2357
+ readonly stateSchemaHash: number;
2358
+ readonly inputSchemaHash: number;
2359
+ }
2360
+
2361
+ declare interface RoomLockstepInitialPlayerContext extends RoomLockstepInitialRosterContext {
2362
+ /** Server-private current admitted identity, never projected to the roster wire. */
2363
+ readonly subjectId: string;
2364
+ readonly sessionId: string;
2365
+ }
2366
+
2367
+ declare interface RoomLockstepInitialRosterContext extends RoomLockstepRosterScope {
2368
+ readonly maxPlayers: number;
2369
+ readonly players: ReadonlyArray<RoomLockstepRosterPlayer>;
2370
+ }
2371
+
2372
+ declare interface RoomLockstepInputMatrix {
2373
+ readonly players: RoomLockstepPlayerMask;
2374
+ readonly inputs: ReadonlyArray<Uint8Array>;
2375
+ }
2376
+
2377
+ declare interface RoomLockstepJournal {
2378
+ /** 1: Start roster only. 2: adds `joins`; every tick's matrix covers the roster at that tick. */
2379
+ readonly version: 1 | 2;
2380
+ readonly roomId: string;
2381
+ readonly tenantId: string;
2382
+ readonly ownerEpoch: number;
2383
+ readonly hostId: string;
2384
+ readonly initial: {
2385
+ readonly requestId: string;
2386
+ readonly seed: number;
2387
+ readonly options: string;
2388
+ readonly stateSchemaHash: number;
2389
+ readonly inputSchemaHash: number;
2390
+ readonly players: ReadonlyArray<{
2391
+ readonly slot: number;
2392
+ readonly playerId: number;
2393
+ readonly subjectId: string;
2394
+ readonly sessionId: string;
2395
+ }>;
2396
+ };
2397
+ readonly adoption: {
2398
+ readonly requestId: string;
2399
+ readonly priorEpoch: number;
2400
+ } | null;
2401
+ readonly ticks: ReadonlyArray<{
2402
+ readonly tick: number;
2403
+ readonly requestId: string;
2404
+ readonly inputs: ReadonlyArray<string>;
2405
+ }>;
2406
+ readonly joins?: ReadonlyArray<RoomLockstepJournalJoin>;
2407
+ readonly digest: string;
2408
+ }
2409
+
2410
+ declare interface RoomLockstepJournalAppend extends RoomLockstepRosterScope {
2411
+ readonly requestId: string;
2412
+ readonly tick: number;
2413
+ readonly inputs: ReadonlyArray<Uint8Array>;
2414
+ }
2415
+
2416
+ export declare const roomLockstepJournalFakeLayer: Layer.Layer<RoomLockstepJournalPort>;
2417
+
2418
+ export declare type RoomLockstepJournalFixtureOverrides = Partial<Context.Service.Shape<typeof RoomLockstepJournalPort>>;
2419
+
2420
+ /** A player admitted after Start (late join), effective from `tick`. Version 2 journals only. */
2421
+ declare interface RoomLockstepJournalJoin {
2422
+ readonly tick: number;
2423
+ readonly requestId: string;
2424
+ readonly slot: number;
2425
+ readonly playerId: number;
2426
+ readonly subjectId: string;
2427
+ readonly sessionId: string;
2428
+ }
2429
+
2430
+ /** Admit a player after Start, effective from `tick` (ahead of every committed matrix). */
2431
+ declare interface RoomLockstepJournalJoinInput extends RoomLockstepRosterScope {
2432
+ readonly requestId: string;
2433
+ readonly tick: number;
2434
+ readonly player: RoomLockstepJournalPlayer;
2435
+ }
2436
+
2437
+ declare interface RoomLockstepJournalPlayer {
2438
+ readonly slot: number;
2439
+ readonly playerId: number;
2440
+ readonly actualSession: unknown;
2441
+ }
2442
+
2443
+ /** Trusted server capability, not a player RPC or inspection authority. */
2444
+ declare class RoomLockstepJournalPort extends RoomLockstepJournalPort_base {
2445
+ }
2446
+
2447
+ declare const RoomLockstepJournalPort_base: Context.ServiceClass<RoomLockstepJournalPort, "@voltro/RoomLockstepJournalPort", {
2448
+ initialize(input: RoomLockstepJournalStart): Effect.Effect<RoomLockstepJournal, ProtocolError>;
2449
+ append(input: RoomLockstepJournalAppend): Effect.Effect<RoomLockstepJournal, ProtocolError>;
2450
+ /** Late join (version-2 journal). Optional: a journal without it refuses late players. */
2451
+ readonly join?: (input: RoomLockstepJournalJoinInput) => Effect.Effect<RoomLockstepJournal, ProtocolError>;
2452
+ load(scope: RoomLockstepRosterScope): Effect.Effect<RoomLockstepJournal | null, ProtocolError>;
2453
+ adopt(scope: RoomLockstepRosterScope, priorEpoch: number, requestId: string): Effect.Effect<RoomLockstepJournal, ProtocolError>;
2454
+ exportSubject(scope: RoomLockstepRosterScope, subjectId: string): Effect.Effect<RoomLockstepJournalSubjectExport, ProtocolError>;
2455
+ erase(scope: RoomLockstepRosterScope, requestId: string): Effect.Effect<void, ProtocolError>;
2456
+ }>;
2457
+
2458
+ export declare const roomLockstepJournalPortFixture: {
2459
+ kind: "port";
2460
+ tag: typeof RoomLockstepJournalPort;
2461
+ fakeLayer: Layer.Layer<RoomLockstepJournalPort, never, never>;
2462
+ probe: {
2463
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
2464
+ expected: string;
2465
+ };
2466
+ };
2467
+
2468
+ declare interface RoomLockstepJournalStart extends RoomLockstepRosterScope {
2469
+ readonly requestId: string;
2470
+ readonly seed: number;
2471
+ readonly options: unknown;
2472
+ readonly players: ReadonlyArray<RoomLockstepJournalPlayer>;
2473
+ }
2474
+
2475
+ declare interface RoomLockstepJournalSubjectExport {
2476
+ readonly roomId: string;
2477
+ readonly inputs: ReadonlyArray<{
2478
+ readonly tick: number;
2479
+ readonly playerId: number;
2480
+ readonly input: unknown;
2481
+ }>;
2482
+ }
2483
+
2484
+ /** Bits identify server-assigned roster slots 0..63, not Subject or player IDs. */
2485
+ declare type RoomLockstepPlayerMask = Uint64Words;
2486
+
2487
+ declare interface RoomLockstepRecoveryTruth {
2488
+ readonly admission: RoomLockstepAdmission;
2489
+ readonly journal: RoomLockstepJournal | null;
2490
+ readonly options: unknown;
2491
+ }
2492
+
2493
+ declare interface RoomLockstepRosterPlayer {
2494
+ readonly slot: number;
2495
+ readonly playerId: number;
2496
+ }
2497
+
2498
+ declare interface RoomLockstepRosterScope {
2499
+ readonly roomId: string;
2500
+ readonly tenantId: string;
2501
+ readonly epoch: number;
2502
+ }
2503
+
2504
+ declare interface RoomLockstepTerminal extends RoomLockstepRosterScope {
2505
+ readonly disposition: 'faulted' | 'disposed';
2506
+ }
2507
+
2508
+ export declare const roomLockstepTerminalFakeLayer: Layer.Layer<RoomLockstepTerminalPort, never, never>;
2509
+
2510
+ export declare type RoomLockstepTerminalFixtureOverrides = Partial<Context.Service.Shape<typeof RoomLockstepTerminalPort>>;
2511
+
2512
+ /** Outside-tick lifecycle commit after actual Session/native withdrawal. Retains
2513
+ * SQL creation and input truth; this is neither a checkpoint nor an erase. */
2514
+ declare class RoomLockstepTerminalPort extends RoomLockstepTerminalPort_base {
2515
+ }
2516
+
2517
+ declare const RoomLockstepTerminalPort_base: Context.ServiceClass<RoomLockstepTerminalPort, "@voltro/RoomLockstepTerminalPort", {
2518
+ terminate(input: RoomLockstepTerminal): Effect.Effect<RoomLockstepTerminalReceipt, ProtocolError>;
2519
+ }>;
2520
+
2521
+ export declare const roomLockstepTerminalPortFixture: {
2522
+ kind: "port";
2523
+ tag: typeof RoomLockstepTerminalPort;
2524
+ fakeLayer: Layer.Layer<RoomLockstepTerminalPort, never, never>;
2525
+ probe: {
2526
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
2527
+ expected: string;
2528
+ };
2529
+ };
2530
+
2531
+ declare interface RoomLockstepTerminalReceipt extends RoomLockstepTerminal {
2532
+ readonly hostId: string;
2533
+ }
2534
+
2535
+ /** Public opaque simulation identities, never Subjects or Session credentials. */
2536
+ declare interface RoomLockstepWirePlayer {
2537
+ readonly slot: number;
2538
+ readonly playerId: number;
2539
+ }
2540
+
2541
+ declare interface RoomMatchPreparation {
2542
+ readonly requestId: string;
2543
+ readonly room: string;
2544
+ readonly options: unknown;
2545
+ readonly pool?: string;
2546
+ }
2547
+
2548
+ declare interface RoomMatchReceipt {
2549
+ readonly roomId: string;
2550
+ readonly epoch: number;
2551
+ }
2552
+
2553
+ declare interface RoomMemberContext<S, O> {
2554
+ /** Prepared native CPU queries only, installed before actor lifecycle. */
2555
+ readonly geometry?: GeometryWorldView | undefined;
2556
+ readonly state: RoomState<S>;
2557
+ readonly options: O;
2558
+ readonly client: RoomClient;
2559
+ readonly app: RoomAppBridge;
2560
+ readonly clock: RoomClock;
2561
+ readonly scheduler: RoomScheduler;
2562
+ /** World Rooms, ordinary player join: the server-owned entity this Session controls and
2563
+ * its last persisted `persistEntity` data. Build the state entity from it when absent. */
2564
+ readonly world?: RoomWorldMember | undefined;
2565
+ }
2566
+
2567
+ declare interface RoomOrphanResult {
2568
+ readonly roomId: string;
2569
+ readonly tenantId: string;
2570
+ readonly epoch: number;
2571
+ readonly state: 'orphaned' | 'disposed';
2572
+ }
2573
+
2574
+ declare interface RoomOutboxCommand {
2575
+ readonly requestId: string;
2576
+ readonly kind: 'publish' | 'run';
2577
+ readonly name: string;
2578
+ readonly payload: unknown;
2579
+ readonly key?: string;
2580
+ }
2581
+
2582
+ /** SQL ownership observation, never a transport or process-liveness assertion. */
2583
+ declare interface RoomOwnershipObservation {
2584
+ readonly roomId: string;
2585
+ readonly tenantId: string;
2586
+ readonly hostId: string | null;
2587
+ readonly epoch: number;
2588
+ readonly state: 'creating' | 'live' | 'orphaned' | 'faulted' | 'disposed' | 'hibernating' | 'hibernated';
2589
+ }
2590
+
2591
+ /** The pool has no host because it scaled to zero; one is starting. Reserve again after `retryAfterMs`. */
2592
+ declare class RoomPoolWaking extends RoomPoolWaking_base {
2593
+ }
2594
+
2595
+ declare const RoomPoolWaking_base: Schema.Class<RoomPoolWaking, Schema.TaggedStruct<"RoomPoolWaking", {
2596
+ readonly pool: Schema.String;
2597
+ readonly retryAfterMs: Schema.Number;
2598
+ }>, YieldableError>;
2599
+
2600
+ declare interface RoomPublicEntry {
2601
+ readonly id: string;
2602
+ readonly name: string;
2603
+ readonly metadata: Readonly<Record<string, unknown>>;
2604
+ readonly clients: number;
2605
+ readonly maxClients: number;
2606
+ readonly locked: boolean;
2607
+ }
2608
+
2609
+ export declare const roomReaperFakeLayer: Layer.Layer<RoomReaperPort, never, never>;
2610
+
2611
+ export declare type RoomReaperFixtureOverrides = Partial<Context.Service.Shape<typeof RoomReaperPort>>;
2612
+
2613
+ declare interface RoomReaperInput {
2614
+ readonly hostId?: string | undefined;
2615
+ readonly afterHostId?: string | undefined;
2616
+ readonly afterRoomId?: string;
2617
+ }
2618
+
2619
+ declare class RoomReaperPort extends RoomReaperPort_base {
2620
+ }
2621
+
2622
+ declare const RoomReaperPort_base: Context.ServiceClass<RoomReaperPort, "@voltro/RoomReaperPort", {
2623
+ run(input: RoomReaperInput): Effect.Effect<RoomReaperReport, ProtocolError | BudgetExceeded>;
2624
+ }>;
2625
+
2626
+ export declare const roomReaperPortFixture: {
2627
+ kind: "port";
2628
+ tag: Context.Service<RoomReaperPort, {
2629
+ run(input: RoomReaperInput): Effect.Effect< RoomReaperReport, ProtocolError | BudgetExceeded>;
2630
+ }>;
2631
+ fakeLayer: Layer.Layer<RoomReaperPort, never, never>;
2632
+ probe: {
2633
+ run: () => Effect.Effect<string, never, never>;
2634
+ expected: string;
2635
+ };
2636
+ };
2637
+
2638
+ declare interface RoomReaperReport {
2639
+ readonly hosts: ReadonlyArray<{
2640
+ readonly hostId: string;
2641
+ readonly state: 'observing' | 'presumed-unreachable' | 'untracked' | 'failed';
2642
+ readonly rooms: ReadonlyArray<RoomReaperRoomResult>;
2643
+ readonly nextAfterRoom: string | null;
2644
+ }>;
2645
+ readonly nextAfterHost: string | null;
2646
+ }
2647
+
2648
+ declare interface RoomReaperRoomResult {
2649
+ readonly roomId: string;
2650
+ readonly tenantId: string;
2651
+ readonly state: 'disposed' | 'adopted' | 'waiting-target' | 'waiting-observation' | 'failed';
2652
+ }
2653
+
2654
+ /** Framework-free binary session core. Reservation, reconnect orchestration and
2655
+ * render hooks are separate; this core never persists a seat token. */
2656
+ declare interface RoomReconciliationSnapshot<S> {
2657
+ readonly epoch: number;
2658
+ readonly tick: number;
2659
+ readonly lastAppliedSeq: number;
2660
+ readonly state: S;
2661
+ }
2662
+
2663
+ export declare const roomReconnectSlotFixture: {
2664
+ kind: "slot";
2665
+ defaultImplementation: (options?: Partial<{
2666
+ readonly graceMs: number;
2667
+ }>) => {
2668
+ readonly graceMs: number;
2669
+ };
2670
+ defaultProbe: {
2671
+ run: () => Effect.Effect<number, never, never>;
2672
+ expected: number;
2673
+ };
2674
+ overrideProbe: {
2675
+ run: () => Effect.Effect<number, never, never>;
2676
+ expected: number;
2677
+ };
2678
+ };
2679
+
2680
+ declare type RoomRecoveryClaim = RoomRecoveryClaimBase & ({
2681
+ readonly mode: 'state-sync';
2682
+ readonly checkpoint: RoomCheckpoint;
2683
+ } | {
2684
+ readonly mode: 'lockstep';
2685
+ readonly checkpoint: null;
2686
+ readonly lockstep: RoomLockstepRecoveryTruth;
2687
+ });
2688
+
2689
+ declare interface RoomRecoveryClaimBase {
2690
+ readonly listing: RoomDirectoryListing;
2691
+ readonly options: unknown;
2692
+ readonly private: boolean;
2693
+ /** Actual retained durable progress only, never an estimate of lost ticks. */
2694
+ readonly recoveredTick: number;
2695
+ readonly ticksLost: null;
2696
+ }
2697
+
2698
+ export declare const roomRecoveryFakeLayer: Layer.Layer<RoomRecoveryPort, never, never>;
2699
+
2700
+ export declare type RoomRecoveryFixtureOverrides = Partial<Context.Service.Shape<typeof RoomRecoveryPort>>;
2701
+
2702
+ /** Trusted outside-tick control, never a player RPC or a death certificate. */
2703
+ declare class RoomRecoveryPort extends RoomRecoveryPort_base {
2704
+ }
2705
+
2706
+ declare const RoomRecoveryPort_base: Context.ServiceClass<RoomRecoveryPort, "@voltro/RoomRecoveryPort", {
2707
+ observe(hostId: string): Effect.Effect<RoomHostObservation, RoomDirectoryError>;
2708
+ orphan(hostId: string, roomId: string, tenantId: string, epoch: number): Effect.Effect<RoomOrphanResult, RoomDirectoryError>;
2709
+ claim(hostId: string, roomId: string, tenantId: string, priorEpoch: number): Effect.Effect<RoomRecoveryClaim, RoomDirectoryError>;
2710
+ }>;
2711
+
2712
+ export declare const roomRecoveryPortFixture: {
2713
+ kind: "port";
2714
+ tag: Context.Service<RoomRecoveryPort, {
2715
+ observe(hostId: string): Effect.Effect< RoomHostObservation, RoomDirectoryError>;
2716
+ orphan(hostId: string, roomId: string, tenantId: string, epoch: number): Effect.Effect< RoomOrphanResult, RoomDirectoryError>;
2717
+ claim(hostId: string, roomId: string, tenantId: string, priorEpoch: number): Effect.Effect< RoomRecoveryClaim, RoomDirectoryError>;
2718
+ }>;
2719
+ fakeLayer: Layer.Layer<RoomRecoveryPort, never, never>;
2720
+ probe: {
2721
+ run: () => Effect.Effect<string, never, never>;
2722
+ expected: string;
2723
+ };
2724
+ };
2725
+
2726
+ declare interface RoomReliableLane {
2727
+ send(frame: Uint8Array): Promise<void>;
2728
+ onFrame(listener: (frame: Uint8Array, receivedAt: number) => void): () => void;
2729
+ }
2730
+
2731
+ export declare const roomReplayFakeLayer: Layer.Layer<RoomReplayPort, never, never>;
2732
+
2733
+ export declare type RoomReplayFixtureOverrides = Partial<Context.Service.Shape<typeof RoomReplayPort>>;
2734
+
2735
+ /** Browser-safe trusted server contract. No player mutation or storage adapter
2736
+ * is imported at value level; replacement services use this exact Tag. */
2737
+ declare class RoomReplayPort extends RoomReplayPort_base {
2738
+ }
2739
+
2740
+ declare const RoomReplayPort_base: Context.ServiceClass<RoomReplayPort, "@voltro/RoomReplayPort", {
2741
+ publish(input: RoomReplayPublish): Effect.Effect<RoomStoredReplay, ProtocolError>;
2742
+ load(scope: RoomReplayScope): Effect.Effect<Uint8Array, ProtocolError>;
2743
+ erase(scope: RoomReplayScope, requestId: string): Effect.Effect<void, ProtocolError>;
2744
+ expire(scope: RoomReplayScope, requestId: string): Effect.Effect<void, ProtocolError>;
2745
+ subjectRooms(request: PluginPrivacyRequest): Effect.Effect<ReadonlyArray<string>, ProtocolError>;
2746
+ eraseSubject(request: PluginPrivacyRequest): Effect.Effect<void, ProtocolError>;
2747
+ exportSubject(request: PluginPrivacyRequest, roomId?: string): Effect.Effect<ReadonlyArray<RoomStoredReplay>, ProtocolError>;
2748
+ }>;
2749
+
2750
+ export declare const roomReplayPortFixture: {
2751
+ kind: "port";
2752
+ tag: Context.Service<RoomReplayPort, {
2753
+ publish(input: RoomReplayPublish): Effect.Effect< RoomStoredReplay, ProtocolError>;
2754
+ load(scope: RoomReplayScope): Effect.Effect<Uint8Array, ProtocolError>;
2755
+ erase(scope: RoomReplayScope, requestId: string): Effect.Effect<void, ProtocolError>;
2756
+ expire(scope: RoomReplayScope, requestId: string): Effect.Effect<void, ProtocolError>;
2757
+ subjectRooms(request: PluginPrivacyRequest): Effect.Effect<ReadonlyArray<string>, ProtocolError>;
2758
+ eraseSubject(request: PluginPrivacyRequest): Effect.Effect<void, ProtocolError>;
2759
+ exportSubject(request: PluginPrivacyRequest, roomId?: string): Effect.Effect<ReadonlyArray< RoomStoredReplay>, ProtocolError>;
2760
+ }>;
2761
+ fakeLayer: Layer.Layer<RoomReplayPort, never, never>;
2762
+ probe: {
2763
+ run: () => Effect.Effect<string, never, never>;
2764
+ expected: string;
2765
+ };
2766
+ };
2767
+
2768
+ declare interface RoomReplayPublish extends RoomReplayScope {
2769
+ readonly roomId: string;
2770
+ readonly roomName: string;
2771
+ readonly matchId: string;
2772
+ readonly participants: ReadonlyArray<string>;
2773
+ readonly visibility: 'private' | 'unlisted' | 'public';
2774
+ readonly expiresAtMs: number | null;
2775
+ readonly bytes: Uint8Array;
2776
+ }
2777
+
2778
+ declare interface RoomReplayScope {
2779
+ readonly tenantId: string;
2780
+ readonly replayId: string;
2781
+ }
2782
+
2783
+ declare interface RoomReservation {
2784
+ readonly roomId: string;
2785
+ readonly sessionId: string;
2786
+ readonly token: Uint8Array;
2787
+ readonly address: string;
2788
+ readonly endpoints?: RoomTransportEndpoints | undefined;
2789
+ readonly transport: readonly ['ws'] | readonly ['ws', 'wt'];
2790
+ readonly expiresAt: number;
2791
+ }
2792
+
2793
+ /** Default fake deliberately fails closed. Its actual scoped read, rather than
2794
+ * an exported passing flag, is available to the eventual system conformance. */
2795
+ export declare const roomReserveFakeLayer: Layer.Layer<RoomReservePort>;
2796
+
2797
+ export declare type RoomReserveFixtureOverrides = Partial<Context.Service.Shape<typeof RoomReservePort>>;
2798
+
2799
+ /** The game-stack reservation seam. Other systems receive the same service
2800
+ * when the default SQL/host implementation is replaced by an application. */
2801
+ declare class RoomReservePort extends RoomReservePort_base {
2802
+ }
2803
+
2804
+ declare const RoomReservePort_base: Context.ServiceClass<RoomReservePort, "@voltro/RoomReservePort", {
2805
+ reserve(input: ReserveRoomInput, subject: Subject, attributes?: RoomSeatAttributes): Effect.Effect<RoomReservation, RoomControlError>;
2806
+ resume(sessionId: string, subject: Subject, attributes?: RoomSeatAttributes): Effect.Effect<RoomReservation, RoomControlError>;
2807
+ leave(sessionId: string, token: Uint8Array, subject: Subject): Effect.Effect<{
2808
+ readonly ok: true;
2809
+ }, RoomControlError>;
2810
+ list(name: string, subject: Subject, limit?: number): Effect.Effect<ReadonlyArray<RoomPublicEntry>, RoomControlError>;
2811
+ /** A private match Room created once per server request: a retry by any member (each
2812
+ * passes the Room guards) returns the same Room. Players then take Seats with `joinById`. */
2813
+ readonly prepareMatch?: (input: RoomMatchPreparation, subject: Subject) => Effect.Effect<RoomMatchReceipt, RoomControlError>;
2814
+ }>;
2815
+
2816
+ export declare const roomReservePortFixture: {
2817
+ kind: "port";
2818
+ tag: typeof RoomReservePort;
2819
+ fakeLayer: Layer.Layer<RoomReservePort, never, never>;
2820
+ probe: {
2821
+ run: () => Effect.Effect<"RoomAuthoringError" | "ProtocolError" | "RoomsClosed" | "RoomFull" | "RoomPoolWaking" | "RoomLocked" | "RoomGone" | "RoomForbidden" | "SeatExpired" | "NotRoomMember" | "BudgetExceeded" | "unexpected-success", never, never>;
2822
+ expected: string;
2823
+ };
2824
+ };
2825
+
2826
+ declare type RoomScalar = string | number | boolean | null;
2827
+
2828
+ declare interface RoomScheduler {
2829
+ after(milliseconds: number, label: string): void;
2830
+ every(milliseconds: number, label: string): void;
2831
+ cancel(label: string): void;
2832
+ }
2833
+
2834
+ declare interface RoomScheduleSnapshot {
2835
+ readonly label: string;
2836
+ readonly remainingMs: number;
2837
+ readonly intervalMs: number | null;
2838
+ }
2839
+
2840
+ /** New Room reservations are closed for this caller (maintenance, a kill switch...): the app's
2841
+ * `admission` refused. `until`: epoch ms when they reopen, if known; `messageKey`: the app's text. */
2842
+ declare class RoomsClosed extends RoomsClosed_base {
2843
+ }
2844
+
2845
+ declare const RoomsClosed_base: Schema.Class<RoomsClosed, Schema.TaggedStruct<"RoomsClosed", {
2846
+ readonly until: Schema.NullOr<Schema.Number>;
2847
+ readonly messageKey: Schema.String;
2848
+ }>, YieldableError>;
2849
+
2850
+ /** App data for one seat, resolved by the API when the seat is reserved (`seatAttributes`) and signed
2851
+ * into it; scalars only, at most 16 keys and 2 KiB. */
2852
+ declare type RoomSeatAttributes = Readonly<Record<string, RoomScalar>>;
2853
+
2854
+ declare type RoomSeatClaims = Omit<(typeof SeatClaimsSchema)["Type"], 'purpose'>;
2855
+
2856
+ /** Server-only fixtures preserve the actual default function identity and prove
2857
+ * composed app framing through issued-identity validation and real HMAC. */
2858
+ export declare const roomSeatSignSlotFixture: {
2859
+ kind: "slot";
2860
+ defaultImplementation: (claims: RoomSeatClaims, secrets: SessionSecrets, nowMs: number) => Uint8Array;
2861
+ defaultProbe: {
2862
+ run: () => Effect.Effect<"session" | "framed", never, never>;
2863
+ expected: string;
2864
+ };
2865
+ overrideProbe: {
2866
+ run: () => Effect.Effect<"session" | "framed", never, never>;
2867
+ expected: string;
2868
+ };
2869
+ };
2870
+
2871
+ export declare const roomSeatVerifySlotFixture: {
2872
+ kind: "slot";
2873
+ defaultImplementation: (token: Uint8Array, secrets: SessionSecrets, nowMs: number) => RoomSeatClaims;
2874
+ defaultProbe: {
2875
+ run: () => Effect.Effect<"session" | "framed", never, never>;
2876
+ expected: string;
2877
+ };
2878
+ overrideProbe: {
2879
+ run: () => Effect.Effect<"session" | "framed", never, never>;
2880
+ expected: string;
2881
+ };
2882
+ };
2883
+
2884
+ export declare const roomSelectHostSlotFixture: {
2885
+ kind: "slot";
2886
+ defaultImplementation: (hosts: ReadonlyArray<RoomHostListing>, region: string) => RoomHostListing | null;
2887
+ defaultProbe: {
2888
+ run: () => Effect.Effect<string | undefined, never, never>;
2889
+ expected: string;
2890
+ };
2891
+ overrideProbe: {
2892
+ run: () => Effect.Effect<string | undefined, never, never>;
2893
+ expected: string;
2894
+ };
2895
+ };
2896
+
2897
+ declare class RoomSession<S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>> {
2898
+ readonly transport: RoomTransport;
2899
+ readonly clock: RoomClock;
2900
+ readonly maxBaselines: number;
2901
+ private readonly codecs;
2902
+ private readonly baselines;
2903
+ private readonly handoffListeners;
2904
+ private readonly listeners;
2905
+ private readonly messageListeners;
2906
+ private readonly detach;
2907
+ private currentState;
2908
+ private currentStatus;
2909
+ private currentError;
2910
+ private tick;
2911
+ private epoch;
2912
+ private receivedAt;
2913
+ private seq;
2914
+ private inputAck;
2915
+ private acknowledgedTick;
2916
+ private pendingInputAck;
2917
+ private pairedInputState;
2918
+ private sessionId;
2919
+ private started;
2920
+ private readonly pendingPings;
2921
+ private deltaDatagramsReceived;
2922
+ private lossSample;
2923
+ private lossEstimate;
2924
+ private readonly sampling;
2925
+ readonly clockSync: RoomClockSync;
2926
+ private readonly inputHistory;
2927
+ constructor(transport: RoomTransport, manifest: RoomWireManifest<S, I>, clock: RoomClock, maxBaselines?: number, recovery?: RoomClientInputRecovery, sampling?: RoomClockSamplingOptions, redundancy?: RoomInputRedundancyOptions);
2928
+ /* Excluded from this release type: currentReliableChannelIdentity */
2929
+ /* Excluded from this release type: currentReliableClientChannelIdentity */
2930
+ get status(): RoomSessionStatus;
2931
+ get error(): ProtocolError | null;
2932
+ get state(): (S)["Type"] | null;
2933
+ get lastAppliedTick(): number;
2934
+ get lastAppliedInputSeq(): number;
2935
+ /** Actor-applied receipt paired with the exact delivered state tick/epoch.
2936
+ * This is not a SQL persistence ACK or a state from a different tick. */
2937
+ get reconciliationSnapshot(): RoomReconciliationSnapshot<(S)["Type"]> | null;
2938
+ get nextInputSeq(): number;
2939
+ get id(): string | null;
2940
+ /** Estimated loss of state datagrams (0–1, smoothed), measured between Pongs; null until the
2941
+ * Host has sent enough datagrams. Reported back to the Host in every Ack. */
2942
+ get lossRate(): number | null;
2943
+ deliveredSnapshot(): RoomDeliveredState<(S)["Type"]> | null;
2944
+ serverNow(): number | null;
2945
+ start(token: Uint8Array, resumeFromTick?: number): Promise<void>;
2946
+ send(input: (I)["Type"]): Promise<number>;
2947
+ message(channelName: string, payload: unknown): Promise<void>;
2948
+ /** Reconnect replays only previously submitted, unacknowledged intentions. */
2949
+ replay(seq: number, input: (I)["Type"]): Promise<void>;
2950
+ ping(): Promise<void>;
2951
+ subscribe(listener: () => void): () => void;
2952
+ /** Render-only reliable notice; does not change state, inputs or connection ownership. */
2953
+ onWorldHandoff(listener: (frame: RoomWorldHandoffFrame) => void): () => void;
2954
+ onMessage(channel: string, listener: (payload: unknown) => void): () => void;
2955
+ private sendFrame;
2956
+ /** A window needs at least 8 datagrams; datagrams still in flight count as lost here and as
2957
+ * received in the next window, which the smoothing evens out. */
2958
+ private sampleLoss;
2959
+ private ackFrame;
2960
+ private acknowledge;
2961
+ private fail;
2962
+ private install;
2963
+ private pairInputState;
2964
+ /** Shared receipt authority for the independent frame and its exact state
2965
+ * trailer. A state/receipt pair is installed before notifying subscribers. */
2966
+ private observeInputAck;
2967
+ private receive;
2968
+ private notify;
2969
+ private cleanup;
2970
+ leave(): Promise<void>;
2971
+ }
2972
+
2973
+ declare type RoomSessionStatus = 'connecting' | 'joined' | 'reconnecting' | 'left' | 'kicked' | 'gone';
2974
+
2975
+ export declare const roomSnapshotBlobFakeLayer: Layer.Layer<RoomSnapshotBlobPort, never, never>;
2976
+
2977
+ export declare type RoomSnapshotBlobFixtureOverrides = Partial<Context.Service.Shape<typeof RoomSnapshotBlobPort>>;
2978
+
2979
+ declare interface RoomSnapshotBlobInput extends RoomSnapshotBlobScope {
2980
+ readonly claimId: string;
2981
+ readonly bytes: Uint8Array;
2982
+ }
2983
+
2984
+ /** Trusted S2 materialization seam. SQL index/admission must authorize scope;
2985
+ * it is never exposed through player intents or the actor tick context. */
2986
+ declare class RoomSnapshotBlobPort extends RoomSnapshotBlobPort_base {
2987
+ }
2988
+
2989
+ declare const RoomSnapshotBlobPort_base: Context.ServiceClass<RoomSnapshotBlobPort, "@voltro/RoomSnapshotBlobPort", {
2990
+ recover(input: RoomSnapshotBlobRecoveryInput): Effect.Effect<RoomSnapshotBlobRecovery, ProtocolError>;
2991
+ write(input: RoomSnapshotBlobInput): Effect.Effect<RoomSnapshotBlobReference, ProtocolError>;
2992
+ read(reference: RoomSnapshotBlobReference, expected: RoomSnapshotBlobScope): Effect.Effect<Uint8Array, ProtocolError>;
2993
+ /** Idempotently release this exact claim only; other claims must survive. */
2994
+ release(reference: RoomSnapshotBlobReference, expected: RoomSnapshotBlobScope): Effect.Effect<void, ProtocolError>;
2995
+ }>;
2996
+
2997
+ export declare const roomSnapshotBlobPortFixture: {
2998
+ kind: "port";
2999
+ tag: Context.Service<RoomSnapshotBlobPort, {
3000
+ recover(input: RoomSnapshotBlobRecoveryInput): Effect.Effect< RoomSnapshotBlobRecovery, ProtocolError>;
3001
+ write(input: RoomSnapshotBlobInput): Effect.Effect< RoomSnapshotBlobReference, ProtocolError>;
3002
+ read(reference: RoomSnapshotBlobReference, expected: RoomSnapshotBlobScope): Effect.Effect<Uint8Array, ProtocolError>;
3003
+ release(reference: RoomSnapshotBlobReference, expected: RoomSnapshotBlobScope): Effect.Effect<void, ProtocolError>;
3004
+ }>;
3005
+ fakeLayer: Layer.Layer<RoomSnapshotBlobPort, never, never>;
3006
+ probe: {
3007
+ run: () => Effect.Effect<string, never, never>;
3008
+ expected: string;
3009
+ };
3010
+ };
3011
+
3012
+ declare type RoomSnapshotBlobRecovery = {
3013
+ readonly state: 'pending';
3014
+ } | {
3015
+ readonly state: 'ready' | 'released';
3016
+ readonly reference: RoomSnapshotBlobReference;
3017
+ };
3018
+
3019
+ declare interface RoomSnapshotBlobRecoveryInput extends RoomSnapshotBlobScope {
3020
+ readonly claimId: string;
3021
+ readonly size: number;
3022
+ readonly checksum: string;
3023
+ }
3024
+
3025
+ declare interface RoomSnapshotBlobReference extends RoomSnapshotBlobScope {
3026
+ readonly version: 1;
3027
+ readonly refId: string;
3028
+ readonly claim: string;
3029
+ readonly size: number;
3030
+ readonly checksum: string;
3031
+ }
3032
+
3033
+ declare interface RoomSnapshotBlobScope {
3034
+ readonly tenantId: string;
3035
+ readonly roomId: string;
3036
+ readonly epoch: number;
3037
+ readonly revision: number;
3038
+ }
3039
+
3040
+ declare type RoomSnapshotBudgetFactory = (options: Readonly<RoomSnapshotBudgetOptions>) => RoomSnapshotBudgetService;
3041
+
3042
+ declare interface RoomSnapshotBudgetOptions {
3043
+ readonly budgetBytesPerSec?: number;
3044
+ readonly burstBytes?: number;
3045
+ }
3046
+
3047
+ declare interface RoomSnapshotBudgetService {
3048
+ /** Account a durable boundary without dropping commands/initial/terminal
3049
+ * state. Its debt defers subsequent periodic snapshots. */
3050
+ forced(bytes: number, now: number): void;
3051
+ periodic(roomId: string, bytes: number, now: number): boolean;
3052
+ /** A blocked periodic head cannot be bypassed by smaller periodic payloads. */
3053
+ blocked(roomId: string): boolean;
3054
+ forget(roomId: string): void;
3055
+ metrics(): {
3056
+ readonly deferred: number;
3057
+ readonly forcedBytes: number;
3058
+ readonly periodicBytes: number;
3059
+ readonly debtBytes: number;
3060
+ };
3061
+ }
3062
+
3063
+ export declare const roomSnapshotBudgetSlotFixture: {
3064
+ kind: "slot";
3065
+ defaultImplementation: RoomSnapshotBudgetFactory;
3066
+ defaultProbe: {
3067
+ run: () => Effect.Effect<number, never, never>;
3068
+ expected: number;
3069
+ };
3070
+ overrideProbe: {
3071
+ run: () => Effect.Effect<number, never, never>;
3072
+ expected: number;
3073
+ };
3074
+ };
3075
+
3076
+ declare interface RoomSnapshotPolicy<S> {
3077
+ readonly everyMs: number;
3078
+ readonly onlyIfChanged: boolean;
3079
+ readonly mode: 'full' | 'delta';
3080
+ readonly fullEvery: number;
3081
+ readonly keepFulls: number;
3082
+ readonly store: 'auto';
3083
+ /** Maximum inline codec payload; the host may impose a smaller cutoff. */
3084
+ readonly maxInlineBytes: number;
3085
+ /** Full-schema projection of volatile data; never a partial-state format. */
3086
+ readonly pick: (state: S) => S;
3087
+ }
3088
+
3089
+ export declare const roomSnapshotSlotFixture: {
3090
+ kind: "slot";
3091
+ defaultImplementation: <S>(options?: Readonly<Partial< RoomSnapshotPolicy<S>>>) => RoomSnapshotPolicy<S>;
3092
+ defaultProbe: {
3093
+ run: () => Effect.Effect<number, never, never>;
3094
+ expected: number;
3095
+ };
3096
+ overrideProbe: {
3097
+ run: () => Effect.Effect<number, never, never>;
3098
+ expected: number;
3099
+ };
3100
+ };
3101
+
3102
+ declare interface RoomSpectatorPolicy {
3103
+ readonly delayMs: number;
3104
+ readonly retentionMs: number;
3105
+ readonly maxFrames: number;
3106
+ readonly maxBytes: number;
3107
+ readonly maxFrameBytes: number;
3108
+ readonly checkpointEveryMs: number;
3109
+ readonly maxDeliveryFrames: number;
3110
+ }
3111
+
3112
+ export declare const roomSpectatorSlotFixture: {
3113
+ kind: "slot";
3114
+ defaultImplementation: (input?: Readonly<Partial< RoomSpectatorPolicy>>) => RoomSpectatorPolicy;
3115
+ defaultProbe: {
3116
+ run: () => Effect.Effect<number | undefined, never, never>;
3117
+ expected: number;
3118
+ };
3119
+ overrideProbe: {
3120
+ run: () => Effect.Effect<number | undefined, never, never>;
3121
+ expected: number;
3122
+ };
3123
+ };
3124
+
3125
+ /** Plain mutable state; the author receives no store or database capability. */
3126
+ declare type RoomState<A> = A extends ReadonlyArray<infer V> ? Array<RoomState<V>> : A extends object ? {
3127
+ -readonly [K in keyof A]: RoomState<A[K]>;
3128
+ } : A;
3129
+
3130
+ declare interface RoomStoredReplay {
3131
+ readonly replayId: string;
3132
+ readonly roomId: string;
3133
+ readonly roomName: string;
3134
+ readonly matchId: string;
3135
+ readonly visibility: RoomReplayPublish['visibility'];
3136
+ readonly expiresAtMs: number | null;
3137
+ readonly durationMs: number;
3138
+ readonly size: number;
3139
+ readonly schemaHash: number;
3140
+ }
3141
+
3142
+ export declare const roomSubjectPrivacyFakeLayer: Layer.Layer<RoomSubjectPrivacyPort>;
3143
+
3144
+ export declare type RoomSubjectPrivacyFixtureOverrides = Partial<Context.Service.Shape<typeof RoomSubjectPrivacyPort>>;
3145
+
3146
+ /** Coordinated state/command/session withdrawal, not raw seat-row deletion.
3147
+ * The trusted caller authorizes the target and owns durable request recovery. */
3148
+ declare class RoomSubjectPrivacyPort extends RoomSubjectPrivacyPort_base {
3149
+ }
3150
+
3151
+ declare const RoomSubjectPrivacyPort_base: Context.ServiceClass<RoomSubjectPrivacyPort, "@voltro/RoomSubjectPrivacyPort", {
3152
+ erase(request: PluginPrivacyRequest): Effect.Effect<void, ProtocolError>;
3153
+ export(request: PluginPrivacyRequest): Effect.Effect<unknown, ProtocolError>;
3154
+ }>;
3155
+
3156
+ export declare const roomSubjectPrivacyPortFixture: {
3157
+ kind: "port";
3158
+ tag: typeof RoomSubjectPrivacyPort;
3159
+ fakeLayer: Layer.Layer<RoomSubjectPrivacyPort, never, never>;
3160
+ probe: {
3161
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
3162
+ expected: string;
3163
+ };
3164
+ };
3165
+
3166
+ /** Synchronous hook. `void` admits parameterless block bodies (TypeScript cannot narrow those to
3167
+ * `undefined`); any returned value, a Promise included, is refused at runtime with an authoring error. */
3168
+ declare type RoomSyncHook<C> = (context: C) => void;
3169
+
3170
+ declare interface RoomTickContext<S, I> {
3171
+ /** Prepared native CPU queries only, installed before actor lifecycle. */
3172
+ readonly geometry?: GeometryWorldView | undefined;
3173
+ readonly state: RoomState<S>;
3174
+ readonly tick: number;
3175
+ readonly dt: number;
3176
+ readonly inputs: ReadonlyArray<RoomInput<I>>;
3177
+ readonly app: RoomAppBridge;
3178
+ readonly clock: RoomClock;
3179
+ readonly scheduler: RoomScheduler;
3180
+ broadcast(channel: string, payload: unknown): void;
3181
+ }
3182
+
3183
+ declare interface RoomTransport {
3184
+ readonly name: 'ws' | 'wt';
3185
+ readonly reliable: RoomReliableLane;
3186
+ readonly unreliable?: RoomDatagramLane | undefined;
3187
+ readonly signal: AbortSignal;
3188
+ stats(): {
3189
+ readonly rttMs: number | null;
3190
+ readonly queuedBytes: number;
3191
+ readonly droppedDatagrams: number;
3192
+ };
3193
+ close(code: number, reason: string): void;
3194
+ /** When provided, joins actual parent/stream withdrawal and permits retry.
3195
+ * Synchronous close alone does not establish native terminal evidence. */
3196
+ closeAsync?(code: number, reason: string): Promise<void>;
3197
+ }
3198
+
3199
+ /** Execute transport observations against a fresh actual adapter pair. No
3200
+ * Vitest runtime dependency, SQL/auth acceptance, synthetic latency claim or
3201
+ * successful fixture fallback. Declare modeled/native provenance separately.
3202
+ * Intent/stale/actor/Room authority stay in the actual session suites. */
3203
+ export declare const roomTransportConformance: (makeTransport: () => Promise<RoomTransportConformanceHarness>) => Promise<RoomTransportConformanceObservation>;
3204
+
3205
+ export declare interface RoomTransportConformanceHarness {
3206
+ readonly client: RoomTransport;
3207
+ readonly server: RoomTransport;
3208
+ /** Use small real fixture budgets, independent of production capacity. */
3209
+ readonly maxQueuedBytes: number;
3210
+ readonly maxFrameBytes: number;
3211
+ /** Advance a modeled clock or await actual peer I/O; never fabricate frames. */
3212
+ drive(): Promise<void>;
3213
+ pauseReliable(): RoomTransportPressureControl;
3214
+ pauseDatagrams?(): RoomTransportPressureControl;
3215
+ /** Await both actual peers, pending tasks, parent transports and owned locks. */
3216
+ close(): Promise<void>;
3217
+ }
3218
+
3219
+ export declare interface RoomTransportConformanceObservation {
3220
+ readonly scope: 'transport-only';
3221
+ readonly datagrams: boolean;
3222
+ readonly checks: ReadonlyArray<'binary-control' | 'reliable-order' | 'native-pressure' | 'queue-overflow' | 'withdrawal' | 'datagram-bound' | 'datagram-latest'>;
3223
+ }
3224
+
3225
+ /** Public routing metadata only. Neither endpoint conveys seat authority. */
3226
+ declare interface RoomTransportEndpoints {
3227
+ readonly ws: string;
3228
+ readonly wt?: string | undefined;
3229
+ /** Base64 SHA-256 of a short-lived development certificate the browser pins
3230
+ * through `serverCertificateHashes`. Absent for a publicly trusted certificate. */
3231
+ readonly wtCertificateHash?: string | undefined;
3232
+ }
3233
+
3234
+ export declare interface RoomTransportPressureControl {
3235
+ /** Settles when the actual submitted reliable write is held. */
3236
+ readonly blocked: Promise<void>;
3237
+ resume(): void;
3238
+ }
3239
+
3240
+ declare interface RoomViewContext<S> {
3241
+ readonly state: S;
3242
+ readonly client: Pick<RoomClient, 'sessionId' | 'subjectId' | 'tenantId' | 'isBot' | 'countsAsPlayer' | 'attributes'>;
3243
+ readonly role: 'player' | 'spectator';
3244
+ readonly tick: number;
3245
+ }
3246
+
3247
+ export declare const roomViewSlotFixture: {
3248
+ kind: "slot";
3249
+ defaultImplementation: <S>(context: RoomViewContext<S>) => S;
3250
+ defaultProbe: {
3251
+ run: () => Effect.Effect<number, never, never>;
3252
+ expected: number;
3253
+ };
3254
+ overrideProbe: {
3255
+ run: () => Effect.Effect<number, never, never>;
3256
+ expected: number;
3257
+ };
3258
+ };
3259
+
3260
+ declare interface RoomWireManifest<S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>> {
3261
+ readonly state: S;
3262
+ readonly input: I;
3263
+ readonly messages?: Readonly<Record<string, RoomChannel>>;
3264
+ }
3265
+
3266
+ /** World Rooms keep their authored entities in the declared state record. */
3267
+ declare type RoomWorldEntity<S> = S extends {
3268
+ readonly entities: Readonly<Record<string, infer E>>;
3269
+ } ? RoomState<E> & {
3270
+ readonly id: string;
3271
+ } : never;
3272
+
3273
+ /** Render/connection coordination only: no token and no ownership assertion. */
3274
+ declare interface RoomWorldHandoffFrame {
3275
+ readonly kind: 'WorldHandoff';
3276
+ readonly phase: 'departed' | 'cancelled';
3277
+ readonly transitionId: string;
3278
+ readonly entityId: string;
3279
+ readonly tick: number;
3280
+ readonly sourceEpoch: number;
3281
+ readonly targetRoomId: string;
3282
+ readonly targetEpoch: number;
3283
+ readonly holdMs: number;
3284
+ }
3285
+
3286
+ declare interface RoomWorldHookContext<S> {
3287
+ readonly state: RoomState<S>;
3288
+ readonly phase: 'prepare' | 'commit' | 'rollback';
3289
+ readonly requestId?: string | undefined;
3290
+ readonly entity: RoomWorldEntity<S>;
3291
+ }
3292
+
3293
+ declare interface RoomWorldHookInput<E = unknown> {
3294
+ /** Actual target placement, distinct from the source location. Only guarded
3295
+ * target entry uses it; source rollback must restore its exact snapshot. */
3296
+ readonly arrival?: WorldEntityLocation;
3297
+ readonly epoch: number;
3298
+ readonly entity: E;
3299
+ readonly location: WorldEntityLocation;
3300
+ readonly requestId?: string | undefined;
3301
+ }
3302
+
3303
+ declare interface RoomWorldHooks<S> {
3304
+ /** Opt-in cell movement: synchronous author projection/write, no I/O. */
3305
+ readonly movement?: RoomWorldMovement<S>;
3306
+ /** Retained checkpoint receipts awaiting confirmed transition retirement. */
3307
+ readonly maxPendingTransitions?: number;
3308
+ readonly onEnter: RoomLifecycleHook<RoomWorldHookContext<S> & {
3309
+ readonly from: WorldEntityLocation;
3310
+ readonly to?: WorldEntityLocation;
3311
+ }>;
3312
+ readonly onExit: RoomLifecycleHook<RoomWorldHookContext<S> & {
3313
+ readonly to: WorldEntityLocation;
3314
+ }>;
3315
+ /** Publish a projection on commit; remove that projection on rollback. Never
3316
+ * promote it into authoritative entities. Rollback may retry after failure. */
3317
+ readonly onGhost: RoomLifecycleHook<RoomWorldHookContext<S>>;
3318
+ /** Synchronous, bounded JSON projection; no SQL or asynchronous effect here. */
3319
+ readonly persistEntity: (context: {
3320
+ readonly entity: RoomWorldEntity<S>;
3321
+ }) => unknown;
3322
+ /** A player who arrived by a World transition is now an active member. `onJoin` does not run for
3323
+ * such arrivals (the entity came with `onEnter`); this is where the Room sees the arriving client,
3324
+ * e.g. its seat attributes (`client.attributes`). */
3325
+ readonly onMemberEnter?: RoomLifecycleHook<{
3326
+ readonly state: RoomState<S>;
3327
+ readonly client: RoomClient;
3328
+ readonly entityId: string;
3329
+ }>;
3330
+ }
3331
+
3332
+ /** The server-owned entity an ordinary World player Session controls, as last persisted.
3333
+ * The Room's `onJoin` receives it as `world` and builds the state entity when absent. */
3334
+ declare interface RoomWorldMember {
3335
+ readonly entityId: string;
3336
+ readonly worldId: string;
3337
+ readonly zoneId: string;
3338
+ readonly cellId: string;
3339
+ readonly layer: number;
3340
+ readonly revision: number;
3341
+ /** The Room's `persistEntity` projection from the entity's last write. */
3342
+ readonly data: unknown;
3343
+ }
3344
+
3345
+ declare interface RoomWorldMovement<S> {
3346
+ readonly maxEntities: number;
3347
+ readonly maxBytesPerTick: number;
3348
+ readonly position: (entity: RoomWorldEntity<S>) => WorldPoint;
3349
+ readonly move: (entity: RoomWorldEntity<S>, at: WorldPoint) => void;
3350
+ }
3351
+
3352
+ declare interface RoomWorldReceipt {
3353
+ readonly requestId: string;
3354
+ readonly operation: 'enter' | 'exit' | 'ghost';
3355
+ readonly fingerprint: string;
3356
+ readonly projection?: {
3357
+ readonly entity: unknown;
3358
+ readonly location: WorldEntityLocation;
3359
+ readonly expiresAt?: number;
3360
+ };
3361
+ }
3362
+
3363
+ /** Emit actual observations in this invocation. The result does not identify an
3364
+ * engine, authenticate a remote runner or establish a cross-engine proof. */
3365
+ export declare const runSimulationConformanceTrace: <S extends AnySchema, I extends AnySchema, O extends AnySchema>(simulation: Simulation<S, I, O>, offered: SimulationConformanceCase, offeredLimits?: SimulationConformanceLimits) => SimulationConformanceTrace;
3366
+
3367
+ declare const SeatClaimsSchema: Schema.Struct<{
3368
+ readonly purpose: Schema.Literal<"voltro.rooms.seat.v1">;
3369
+ readonly roomId: Schema.NonEmptyString;
3370
+ readonly sessionId: Schema.NonEmptyString;
3371
+ readonly subjectId: Schema.NullOr<Schema.NonEmptyString>;
3372
+ readonly subjectType: Schema.optionalKey<Schema.Literals<readonly ["user", "apiKey", "serviceAccount"]>>;
3373
+ readonly subjectKind: Schema.optionalKey<Schema.Literal<"guest">>;
3374
+ readonly tenantId: Schema.NonEmptyString;
3375
+ readonly epoch: Schema.Int;
3376
+ readonly nonce: Schema.NonEmptyString;
3377
+ readonly expiresAt: Schema.Number;
3378
+ readonly role: Schema.Literals<readonly ["player", "spectator"]>;
3379
+ readonly attributes: Schema.optionalKey<Schema.$Record<Schema.String, Schema.Union<readonly [Schema.String, Schema.Number, Schema.Boolean, Schema.Null]>>>;
3380
+ }>;
3381
+
3382
+ declare class SeatExpired extends SeatExpired_base {
3383
+ }
3384
+
3385
+ declare const SeatExpired_base: Schema.Class<SeatExpired, Schema.TaggedStruct<"SeatExpired", {
3386
+ readonly sessionId: Schema.String;
3387
+ }>, YieldableError>;
3388
+
3389
+ declare interface Simulation<S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>, O extends Schema.Codec<unknown, unknown>> {
3390
+ readonly definition: SimulationDefinition<S, I, O>;
3391
+ readonly stateCodec: SimulationStateCodec<S>;
3392
+ readonly inputCodec: SimulationStateCodec<I>;
3393
+ readonly optionsCodec: SimulationStateCodec<O>;
3394
+ }
3395
+
3396
+ /** Same-invocation fresh-run and real retained rollback controls, not B31. */
3397
+ export declare const simulationConformance: <S extends AnySchema, I extends AnySchema, O extends AnySchema>(simulation: Simulation<S, I, O>, offered: SimulationConformanceCase, offeredLimits?: SimulationConformanceLimits) => SimulationConformanceResult;
3398
+
3399
+ export declare interface SimulationConformanceCase {
3400
+ readonly seed: number;
3401
+ readonly stateSchemaHash: number;
3402
+ /** Actual LSO bytes: never JSON-roundtrip init options. */
3403
+ readonly options: Uint8Array;
3404
+ /** Actual LSI bytes: complete canonical tick-zero input history. */
3405
+ readonly inputs: Uint8Array;
3406
+ }
3407
+
3408
+ export declare interface SimulationConformanceCaseOptions<I, O> {
3409
+ readonly seed: number;
3410
+ readonly options: O;
3411
+ readonly playerIds: ReadonlyArray<number>;
3412
+ readonly sample: (context: SimulationConformanceSampleContext) => I;
3413
+ readonly inputSeed?: number;
3414
+ readonly ticks?: number;
3415
+ readonly maxBytes?: number | undefined;
3416
+ }
3417
+
3418
+ export declare interface SimulationConformanceLimits {
3419
+ readonly maxTicks?: number;
3420
+ readonly maxCaseBytes?: number;
3421
+ readonly maxStateBytes?: number;
3422
+ readonly maxRetainedStateBytes?: number;
3423
+ readonly maxWorkSteps?: number;
3424
+ readonly maxObservations?: number;
3425
+ readonly rollbackHorizonTicks?: number;
3426
+ readonly replayEveryTicks?: number;
3427
+ }
3428
+
3429
+ export declare interface SimulationConformanceObservation {
3430
+ readonly tick: number;
3431
+ /** Always compute the schema hash even when the author overrides hash. */
3432
+ readonly schemaHash: Uint64Words;
3433
+ readonly hash: Uint64Words;
3434
+ readonly rng: Pcg32Snapshot;
3435
+ }
3436
+
3437
+ export declare interface SimulationConformanceResult {
3438
+ readonly scope: 'local-repeat-and-rollback';
3439
+ readonly trace: SimulationConformanceTrace;
3440
+ readonly ticks: number;
3441
+ readonly stepsExecuted: number;
3442
+ readonly comparisons: number;
3443
+ readonly replays: number;
3444
+ }
3445
+
3446
+ export declare interface SimulationConformanceSampleContext {
3447
+ readonly tick: number;
3448
+ readonly playerId: number;
3449
+ /** Separate case-generation RNG, never the simulation's retained RNG. */
3450
+ readonly rng: Pcg32;
3451
+ }
3452
+
3453
+ export declare interface SimulationConformanceTrace {
3454
+ readonly case: SimulationConformanceCase;
3455
+ readonly observations: ReadonlyArray<SimulationConformanceObservation>;
3456
+ }
3457
+
3458
+ declare interface SimulationDefinition<S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>, O extends Schema.Codec<unknown, unknown>> {
3459
+ readonly state: S;
3460
+ readonly input: I;
3461
+ readonly options: O;
3462
+ readonly init: (seed: number, options: (O)["Type"]) => (S)["Type"];
3463
+ readonly step: (state: RoomState<(S)["Type"]>, inputs: ReadonlyArray<SimulationPlayerInput<(I)["Type"]>>, tick: number, rng: Pcg32) => (S)["Type"];
3464
+ readonly hash?: (state: (S)["Type"]) => Uint64Words;
3465
+ /** Late join: runs before `step` at the tick a player's input first appears (it was absent
3466
+ * from the previous tick's inputs), in player-ID order, e.g. to spawn the player. Pure and
3467
+ * deterministic like `step`. Start players are `init`'s job: tick 1 runs no join. */
3468
+ readonly join?: (state: RoomState<(S)["Type"]>, playerId: number, tick: number, rng: Pcg32) => (S)["Type"];
3469
+ readonly limits?: Partial<SimulationValueLimits>;
3470
+ }
3471
+
3472
+ declare interface SimulationPlayerInput<I> {
3473
+ readonly playerId: number;
3474
+ readonly input: I;
3475
+ }
3476
+
3477
+ declare interface SimulationStateCodec<S extends Schema.Codec<unknown, unknown>> {
3478
+ readonly limits: SimulationValueLimits;
3479
+ /** Admitted capture/hash plan, not a binary Room wire schema. */
3480
+ schemaDescription?(): string;
3481
+ capture(value: unknown): (S)["Type"];
3482
+ hash(value: (S)["Type"]): Uint64Words;
3483
+ }
3484
+
3485
+ declare interface SimulationValueLimits extends RoomCodecLimits {
3486
+ readonly maxNodes: number;
3487
+ }
3488
+
3489
+ export declare interface TestRoomClients<S extends Schema.Codec<unknown, unknown>, I extends Schema.Codec<unknown, unknown>, O extends Schema.Codec<unknown, unknown>> {
3490
+ readonly actor: RoomActor<S, I, O>;
3491
+ /** The player's current client session (replaced on reconnect). */
3492
+ session(subjectId: string): RoomSession<S, I>;
3493
+ /** Advance virtual time: one Host tick, state published to every connected client. */
3494
+ step(milliseconds: number): Promise<void>;
3495
+ send(subjectId: string, input: (I)["Type"]): Promise<number>;
3496
+ /** Drop the player's transport; the server closes the session as `reconnecting`. */
3497
+ disconnect(subjectId: string): Promise<void>;
3498
+ /** A fresh seat and a new session for the same player. */
3499
+ reconnect(subjectId: string): Promise<void>;
3500
+ close(): Promise<void>;
3501
+ }
3502
+
3503
+ export declare interface TestRoomClientsOptions {
3504
+ /** Subject ids of the players to connect, in order. */
3505
+ readonly players: ReadonlyArray<string>;
3506
+ readonly tenantId?: string;
3507
+ /** Seeded network per player; defaults to no latency, jitter or loss. */
3508
+ readonly net?: Partial<NetSimOptions>;
3509
+ /** Seat attributes per player, as the API's `seatAttributes` would resolve them (`client.attributes`). */
3510
+ readonly attributes?: Readonly<Record<string, RoomSeatAttributes>>;
3511
+ }
3512
+
3513
+ declare const Transform2D: Schema.Struct<{
3514
+ readonly x: Schema.Number;
3515
+ readonly y: Schema.Number;
3516
+ readonly rot: Schema.Number;
3517
+ readonly vx: Schema.optional<Schema.Number>;
3518
+ readonly vy: Schema.optional<Schema.Number>;
3519
+ }>;
3520
+
3521
+ declare type Transform2D = (typeof Transform2D)["Type"];
3522
+
3523
+ /** Exact unsigned 64-bit integer as independent 32-bit words. */
3524
+ declare interface Uint64Words {
3525
+ readonly hi: number;
3526
+ readonly lo: number;
3527
+ }
3528
+
3529
+ export declare const virtualClock: (initialMs?: number) => VirtualRoomClock;
3530
+
3531
+ export declare interface VirtualRoomClock extends RoomClock {
3532
+ advance(milliseconds: number): void;
3533
+ }
3534
+
3535
+ declare type WorldBounds = readonly [minimum: WorldPoint, maximum: WorldPoint];
3536
+
3537
+ declare interface WorldClientControl {
3538
+ /** Own active transition for the caller's current connection; no history or preparation. */
3539
+ readonly pending?: (input: {
3540
+ readonly entityId: string;
3541
+ readonly roomId: string;
3542
+ }, subject: Subject) => Effect.Effect<WorldClientReceipt | null, ProtocolError>;
3543
+ readonly join?: (worldId: string, subject: Subject) => Effect.Effect<WorldJoinResult, ProtocolError>;
3544
+ readonly follow?: (requestId: string, subject: Subject) => Effect.Effect<RoomReservation, ProtocolError>;
3545
+ readonly reservation?: (requestId: string, subject: Subject) => Effect.Effect<RoomReservation, ProtocolError>;
3546
+ prepare(requestId: string, intention: WorldTransitionRequest, subject: Subject): Effect.Effect<WorldClientTicket, ProtocolError | WorldTransitionCooldown>;
3547
+ observe(requestId: string, subject: Subject): Effect.Effect<WorldClientReceipt, ProtocolError>;
3548
+ commit(ticket: WorldClientTicket, subject: Subject): Effect.Effect<WorldClientReceipt, ProtocolError>;
3549
+ cancel(requestId: string, subject: Subject): Effect.Effect<WorldClientReceipt, ProtocolError>;
3550
+ }
3551
+
3552
+ export declare const worldClientControlFakeLayer: Layer.Layer<WorldClientControlPort, never, never>;
3553
+
3554
+ export declare type WorldClientControlFixtureOverrides = Partial<Context.Service.Shape<typeof WorldClientControlPort>>;
3555
+
3556
+ /** Authenticated API seam; default physical/SQL implementation stays explicit. */
3557
+ declare class WorldClientControlPort extends WorldClientControlPort_base {
3558
+ }
3559
+
3560
+ declare const WorldClientControlPort_base: Context.ServiceClass<WorldClientControlPort, "@voltro/WorldClientControlPort", WorldClientControl>;
3561
+
3562
+ export declare const worldClientControlPortFixture: {
3563
+ kind: "port";
3564
+ tag: typeof WorldClientControlPort;
3565
+ fakeLayer: Layer.Layer<WorldClientControlPort, never, never>;
3566
+ probe: {
3567
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
3568
+ expected: string;
3569
+ };
3570
+ };
3571
+
3572
+ declare interface WorldClientLocation {
3573
+ readonly worldId: string;
3574
+ readonly cellId: string;
3575
+ readonly layer: number;
3576
+ readonly roomId: string;
3577
+ readonly epoch: number;
3578
+ }
3579
+
3580
+ declare interface WorldClientReceipt {
3581
+ readonly ticket: WorldClientTicket;
3582
+ readonly phase: 'prepared' | 'committed' | 'settled' | 'rolledBack';
3583
+ readonly entityRevision: number | null;
3584
+ }
3585
+
3586
+ /** Authenticated server preparation, never player-supplied authority or state. */
3587
+ declare interface WorldClientTicket {
3588
+ readonly requestId: string;
3589
+ readonly transitionId: string;
3590
+ readonly mode: 'seamless' | 'portal';
3591
+ readonly target: WorldClientLocation;
3592
+ }
3593
+
3594
+ declare interface WorldDefinition<Player> {
3595
+ readonly name: string;
3596
+ readonly map: {
3597
+ readonly bounds: WorldBounds;
3598
+ };
3599
+ readonly zones: ReadonlyArray<WorldZone>;
3600
+ readonly instances?: ReadonlyArray<WorldInstance>;
3601
+ readonly persistence: {
3602
+ readonly entities: 'world';
3603
+ readonly snapshotEveryMs: number;
3604
+ readonly journal: boolean;
3605
+ };
3606
+ readonly handoff: {
3607
+ readonly marginUnits: number;
3608
+ readonly ghostUnits: number;
3609
+ };
3610
+ readonly spawn: (context: {
3611
+ readonly player: Player;
3612
+ }) => WorldPosition;
3613
+ readonly geometry?: WorldGeometryDefinition | undefined;
3614
+ readonly hosts?: {
3615
+ readonly pool: string;
3616
+ };
3617
+ readonly characters?: 'shared' | 'per-world';
3618
+ readonly transitionCooldownMs?: number;
3619
+ /** Authoring inventory bounds, not measured runtime capacity. */
3620
+ readonly budgets?: {
3621
+ readonly maxZones?: number;
3622
+ readonly maxCells?: number | undefined;
3623
+ readonly maxInstances?: number;
3624
+ };
3625
+ readonly strategies?: {
3626
+ readonly layerPolicy?: WorldLayerPolicy | undefined;
3627
+ readonly transitionPolicy?: WorldTransitionPolicy;
3628
+ readonly onWorldChange?: WorldOnWorldChange;
3629
+ };
3630
+ }
3631
+
3632
+ declare interface WorldDescriptor<Player> extends Omit<WorldDefinition<Player>, 'instances' | 'budgets' | 'characters' | 'transitionCooldownMs' | 'strategies' | 'geometry'> {
3633
+ readonly geometry?: WorldGeometryDescriptor | undefined;
3634
+ readonly _tag: 'WorldDescriptor';
3635
+ readonly instances: ReadonlyArray<Omit<WorldInstance, 'ttl'> & {
3636
+ readonly ttlMs: number;
3637
+ }>;
3638
+ readonly budgets: {
3639
+ readonly maxZones: number;
3640
+ readonly maxCells: number;
3641
+ readonly maxInstances: number;
3642
+ };
3643
+ readonly characters: 'shared' | 'per-world';
3644
+ readonly transitionCooldownMs: number;
3645
+ readonly cellCount: number;
3646
+ readonly strategies: {
3647
+ readonly layerPolicy: WorldLayerPolicy;
3648
+ readonly transitionPolicy: WorldTransitionPolicy;
3649
+ readonly onWorldChange: WorldOnWorldChange;
3650
+ };
3651
+ }
3652
+
3653
+ declare interface WorldEntityLocation {
3654
+ readonly worldId: string;
3655
+ readonly zoneId: string;
3656
+ readonly at: WorldPoint;
3657
+ readonly layer: number;
3658
+ readonly roomId: string;
3659
+ readonly epoch: number;
3660
+ }
3661
+
3662
+ declare interface WorldGeometryDefinition {
3663
+ readonly strategies?: WorldGeometryStrategies | undefined;
3664
+ readonly kind: GeometryKind;
3665
+ readonly static: GeometrySource;
3666
+ readonly chunkSize?: number;
3667
+ readonly dynamic?: {
3668
+ readonly enabled?: boolean | undefined;
3669
+ readonly maxDeltaBytesPerChunk?: number;
3670
+ readonly persist?: {
3671
+ readonly everyMs?: number;
3672
+ readonly onUnload?: boolean;
3673
+ };
3674
+ };
3675
+ readonly collision?: {
3676
+ readonly derive?: 'bitgrid' | 'heightfield' | 'shapes';
3677
+ readonly resolution?: number;
3678
+ };
3679
+ readonly nav?: {
3680
+ readonly derive?: 'grid' | 'none';
3681
+ readonly navBudgetMs?: number;
3682
+ readonly maxAdvanceSteps?: number;
3683
+ };
3684
+ readonly streaming?: {
3685
+ readonly client?: {
3686
+ readonly radiusChunks?: number;
3687
+ readonly prefetchChunks?: number;
3688
+ readonly maxConcurrent?: number | undefined;
3689
+ readonly maxCachedChunks?: number;
3690
+ };
3691
+ readonly cell?: {
3692
+ readonly marginChunks?: number;
3693
+ };
3694
+ };
3695
+ readonly lod?: ReadonlyArray<{
3696
+ readonly beyondChunks: number;
3697
+ readonly fields: ReadonlyArray<string>;
3698
+ }>;
3699
+ readonly budgets?: {
3700
+ readonly maxPreparedChunks?: number;
3701
+ readonly maxPreparedBytes?: number;
3702
+ readonly maxLodLevels?: number;
3703
+ readonly maxRayCells?: number | undefined;
3704
+ readonly maxOverlapTests?: number | undefined;
3705
+ };
3706
+ }
3707
+
3708
+ declare interface WorldGeometryDescriptor {
3709
+ readonly strategies: GeometryEditStrategies & GeometryDerivationStrategies & GeometryCompactionStrategies & {
3710
+ readonly migrateDelta: GeometryMigrateDelta;
3711
+ };
3712
+ readonly _tag: 'WorldGeometry';
3713
+ readonly kind: GeometryKind;
3714
+ readonly static: GeometrySource;
3715
+ readonly chunkSize: number;
3716
+ readonly chunkSizeRaw: number;
3717
+ readonly dynamic: {
3718
+ readonly enabled: boolean;
3719
+ readonly maxDeltaBytesPerChunk: number;
3720
+ readonly persist: {
3721
+ readonly everyMs: number;
3722
+ readonly onUnload: boolean;
3723
+ };
3724
+ };
3725
+ readonly collision: {
3726
+ readonly derive: 'bitgrid' | 'heightfield' | 'shapes';
3727
+ readonly resolution: number;
3728
+ readonly resolutionRaw: number;
3729
+ };
3730
+ readonly nav: {
3731
+ readonly derive: 'grid' | 'none';
3732
+ readonly navBudgetMs: number;
3733
+ readonly maxAdvanceSteps: number;
3734
+ };
3735
+ readonly streaming: {
3736
+ readonly client: {
3737
+ readonly radiusChunks: number;
3738
+ readonly prefetchChunks: number;
3739
+ readonly maxConcurrent: number;
3740
+ readonly maxCachedChunks: number;
3741
+ };
3742
+ readonly cell: {
3743
+ readonly marginChunks: number;
3744
+ };
3745
+ };
3746
+ readonly lod: ReadonlyArray<{
3747
+ readonly beyondChunks: number;
3748
+ readonly fields: ReadonlyArray<string>;
3749
+ }>;
3750
+ readonly budgets: {
3751
+ readonly maxPreparedChunks: number;
3752
+ readonly maxPreparedBytes: number;
3753
+ readonly maxLodLevels: number;
3754
+ readonly maxRayCells: number;
3755
+ readonly maxOverlapTests: number;
3756
+ };
3757
+ }
3758
+
3759
+ declare interface WorldGeometryStrategies extends GeometryVersionMigrationStrategies, Partial<GeometryEditStrategies>, Partial<GeometryDerivationStrategies>, Partial<GeometryCompactionStrategies> {
3760
+ }
3761
+
3762
+ declare type WorldGroupTransitionRequest = typeof WorldGroupTransitionRequestSchema.Type;
3763
+
3764
+ declare const WorldGroupTransitionRequestSchema: Schema.Struct<{
3765
+ readonly partyId: Schema.String;
3766
+ readonly target: Schema.Union<readonly [Schema.Struct<{
3767
+ readonly kind: Schema.Literal<"cell">;
3768
+ readonly zone: Schema.String;
3769
+ readonly at: Schema.Tuple<readonly [Schema.Number, Schema.Number]>;
3770
+ }>, Schema.Struct<{
3771
+ readonly kind: Schema.Literal<"zone">;
3772
+ readonly zone: Schema.String;
3773
+ readonly at: Schema.Tuple<readonly [Schema.Number, Schema.Number]>;
3774
+ }>, Schema.Struct<{
3775
+ readonly kind: Schema.Literal<"layer">;
3776
+ readonly layer: Schema.Number;
3777
+ }>, Schema.Struct<{
3778
+ readonly kind: Schema.Literal<"world">;
3779
+ readonly world: Schema.String;
3780
+ readonly spawn: Schema.String;
3781
+ }>, Schema.Struct<{
3782
+ readonly kind: Schema.Literal<"instance">;
3783
+ readonly instance: Schema.String;
3784
+ readonly group: Schema.String;
3785
+ }>, Schema.Struct<{
3786
+ readonly kind: Schema.Literal<"return">;
3787
+ }>]>;
3788
+ readonly options: Schema.Struct<{
3789
+ readonly mode: Schema.Literals<readonly ["auto", "seamless", "portal"]>;
3790
+ readonly reason: Schema.String;
3791
+ readonly crossPool: Schema.Boolean;
3792
+ readonly returnTo: Schema.optional<Schema.Literal<"here">>;
3793
+ }>;
3794
+ readonly waitForAllMs: Schema.Number;
3795
+ readonly onTimeout: Schema.Literals<readonly ["proceed", "cancel"]>;
3796
+ }>;
3797
+
3798
+ declare interface WorldInstance {
3799
+ readonly id: string;
3800
+ readonly room: string;
3801
+ readonly maxGroups: number;
3802
+ readonly ttl: Duration.Input;
3803
+ }
3804
+
3805
+ declare interface WorldJoinResult {
3806
+ /** The server-owned entity this player controls (`intention.entityId` of later moves). */
3807
+ readonly entityId: string;
3808
+ readonly reservation: RoomReservation;
3809
+ }
3810
+
3811
+ declare type WorldLayerDecision = {
3812
+ readonly kind: 'use';
3813
+ readonly layer: number;
3814
+ readonly wake: boolean;
3815
+ } | {
3816
+ readonly kind: 'create';
3817
+ readonly layer: number;
3818
+ } | {
3819
+ readonly kind: 'blocked';
3820
+ readonly reason: 'affinity-unavailable' | 'capacity' | 'layer-budget';
3821
+ };
3822
+
3823
+ declare interface WorldLayering {
3824
+ readonly maxPlayers: number;
3825
+ readonly splitAt: number;
3826
+ readonly mergeBelow: number;
3827
+ }
3828
+
3829
+ declare interface WorldLayerInput {
3830
+ readonly policy: WorldLayering;
3831
+ readonly layers: ReadonlyArray<WorldLayerObservation>;
3832
+ readonly groupSize: number;
3833
+ /** Actual server-owned party affinity; never silently choose a different layer. */
3834
+ readonly affinity: number | null;
3835
+ readonly maxLayers: number;
3836
+ }
3837
+
3838
+ declare interface WorldLayerObservation {
3839
+ readonly layer: number;
3840
+ readonly players: number;
3841
+ readonly state: 'live' | 'hibernated' | 'splitting' | 'merging';
3842
+ }
3843
+
3844
+ declare type WorldLayerPolicy = (input: WorldLayerInput) => WorldLayerDecision;
3845
+
3846
+ /** Actual configured definition + resolver, not a whole-world conformance flag. */
3847
+ export declare const worldLayerPolicySlotFixture: {
3848
+ kind: "slot";
3849
+ defaultImplementation: WorldLayerPolicy;
3850
+ defaultProbe: {
3851
+ run: () => Effect.Effect< WorldLayerDecision, never, never>;
3852
+ expected: {
3853
+ kind: string;
3854
+ layer: number;
3855
+ wake: boolean;
3856
+ };
3857
+ };
3858
+ overrideProbe: {
3859
+ run: () => Effect.Effect< WorldLayerDecision, never, never>;
3860
+ expected: {
3861
+ kind: string;
3862
+ layer: number;
3863
+ wake: boolean;
3864
+ };
3865
+ };
3866
+ };
3867
+
3868
+ declare interface WorldMovementIntent {
3869
+ readonly entityId: string;
3870
+ readonly sourceAt: WorldPoint;
3871
+ readonly targetAt: WorldPoint;
3872
+ readonly crossing: boolean;
3873
+ }
3874
+
3875
+ declare interface WorldMovementObservation {
3876
+ readonly epoch: number;
3877
+ readonly tick: number;
3878
+ readonly intents: ReadonlyArray<WorldMovementIntent>;
3879
+ }
3880
+
3881
+ declare type WorldOnWorldChange = (input: WorldOnWorldChangeInput) => unknown;
3882
+
3883
+ declare interface WorldOnWorldChangeInput {
3884
+ readonly sourceWorldId: string;
3885
+ readonly targetWorldId: string;
3886
+ /** Current server-captured character data, never a player's wire state. */
3887
+ readonly sourceData: unknown;
3888
+ /** Actual server-selected target data before this policy. */
3889
+ readonly targetData: unknown;
3890
+ }
3891
+
3892
+ export declare const worldOnWorldChangeSlotFixture: {
3893
+ kind: "slot";
3894
+ defaultImplementation: WorldOnWorldChange;
3895
+ defaultProbe: {
3896
+ run: () => Effect.Effect<unknown, never, never>;
3897
+ expected: {
3898
+ coins: number;
3899
+ };
3900
+ };
3901
+ overrideProbe: {
3902
+ run: () => Effect.Effect<unknown, never, never>;
3903
+ expected: {
3904
+ coins: number;
3905
+ };
3906
+ };
3907
+ };
3908
+
3909
+ declare type WorldPoint = readonly [x: number, y: number];
3910
+
3911
+ declare interface WorldPosition {
3912
+ readonly zone: string;
3913
+ readonly at: WorldPoint;
3914
+ }
3915
+
3916
+ /** Private durable restriction, never a bearer or a grant of transition authority.
3917
+ * The enclosing Seat supplies tenant, target Room, Subject and ownership epoch. */
3918
+ declare interface WorldTargetSeatBinding {
3919
+ readonly transitionId: string;
3920
+ readonly sourceRoomId: string;
3921
+ readonly requestId: string;
3922
+ readonly entityId: string;
3923
+ }
3924
+
3925
+ /** A World transition asked for inside the World's `transitionCooldownMs`; retry after `retryAfterMs`. */
3926
+ declare class WorldTransitionCooldown extends WorldTransitionCooldown_base {
3927
+ }
3928
+
3929
+ declare const WorldTransitionCooldown_base: Schema.Class<WorldTransitionCooldown, Schema.TaggedStruct<"WorldTransitionCooldown", {
3930
+ readonly retryAfterMs: Schema.Number;
3931
+ }>, YieldableError>;
3932
+
3933
+ export declare const worldTransitionFakeLayer: Layer.Layer<WorldTransitionPort>;
3934
+
3935
+ export declare type WorldTransitionFixtureOverrides = Partial<Context.Service.Shape<typeof WorldTransitionPort>>;
3936
+
3937
+ declare type WorldTransitionKind = 'cell' | 'layer' | 'zone' | 'world' | 'instance' | 'return' | 'recover';
3938
+
3939
+ declare interface WorldTransitionLocation extends WorldPosition {
3940
+ readonly world: string;
3941
+ readonly pool: string;
3942
+ readonly layer: number;
3943
+ readonly instance: string | null;
3944
+ }
3945
+
3946
+ declare type WorldTransitionMode = 'seamless' | 'portal' | 'recover';
3947
+
3948
+ declare interface WorldTransitionObservation {
3949
+ readonly phase: typeof WorldTransitionPhaseSchema.Type;
3950
+ }
3951
+
3952
+ declare type WorldTransitionOrigin = Omit<RoomAppCommand, 'command'>;
3953
+
3954
+ declare const WorldTransitionPhaseSchema: Schema.Literals<readonly ["requested", "reserving", "prepared", "ghosting", "persisting", "detaching", "switching", "committed", "settled", "failed", "rolledBack"]>;
3955
+
3956
+ declare interface WorldTransitionPlan {
3957
+ readonly kind: WorldTransitionKind;
3958
+ readonly mode: WorldTransitionMode;
3959
+ readonly crossPool: boolean;
3960
+ readonly persistBeforeRelease: boolean;
3961
+ readonly sourceCell: string;
3962
+ readonly targetCell: string;
3963
+ }
3964
+
3965
+ declare type WorldTransitionPolicy = (input: WorldTransitionPolicyInput) => WorldTransitionPlan;
3966
+
3967
+ declare interface WorldTransitionPolicyInput {
3968
+ readonly kind: WorldTransitionKind;
3969
+ readonly sourceWorld: AnyWorldDescriptor;
3970
+ readonly targetWorld: AnyWorldDescriptor;
3971
+ readonly source: WorldTransitionLocation;
3972
+ readonly target: WorldTransitionLocation;
3973
+ readonly mode: WorldTransitionMode | 'auto';
3974
+ readonly crossPool: boolean;
3975
+ /** Trusted server recovery classification, not a player intention field. */
3976
+ readonly recovery: boolean;
3977
+ }
3978
+
3979
+ export declare const worldTransitionPolicySlotFixture: {
3980
+ kind: "slot";
3981
+ defaultImplementation: WorldTransitionPolicy;
3982
+ defaultProbe: {
3983
+ run: () => Effect.Effect< WorldTransitionMode, never, never>;
3984
+ expected: string;
3985
+ };
3986
+ overrideProbe: {
3987
+ run: () => Effect.Effect< WorldTransitionMode, never, never>;
3988
+ expected: string;
3989
+ };
3990
+ };
3991
+
3992
+ /** Actual provider owns SQL idempotency, current source authority, lease and commit. */
3993
+ declare class WorldTransitionPort extends WorldTransitionPort_base {
3994
+ }
3995
+
3996
+ declare const WorldTransitionPort_base: Context.ServiceClass<WorldTransitionPort, "@voltro/WorldTransitionPort", {
3997
+ transition(input: WorldTransitionRequest, origin: WorldTransitionOrigin): Effect.Effect<void, ProtocolError>;
3998
+ transitionGroup(input: WorldGroupTransitionRequest, origin: WorldTransitionOrigin): Effect.Effect<void, ProtocolError>;
3999
+ recover(input: {
4000
+ readonly entityId: string;
4001
+ }, origin: WorldTransitionOrigin): Effect.Effect<void, ProtocolError>;
4002
+ status(origin: WorldTransitionOrigin): Effect.Effect<WorldTransitionObservation, ProtocolError>;
4003
+ }>;
4004
+
4005
+ export declare const worldTransitionPortFixture: {
4006
+ kind: "port";
4007
+ tag: typeof WorldTransitionPort;
4008
+ fakeLayer: Layer.Layer<WorldTransitionPort, never, never>;
4009
+ probe: {
4010
+ run: () => Effect.Effect<"ProtocolError" | "unexpected-success", never, never>;
4011
+ expected: string;
4012
+ };
4013
+ };
4014
+
4015
+ declare type WorldTransitionRequest = typeof WorldTransitionRequestSchema.Type;
4016
+
4017
+ declare const WorldTransitionRequestSchema: Schema.Struct<{
4018
+ readonly entityId: Schema.String;
4019
+ readonly target: Schema.Union<readonly [Schema.Struct<{
4020
+ readonly kind: Schema.Literal<"cell">;
4021
+ readonly zone: Schema.String;
4022
+ readonly at: Schema.Tuple<readonly [Schema.Number, Schema.Number]>;
4023
+ }>, Schema.Struct<{
4024
+ readonly kind: Schema.Literal<"zone">;
4025
+ readonly zone: Schema.String;
4026
+ readonly at: Schema.Tuple<readonly [Schema.Number, Schema.Number]>;
4027
+ }>, Schema.Struct<{
4028
+ readonly kind: Schema.Literal<"layer">;
4029
+ readonly layer: Schema.Number;
4030
+ }>, Schema.Struct<{
4031
+ readonly kind: Schema.Literal<"world">;
4032
+ readonly world: Schema.String;
4033
+ readonly spawn: Schema.String;
4034
+ }>, Schema.Struct<{
4035
+ readonly kind: Schema.Literal<"instance">;
4036
+ readonly instance: Schema.String;
4037
+ readonly group: Schema.String;
4038
+ }>, Schema.Struct<{
4039
+ readonly kind: Schema.Literal<"return">;
4040
+ }>]>;
4041
+ readonly options: Schema.Struct<{
4042
+ readonly mode: Schema.Literals<readonly ["auto", "seamless", "portal"]>;
4043
+ readonly reason: Schema.String;
4044
+ readonly crossPool: Schema.Boolean;
4045
+ readonly returnTo: Schema.optional<Schema.Literal<"here">>;
4046
+ }>;
4047
+ }>;
4048
+
4049
+ declare interface WorldZone {
4050
+ readonly id: string;
4051
+ readonly bounds: WorldBounds;
4052
+ readonly room: string;
4053
+ readonly neighbors: ReadonlyArray<string>;
4054
+ readonly cells?: {
4055
+ readonly size: number;
4056
+ } | undefined;
4057
+ readonly layering?: WorldLayering;
4058
+ }
4059
+
4060
+ export { }