crowdypy 0.11.0.dev1__tar.gz → 0.12.0.dev1__tar.gz

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 (556) hide show
  1. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/AGENTS.md +21 -1
  2. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/MIGRATION.md +42 -0
  3. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/PKG-INFO +39 -1
  4. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/README.md +38 -0
  5. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/docs/compatibility.md +1 -1
  6. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/docs/e2e-coverage.md +2 -0
  7. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/docs/parity-matrix.md +105 -37
  8. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/pyproject.toml +7 -7
  9. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/unasync.py +11 -2
  10. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_concurrency.py +25 -1
  11. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/client.py +12 -1
  12. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/__init__.py +214 -0
  13. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/kit/actions.py +1 -1
  14. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/kit.py +175 -0
  15. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/mirror.py +340 -0
  16. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/__init__.py +3 -0
  17. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/matchmaking.py +140 -0
  18. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/npcs.py +121 -0
  19. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/presence.py +133 -0
  20. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/sessions.py +102 -0
  21. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/world.py +60 -0
  22. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/protocol.py +212 -0
  23. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/realtime.py +135 -0
  24. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/runtime.py +233 -0
  25. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/store.py +17 -0
  26. crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/topology.py +187 -0
  27. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/kit/wire.py +66 -3
  28. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_version.py +1 -1
  29. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/client.py +12 -1
  30. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/exec_gateway.py +9 -2
  31. crowdypy-0.12.0.dev1/src/crowdypy/kit/__init__.py +213 -0
  32. crowdypy-0.12.0.dev1/src/crowdypy/kit/kit.py +174 -0
  33. crowdypy-0.12.0.dev1/src/crowdypy/kit/mirror.py +358 -0
  34. crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/__init__.py +2 -0
  35. crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/matchmaking.py +139 -0
  36. crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/npcs.py +120 -0
  37. crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/presence.py +132 -0
  38. crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/sessions.py +101 -0
  39. crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/world.py +59 -0
  40. crowdypy-0.12.0.dev1/src/crowdypy/kit/protocol.py +218 -0
  41. crowdypy-0.12.0.dev1/src/crowdypy/kit/realtime.py +152 -0
  42. crowdypy-0.12.0.dev1/src/crowdypy/kit/runtime.py +263 -0
  43. crowdypy-0.12.0.dev1/src/crowdypy/kit/store.py +49 -0
  44. crowdypy-0.12.0.dev1/src/crowdypy/kit/topology.py +197 -0
  45. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/kit/wire.py +86 -2
  46. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/schemas.v1.json +2 -2
  47. crowdypy-0.12.0.dev1/tests/fixtures/kit-protocol.json +2360 -0
  48. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/player-host.v1.json +2 -2
  49. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_fixture_provenance.py +4 -1
  50. crowdypy-0.12.0.dev1/tests/unit/test_kit_protocol.py +736 -0
  51. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tools/parity/classifications.toml +2 -0
  52. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tools/parity/parity.py +1 -1
  53. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/uv.lock +1 -1
  54. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/CMakeLists.txt +1 -1
  55. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/PROVENANCE.md +1 -1
  56. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/crowdy.hpp +1 -1
  57. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/exec.hpp +12 -6
  58. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/actions.hpp +4 -4
  59. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +142 -0
  60. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/mirror.hpp +149 -0
  61. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/modules.hpp +339 -0
  62. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/protocol.hpp +159 -0
  63. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/realtime.hpp +82 -0
  64. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/runtime.hpp +103 -0
  65. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/topology.hpp +84 -0
  66. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/wire.hpp +94 -17
  67. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/package.json +3 -3
  68. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/domains/exec.cpp +21 -9
  69. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/mirror.cpp +541 -0
  70. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/modules.cpp +389 -0
  71. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/protocol.cpp +167 -0
  72. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/runtime.cpp +482 -0
  73. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/topology.cpp +237 -0
  74. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdy-studio-diagnostics.v1.json +2 -2
  75. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdyjs-studio-layout.v1.json +2 -2
  76. crowdypy-0.12.0.dev1/vendor/CrowdyCPP/tools/parity/fixtures/kit-protocol.json +2360 -0
  77. crowdypy-0.11.0.dev1/src/crowdypy/_sync/kit/__init__.py +0 -102
  78. crowdypy-0.11.0.dev1/src/crowdypy/_sync/kit/kit.py +0 -36
  79. crowdypy-0.11.0.dev1/src/crowdypy/kit/__init__.py +0 -101
  80. crowdypy-0.11.0.dev1/src/crowdypy/kit/kit.py +0 -35
  81. crowdypy-0.11.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +0 -48
  82. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/.gitattributes +0 -0
  83. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/.gitignore +0 -0
  84. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/.gitleaks.toml +0 -0
  85. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/CMakeLists.txt +0 -0
  86. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/LICENSE +0 -0
  87. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/SECURITY.md +0 -0
  88. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/benchmarks/README.md +0 -0
  89. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/benchmarks/bench_replication.py +0 -0
  90. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/licenses/OpenSSL-LICENSE.txt +0 -0
  91. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/common.hpp +0 -0
  92. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/module.cpp +0 -0
  93. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/replication.hpp +0 -0
  94. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/replication_binding.cpp +0 -0
  95. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/session_binding.cpp +0 -0
  96. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/voice_binding.cpp +0 -0
  97. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/wire_binding.cpp +0 -0
  98. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/Actor.graphql +0 -0
  99. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/Actors.graphql +0 -0
  100. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/BatchLookupActors.graphql +0 -0
  101. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/CreateActor.graphql +0 -0
  102. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/DeleteActor.graphql +0 -0
  103. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/UpdateActor.graphql +0 -0
  104. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/UpdateActorState.graphql +0 -0
  105. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/AppAccessTiers.graphql +0 -0
  106. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/AppFeatures.graphql +0 -0
  107. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/AppGrantMemberCandidates.graphql +0 -0
  108. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/AppUserAccessByApp.graphql +0 -0
  109. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/ArchiveAccessTier.graphql +0 -0
  110. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/ClaimFreeAppAccess.graphql +0 -0
  111. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/CreateAccessTier.graphql +0 -0
  112. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/DefineAppFeature.graphql +0 -0
  113. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/GrantAppAccess.graphql +0 -0
  114. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/GrantMyAppAccess.graphql +0 -0
  115. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/GrantTierFeature.graphql +0 -0
  116. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/MyAppAccess.graphql +0 -0
  117. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/RevokeAppAccess.graphql +0 -0
  118. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/RevokeTierFeature.graphql +0 -0
  119. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/RuntimePermissions.graphql +0 -0
  120. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/SuspendAppAccess.graphql +0 -0
  121. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/TierFeatures.graphql +0 -0
  122. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/UpdateAccessTier.graphql +0 -0
  123. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/App.graphql +0 -0
  124. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/AppBySlug.graphql +0 -0
  125. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/AppDiscovery.graphql +0 -0
  126. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/AppsForOrg.graphql +0 -0
  127. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/ArchiveApp.graphql +0 -0
  128. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/CodeAdmissions.graphql +0 -0
  129. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/CreateApp.graphql +0 -0
  130. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/MarketplaceApps.graphql +0 -0
  131. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/MyApps.graphql +0 -0
  132. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/PlaceableDatacenters.graphql +0 -0
  133. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/UpdateApp.graphql +0 -0
  134. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/auth/Logout.graphql +0 -0
  135. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/auth/LogoutAllDevices.graphql +0 -0
  136. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/avatars/Avatars.graphql +0 -0
  137. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/AppBudget.graphql +0 -0
  138. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/AppBudgets.graphql +0 -0
  139. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/SetAppBudget.graphql +0 -0
  140. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/WalletBalance.graphql +0 -0
  141. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/WalletTransactions.graphql +0 -0
  142. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/AddChannelMember.graphql +0 -0
  143. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/BanChannelMember.graphql +0 -0
  144. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/Channel.graphql +0 -0
  145. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/ChannelMembers.graphql +0 -0
  146. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/ChannelPolicy.graphql +0 -0
  147. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/ChannelRoles.graphql +0 -0
  148. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/Channels.graphql +0 -0
  149. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/CreateChannel.graphql +0 -0
  150. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/CreateChannelRole.graphql +0 -0
  151. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/DeleteChannel.graphql +0 -0
  152. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/DeleteChannelRole.graphql +0 -0
  153. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/JoinChannel.graphql +0 -0
  154. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/LeaveChannel.graphql +0 -0
  155. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/MyChannels.graphql +0 -0
  156. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/RemoveChannelMember.graphql +0 -0
  157. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/RequestToJoinChannel.graphql +0 -0
  158. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/SetChannelMemberRoles.graphql +0 -0
  159. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/SetChannelPolicy.graphql +0 -0
  160. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/UnbanChannelMember.graphql +0 -0
  161. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/UpdateChannel.graphql +0 -0
  162. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/UpdateChannelRole.graphql +0 -0
  163. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/GetChunk.graphql +0 -0
  164. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/GetChunkLods.graphql +0 -0
  165. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/GetChunksByDistance.graphql +0 -0
  166. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/GetVoxelList.graphql +0 -0
  167. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/UpdateChunk.graphql +0 -0
  168. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/UpdateChunkLods.graphql +0 -0
  169. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/UpdateChunkState.graphql +0 -0
  170. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/crowdyStudio/CrowdyStudio.graphql +0 -0
  171. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/exec/Exec.graphql +0 -0
  172. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/gameApps/GameApps.graphql +0 -0
  173. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/grids/CreateGridChannel.graphql +0 -0
  174. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/grids/GridChannels.graphql +0 -0
  175. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/grids/MintGridToken.graphql +0 -0
  176. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/host/Host.graphql +0 -0
  177. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/inputLog/InputLogMessages.graphql +0 -0
  178. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/inputLog/InputLogSessions.graphql +0 -0
  179. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/marketplace/Marketplace.graphql +0 -0
  180. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/CreateOrgRole.graphql +0 -0
  181. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/CreateOrgToken.graphql +0 -0
  182. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/CreateOrganization.graphql +0 -0
  183. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/DeleteOrgRole.graphql +0 -0
  184. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/InviteOrgMember.graphql +0 -0
  185. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/MemberRoles.graphql +0 -0
  186. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/MyOrganizations.graphql +0 -0
  187. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrgMembers.graphql +0 -0
  188. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrgPermissions.graphql +0 -0
  189. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrgRoles.graphql +0 -0
  190. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrgTokens.graphql +0 -0
  191. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/Organization.graphql +0 -0
  192. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrganizationBySlug.graphql +0 -0
  193. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/RemoveOrgMember.graphql +0 -0
  194. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/RevokeOrgToken.graphql +0 -0
  195. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/UpdateOrgMemberRoles.graphql +0 -0
  196. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/UpdateOrgRole.graphql +0 -0
  197. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/UpdateOrgToken.graphql +0 -0
  198. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/payments/CapturePaypalCheckout.graphql +0 -0
  199. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/payments/CreateCheckout.graphql +0 -0
  200. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/payments/MyCheckouts.graphql +0 -0
  201. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/platform/PlatformConfig.graphql +0 -0
  202. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/playerWallet/PlayerWallet.graphql +0 -0
  203. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/DeleteQuota.graphql +0 -0
  204. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/EffectiveQuota.graphql +0 -0
  205. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/QuotasForApp.graphql +0 -0
  206. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/QuotasForOrg.graphql +0 -0
  207. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/SetQuota.graphql +0 -0
  208. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/ActiveGraphQLServers.graphql +0 -0
  209. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/GameClientBootstrap.graphql +0 -0
  210. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/GraphqlServers.graphql +0 -0
  211. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/ServerWithLeastClients.graphql +0 -0
  212. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/VersionInfo.graphql +0 -0
  213. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/sharedEnvironment/SharedEnvironment.graphql +0 -0
  214. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/state/DeleteUserAppState.graphql +0 -0
  215. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/state/UpdateUserAppState.graphql +0 -0
  216. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/state/UserAppState.graphql +0 -0
  217. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/state/UserAppStates.graphql +0 -0
  218. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/AddTeamMember.graphql +0 -0
  219. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/BanTeamMember.graphql +0 -0
  220. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/CreateTeam.graphql +0 -0
  221. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/CreateTeamRole.graphql +0 -0
  222. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/DeleteTeam.graphql +0 -0
  223. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/DeleteTeamRole.graphql +0 -0
  224. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/JoinTeam.graphql +0 -0
  225. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/LeaveTeam.graphql +0 -0
  226. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/MyTeams.graphql +0 -0
  227. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/RemoveTeamMember.graphql +0 -0
  228. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/RequestToJoinTeam.graphql +0 -0
  229. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/SetTeamMemberRoles.graphql +0 -0
  230. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/SetTeamPolicy.graphql +0 -0
  231. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/Team.graphql +0 -0
  232. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/TeamMembers.graphql +0 -0
  233. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/TeamPolicy.graphql +0 -0
  234. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/TeamRoles.graphql +0 -0
  235. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/Teams.graphql +0 -0
  236. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/UnbanTeamMember.graphql +0 -0
  237. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/UpdateTeam.graphql +0 -0
  238. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/UpdateTeamRole.graphql +0 -0
  239. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teleport/TeleportRequest.graphql +0 -0
  240. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/usage/AppGraphqlOperations.graphql +0 -0
  241. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/usage/AppUsageSummary.graphql +0 -0
  242. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/usage/PlayerPulse.graphql +0 -0
  243. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/DeleteMyAccount.graphql +0 -0
  244. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/FreePlayWindow.graphql +0 -0
  245. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/Me.graphql +0 -0
  246. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/PlayerProfile.graphql +0 -0
  247. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/UpdateGamertag.graphql +0 -0
  248. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/UpdateUserState.graphql +0 -0
  249. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/User.graphql +0 -0
  250. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/ListVoxelUpdatesByDistance.graphql +0 -0
  251. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/ListVoxels.graphql +0 -0
  252. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/RollbackVoxelUpdates.graphql +0 -0
  253. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/UpdateVoxel.graphql +0 -0
  254. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/VoxelUpdateHistory.graphql +0 -0
  255. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/schema.gql +0 -0
  256. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/_pins.py +0 -0
  257. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/assert_default_origin.py +0 -0
  258. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/build_openssl.sh +0 -0
  259. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/check_content_policy.py +0 -0
  260. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/check_pin_tiers.py +0 -0
  261. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/cibw_before_all_linux.sh +0 -0
  262. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/resolve-release-tier.sh +0 -0
  263. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/resolve-release-tier.test.sh +0 -0
  264. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/resolve_pypi_version.py +0 -0
  265. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/stamp_version.py +0 -0
  266. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/verify_artifacts.py +0 -0
  267. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/codegen.py +0 -0
  268. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/schema_drift.py +0 -0
  269. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/schema_sync.py +0 -0
  270. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/vendor_crowdycpp.py +0 -0
  271. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/__init__.py +0 -0
  272. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_default_origin.py +0 -0
  273. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_generated/__init__.py +0 -0
  274. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_generated/enums.py +0 -0
  275. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_generated/inputs.py +0 -0
  276. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_generated/operations.py +0 -0
  277. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_grid.py +0 -0
  278. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_native.pyi +0 -0
  279. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_operation.py +0 -0
  280. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/__init__.py +0 -0
  281. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/__init__.py +0 -0
  282. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/_base.py +0 -0
  283. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/actors.py +0 -0
  284. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/admin.py +0 -0
  285. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/app_access.py +0 -0
  286. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/apps.py +0 -0
  287. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/auth.py +0 -0
  288. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/avatars.py +0 -0
  289. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/billing.py +0 -0
  290. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/channels.py +0 -0
  291. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/chunks.py +0 -0
  292. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio.py +0 -0
  293. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio_agent.py +0 -0
  294. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio_github.py +0 -0
  295. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/discovery.py +0 -0
  296. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/exec.py +0 -0
  297. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/game_apps.py +0 -0
  298. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/grids.py +0 -0
  299. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/host.py +0 -0
  300. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/input_log.py +0 -0
  301. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/marketplace.py +0 -0
  302. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/organizations.py +0 -0
  303. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/payments.py +0 -0
  304. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/platform.py +0 -0
  305. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/player_wallet.py +0 -0
  306. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/portal.py +0 -0
  307. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/quotas.py +0 -0
  308. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/server_status.py +0 -0
  309. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/shared_environment.py +0 -0
  310. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/state.py +0 -0
  311. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/teams.py +0 -0
  312. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/teleport.py +0 -0
  313. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/udp.py +0 -0
  314. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/usage.py +0 -0
  315. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/users.py +0 -0
  316. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/voxels.py +0 -0
  317. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/graphql.py +0 -0
  318. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/grid_scope.py +0 -0
  319. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/kit/social.py +0 -0
  320. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/rediscover.py +0 -0
  321. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/stores.py +0 -0
  322. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/world.py +0 -0
  323. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/auth_state.py +0 -0
  324. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/codecs.py +0 -0
  325. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/datacenter_redirect.py +0 -0
  326. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/__init__.py +0 -0
  327. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/_base.py +0 -0
  328. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/actors.py +0 -0
  329. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/admin.py +0 -0
  330. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/app_access.py +0 -0
  331. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/apps.py +0 -0
  332. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/auth.py +0 -0
  333. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/avatars.py +0 -0
  334. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/billing.py +0 -0
  335. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/channels.py +0 -0
  336. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/chunks.py +0 -0
  337. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/crowdy_studio.py +0 -0
  338. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/crowdy_studio_agent.py +0 -0
  339. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/crowdy_studio_github.py +0 -0
  340. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/discovery.py +0 -0
  341. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/exec.py +0 -0
  342. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/game_apps.py +0 -0
  343. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/grids.py +0 -0
  344. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/host.py +0 -0
  345. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/input_log.py +0 -0
  346. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/marketplace.py +0 -0
  347. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/organizations.py +0 -0
  348. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/payments.py +0 -0
  349. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/platform.py +0 -0
  350. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/player_wallet.py +0 -0
  351. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/portal.py +0 -0
  352. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/quotas.py +0 -0
  353. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/server_status.py +0 -0
  354. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/shared_environment.py +0 -0
  355. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/state.py +0 -0
  356. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/teams.py +0 -0
  357. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/teleport.py +0 -0
  358. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/udp.py +0 -0
  359. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/usage.py +0 -0
  360. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/users.py +0 -0
  361. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/voxels.py +0 -0
  362. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/enums.py +0 -0
  363. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/errors.py +0 -0
  364. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/estate.py +0 -0
  365. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/graphql.py +0 -0
  366. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/grid_scope.py +0 -0
  367. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/inputs.py +0 -0
  368. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/kit/actions.py +0 -0
  369. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/kit/social.py +0 -0
  370. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/lb_cookie.py +0 -0
  371. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/media.py +0 -0
  372. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/pkce.py +0 -0
  373. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/__init__.py +0 -0
  374. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/agent_errors.py +0 -0
  375. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/agent_types.py +0 -0
  376. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/json_schema.py +0 -0
  377. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/schemas.py +0 -0
  378. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/types.py +0 -0
  379. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/py.typed +0 -0
  380. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/rediscover.py +0 -0
  381. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/replication.py +0 -0
  382. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/session.py +0 -0
  383. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/stores.py +0 -0
  384. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/__init__.py +0 -0
  385. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/client_tick_interval.py +0 -0
  386. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/controller.py +0 -0
  387. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/diagnostics.py +0 -0
  388. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/github_new_repo.py +0 -0
  389. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/layout.py +0 -0
  390. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/models.py +0 -0
  391. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/starter_projects.py +0 -0
  392. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/subscriptions.py +0 -0
  393. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/sync.py +0 -0
  394. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/utils.py +0 -0
  395. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/wire.py +0 -0
  396. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/world.py +0 -0
  397. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/conftest.py +0 -0
  398. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/__init__.py +0 -0
  399. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/conftest.py +0 -0
  400. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_identity.py +0 -0
  401. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_input_log.py +0 -0
  402. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_open_grid_exec_gateway.py +0 -0
  403. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_ranged_channel.py +0 -0
  404. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_replication.py +0 -0
  405. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_studio.py +0 -0
  406. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_world.py +0 -0
  407. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_world_data.py +0 -0
  408. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/README.md +0 -0
  409. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/binary-wire-fixtures.json +0 -0
  410. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/exec-client-frames.json +0 -0
  411. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/voice-frames.json +0 -0
  412. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/__init__.py +0 -0
  413. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/__init__.py +0 -0
  414. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_crowdycpp_roots.py +0 -0
  415. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_input_log_reads.py +0 -0
  416. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_org_domains.py +0 -0
  417. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_social_domains.py +0 -0
  418. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_studio_exec_domains.py +0 -0
  419. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_world_domains.py +0 -0
  420. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_check_pin_tiers.py +0 -0
  421. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_core.py +0 -0
  422. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_durable_stores.py +0 -0
  423. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_estate_moves.py +0 -0
  424. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_exec_gateway.py +0 -0
  425. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_grid_scope.py +0 -0
  426. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_kit.py +0 -0
  427. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_lazy_exports.py +0 -0
  428. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_player_host.py +0 -0
  429. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_refusals.py +0 -0
  430. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_release_versions.py +0 -0
  431. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_replication.py +0 -0
  432. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_sdk_audience.py +0 -0
  433. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_studio_controller.py +0 -0
  434. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_studio_diagnostics.py +0 -0
  435. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_studio_layout.py +0 -0
  436. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_subscriptions.py +0 -0
  437. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_transport.py +0 -0
  438. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_udp_api.py +0 -0
  439. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_voice_frames.py +0 -0
  440. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_wire.py +0 -0
  441. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_world_session.py +0 -0
  442. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tools/e2e/provision.py +0 -0
  443. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tools/fixtures/player_host.mjs +0 -0
  444. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/LICENSE +0 -0
  445. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/cmake/CheckPublicHeaders.cmake +0 -0
  446. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/cmake/CrowdyCPPConfig.cmake.in +0 -0
  447. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/cmake/CrowdyFindOpus.cmake +0 -0
  448. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/cmake/studio_layout_fixture.hpp.in +0 -0
  449. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/client.hpp +0 -0
  450. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/base64.hpp +0 -0
  451. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/bytes.hpp +0 -0
  452. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/clock.hpp +0 -0
  453. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/crypto.hpp +0 -0
  454. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/logger.hpp +0 -0
  455. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/result.hpp +0 -0
  456. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/spsc.hpp +0 -0
  457. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/uuid.hpp +0 -0
  458. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/default_origin.hpp +0 -0
  459. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/admin.hpp +0 -0
  460. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/auth.hpp +0 -0
  461. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio.hpp +0 -0
  462. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_agent.hpp +0 -0
  463. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_github.hpp +0 -0
  464. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/discovery.hpp +0 -0
  465. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/domain_base.hpp +0 -0
  466. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/game_apps.hpp +0 -0
  467. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/grids.hpp +0 -0
  468. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/groups.hpp +0 -0
  469. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/marketplace.hpp +0 -0
  470. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/player_wallet.hpp +0 -0
  471. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/portal.hpp +0 -0
  472. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/realtime_control.hpp +0 -0
  473. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/server_status.hpp +0 -0
  474. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/types.hpp +0 -0
  475. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/users.hpp +0 -0
  476. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/world_data.hpp +0 -0
  477. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/generated/enums.hpp +0 -0
  478. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/generated/operations.hpp +0 -0
  479. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/async_scope.hpp +0 -0
  480. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/auth_state.hpp +0 -0
  481. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/cancel.hpp +0 -0
  482. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/datacenter_redirect.hpp +0 -0
  483. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/dispatcher.hpp +0 -0
  484. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/errors.hpp +0 -0
  485. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/estate.hpp +0 -0
  486. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/graphql_client.hpp +0 -0
  487. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/http.hpp +0 -0
  488. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/json.hpp +0 -0
  489. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/rediscover.hpp +0 -0
  490. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/subscription_client.hpp +0 -0
  491. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/websocket.hpp +0 -0
  492. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/social.hpp +0 -0
  493. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/opus.hpp +0 -0
  494. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/video_frames.hpp +0 -0
  495. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/voice_frames.hpp +0 -0
  496. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/adapter.hpp +0 -0
  497. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/player_host.hpp +0 -0
  498. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/schemas.hpp +0 -0
  499. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/types.hpp +0 -0
  500. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/connection.hpp +0 -0
  501. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/session_provider.hpp +0 -0
  502. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/types.hpp +0 -0
  503. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/udp_socket.hpp +0 -0
  504. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/chunk_store.hpp +0 -0
  505. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/codec.hpp +0 -0
  506. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/durable.hpp +0 -0
  507. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/keys.hpp +0 -0
  508. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/stores.hpp +0 -0
  509. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/world_session.hpp +0 -0
  510. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/controller.hpp +0 -0
  511. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/diagnostics.hpp +0 -0
  512. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/editor.hpp +0 -0
  513. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github.hpp +0 -0
  514. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github_layout.hpp +0 -0
  515. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/integration.hpp +0 -0
  516. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/layout.hpp +0 -0
  517. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/models.hpp +0 -0
  518. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/runtime.hpp +0 -0
  519. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/wire/codec.hpp +0 -0
  520. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/wire/protocol.hpp +0 -0
  521. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/world.hpp +0 -0
  522. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/client.cpp +0 -0
  523. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/base64.cpp +0 -0
  524. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/clock.cpp +0 -0
  525. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/crypto_default_unavailable.cpp +0 -0
  526. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/crypto_openssl.cpp +0 -0
  527. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/crypto_unavailable.cpp +0 -0
  528. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/logger.cpp +0 -0
  529. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/uuid.cpp +0 -0
  530. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/async_transport.cpp +0 -0
  531. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/auth_state.cpp +0 -0
  532. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/error_extensions.hpp +0 -0
  533. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/errors.cpp +0 -0
  534. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/graphql_client.cpp +0 -0
  535. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/http_curl.cpp +0 -0
  536. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/http_none.cpp +0 -0
  537. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/json.cpp +0 -0
  538. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/subscription_client.cpp +0 -0
  539. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/websocket_curl.cpp +0 -0
  540. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/websocket_none.cpp +0 -0
  541. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/media/opus.cpp +0 -0
  542. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/player_host/schemas.cpp +0 -0
  543. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/player_host/types.cpp +0 -0
  544. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/replication/connection.cpp +0 -0
  545. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/replication/socket_errors.hpp +0 -0
  546. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/replication/udp_socket.cpp +0 -0
  547. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/session/world_session.cpp +0 -0
  548. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/studio/diagnostics.cpp +0 -0
  549. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/studio/editor.cpp +0 -0
  550. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/studio/integration.cpp +0 -0
  551. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/LICENSE +0 -0
  552. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.c +0 -0
  553. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.h +0 -0
  554. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-client-frames.json +0 -0
  555. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-gateway-cases.json +0 -0
  556. {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/voice-frames.json +0 -0
@@ -85,7 +85,11 @@ release re-reads the published wheel.
85
85
 
86
86
  ## Gates
87
87
 
88
- CI (`.github/workflows/ci.yml`) runs all of these; run them before pushing:
88
+ CI (`.github/workflows/ci.yml`) runs all of these; run them before pushing. CI's `mypy` runs
89
+ without the project installed (`uv sync --group dev --no-install-project`), so it follows
90
+ imports into the generated `_sync/` and checks it too; an editable install hides that, so
91
+ reproduce CI's run in a venv of its own (`UV_PROJECT_ENVIRONMENT=/tmp/lint uv sync --frozen
92
+ --group dev --no-install-project`, then `uv run --no-sync mypy` with the same variable).
89
93
 
90
94
  ```bash
91
95
  ruff check . && ruff format --check . && mypy
@@ -134,6 +138,22 @@ re-run takes the next N (`scripts/ci/resolve_pypi_version.py` reads what PyPI al
134
138
  Merging a PR from the command line: `gh pr merge` fails its preflight on this org, so use
135
139
  `gh api -X PUT repos/CrowdedKingdoms/CrowdyPy/pulls/<n>/merge -f merge_method=merge`.
136
140
 
141
+ ## The Game Kit
142
+
143
+ `src/crowdypy/kit/` is the client half of `ckx_sdk::kit`, ported from CrowdyJS `src/kit/` (the
144
+ parity gate reads `src/kit/modules/` too since 0.12.0): one `KitRuntime` per kit, mirrors
145
+ (`mirror.py`), the typed modules (`modules/`), `topology.py` and `realtime.py`. It is async source
146
+ like the rest of the client, so `scripts/unasync.py` generates the blocking kit, and it may use no
147
+ asyncio beyond `asyncio.sleep`. **A push or reconnect handler never waits on a call.** The
148
+ blocking `ExecConnection` runs them on its reader thread, so a call made there would wait on a
149
+ reply only that thread can read: a mirror starts its resync with `run_detached`, which unasync
150
+ maps to `run_in_thread` (`run_soon` would become `run_now`, inline). Periodic work (a queue's
151
+ `watch`, a spectator's `run`) is a loop the game starts beside itself. The protocol is held to
152
+ ck-exec's golden record, `tests/fixtures/kit-protocol.json`, copied from CrowdyJS at the pin
153
+ (`test_fixture_provenance.py` and the vendored CrowdyCPP copy hold it):
154
+ `tests/unit/test_kit_protocol.py` replays each starter's script through a gateway that answers
155
+ only the next recorded step, with both clients.
156
+
137
157
  ## Performance rules for the native binding
138
158
 
139
159
  The replication system saturates the local network stack, so the binding
@@ -3,6 +3,48 @@
3
3
  CrowdyPy is pre-1.0. Within a minor line, patch releases keep source compatibility; each
4
4
  new minor may change the API. Read the section for every minor you skip.
5
5
 
6
+ ## 0.12.0
7
+
8
+ CrowdyJS 18.11.0 and CrowdyCPP 0.64.0. Additive. The kit's typed clients drive the ck-exec
9
+ starter hubs, whose server half is `ckx_sdk::kit` (ckx-sdk 0.10.0): the tier's compute toolchain
10
+ must carry it (dev's v1.12.0 does) and the app must run the starters (`kit.topology.deploy`).
11
+
12
+ - **The modules.** `kit.world` (`conditions` and `nodes` mirrored; `state`, `harvest`, and
13
+ `schedule` / `cancel` for developers), `kit.matchmaking.queue(name)` (`join(rating, party=...,
14
+ leader=...)`, `leave`, `accept`, `decline`, `status`, `configure`, `place`, `watch` / `unwatch`,
15
+ `on_matched`), `kit.sessions.open(key)` (`watch`, `join`, `ready`, `start_game`, `act`,
16
+ `configure`, `current_turn`, `is_my_turn`, `state` mirrored), `kit.npcs.area(key)` /
17
+ `area_at(x, z)` (`mobs`, `npcs`, `pets`, `attack`, `talk`, `adopt`, `rename`, `summon`,
18
+ `dismiss`, `release`, `my_pets`), `kit.topology` (`pack`, `types`, `plan(select,
19
+ overrides=...)`, `deploy`; `kit_manifest_problems`), `kit.spectate.observe(uuid, chunk)` (a
20
+ heartbeat to `run()` beside the game), `kit.emotes` (`send`, `parse`: client event 101 with
21
+ `{"emote", "targetUuid"}`) and `kit.shards`. Replies are the hub's msgpack as Python values:
22
+ snake_case keys as the hub sends them, and a hub's integer-keyed maps (a session's `scores`) keep
23
+ integer keys.
24
+ - **Refusals.** A hub's `kit:<code>:` refusal raises `KitError` (a `CrowdyExecError` with status
25
+ `AppError`): branch on `code`, show `text`. `KitError.from_error` and `kit_error_code` read one
26
+ out of any exec error.
27
+ - **The runtime.** `kit.runtime` (`KitRuntime`) is one exec connection for every module, opened
28
+ on first use: as the player with an app token, or as a developer with `developer=True`. It paces
29
+ what it sends to `call_budget` (100) a `budget_window_ms` (10 s), holds as long as a `Busy` "rate
30
+ limited" refusal says, sends a call again when it did not run (`Busy`, `RateLimited`) or when it
31
+ carries an action id and its outcome is unknown (`DeadlineExceeded`, `Unavailable`, `Moved`), at
32
+ most `retries` (2) times, and refuses a 257th subscription with code `limit`. `call(...,
33
+ action=True)` sends a fresh `action_id` the hub answers once.
34
+ - **Mirrors.** `HubState`, `CollectionMirror` (`list`, `member`), `PrivateState` (read with a
35
+ caller-scoped call, again on a `changed` that names the player) and `WritableKitStore`. A mirror
36
+ takes a new snapshot on another epoch, a gap in a collection's `seq`, and a reconnect. In the
37
+ blocking client the resync a push or a reconnect starts runs on a thread of its own
38
+ (`run_detached`), because those handlers run on the connection's reader thread.
39
+ - **Realtime.** `decode_kit_actor_state` and `kit_actor_lanes` for the actors hubs show,
40
+ `KIT_EVENT_TYPES`, `parse_kit_server_event`; `crowdypy.kit.wire` adds events 99 (encounter), 100
41
+ (possession) and 101 (emote) with their parsers and `EVENT_APP_FIRST` (1000).
42
+ - **Exec reconnects** wait half their backoff plus up to as much again at random, in both
43
+ connections, so the players of a host that went away do not all dial at once.
44
+ - `tests/fixtures/kit-protocol.json` is ck-exec's golden record of the starters (by way of
45
+ CrowdyJS); `tests/unit/test_kit_protocol.py` replays it through a gateway that answers only the
46
+ next recorded step, with both clients. The parity gate reads CrowdyJS `src/kit/modules/` too.
47
+
6
48
  ## 0.11.0
7
49
 
8
50
  CrowdyJS 18.10.0 and CrowdyCPP 0.63.0. Additive.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crowdypy
3
- Version: 0.11.0.dev1
3
+ Version: 0.12.0.dev1
4
4
  Summary: Official Python SDK for Crowded Kingdoms: typed GraphQL clients and a native UDP replication core
5
5
  Keywords: crowded-kingdoms,multiplayer,replication,graphql,sdk,udp
6
6
  Author: Crowded Kingdoms
@@ -51,6 +51,17 @@ CrowdyPy follows the [CrowdyJS](https://github.com/CrowdedKingdoms/CrowdyJS) API
51
51
  client, bound with [nanobind](https://github.com/wjakob/nanobind) and shipped inside the
52
52
  wheel. Python never touches a datagram.
53
53
 
54
+ **v0.12.0: the Game Kit on ck-exec (CrowdyJS 18.11.0, CrowdyCPP 0.64.0).** `client.kit(app_id)`
55
+ gains typed clients for the ck-exec starter hubs, the client half of the game kit whose server
56
+ half is `ckx_sdk::kit`: `kit.world` (conditions and resource nodes mirrored, harvests, liveops for
57
+ developers), `kit.matchmaking.queue(name)` (parties matched whole), `kit.sessions.open(key)` (lobby
58
+ to result), `kit.npcs.area(key)` (mobs, NPCs, players' pets), `kit.topology` (compose, check, build
59
+ and deploy the starters), and `kit.spectate`, `kit.emotes` and `kit.shards`. They share one exec
60
+ connection (`kit.runtime`) that paces calls under the gateway's limit, resends only what is safe
61
+ and mirrors topics with resync on gaps, epochs and reconnects; a hub's refusal is a `KitError`
62
+ with its `code`. Both clients have it: the blocking one runs a mirror's resync beside the
63
+ connection's reader thread. Exec reconnects wait with jitter. See [MIGRATION.md](MIGRATION.md).
64
+
54
65
  **v0.11.0: access that ends ends for good, and channel and team bans (CrowdyJS 18.10.0, CrowdyCPP
55
66
  0.63.0).** A host's `4403` close (ck-exec 0.16: the player was suspended, revoked, signed out or
56
67
  blocked) is final: `ExecConnection.on_access_ended` hears the reason, the call in flight fails
@@ -300,6 +311,33 @@ cannot hold (a type outside 0-255, a position outside 0-15) is kept in the chunk
300
311
  applied a second time. A game with other addressing reads every edit from
301
312
  `session.on("voxel_update", ...)`, which includes those echoes.
302
313
 
314
+ ## Game Kit
315
+
316
+ `client.kit(app_id)` drives the ck-exec starter hubs (the server half is `ckx_sdk::kit`), with
317
+ the same modules as CrowdyJS's `client.kit(appId)`:
318
+
319
+ ```python
320
+ kit = game.kit(app_id)
321
+ await kit.world.conditions.start() # mirrored: time of day, weather, liveops modifiers
322
+ queue = kit.matchmaking.queue("ranked")
323
+ queue.on_matched(lambda session: print("matched into", session))
324
+ await queue.join(1200)
325
+ watching = asyncio.create_task(queue.watch()) # asks while the player waits
326
+ try:
327
+ await kit.npcs.area_at(12, -3).attack(4)
328
+ except KitError as e:
329
+ if e.code == "cooldown":
330
+ ...
331
+ ```
332
+
333
+ `kit.world`, `kit.matchmaking`, `kit.sessions`, `kit.npcs` and `kit.topology` (compose, check,
334
+ build and deploy the starters) share one exec connection (`kit.runtime`): it paces calls under the
335
+ gateway's 120 per 10 s, sends a call again only when that is safe (it did not run, or it carries
336
+ an `action_id` the hub answers once), and its mirrors (`HubState`, `CollectionMirror`,
337
+ `PrivateState`) take a new snapshot after a gap, another epoch or a reconnect. `kit.spectate`,
338
+ `kit.emotes` and `kit.shards` are the client conventions, and `kit.social` the parties, guilds and
339
+ chat rooms. The blocking client's kit is the same, with blocking calls.
340
+
303
341
  ## Crowdy Studio
304
342
 
305
343
  ```python
@@ -11,6 +11,17 @@ CrowdyPy follows the [CrowdyJS](https://github.com/CrowdedKingdoms/CrowdyJS) API
11
11
  client, bound with [nanobind](https://github.com/wjakob/nanobind) and shipped inside the
12
12
  wheel. Python never touches a datagram.
13
13
 
14
+ **v0.12.0: the Game Kit on ck-exec (CrowdyJS 18.11.0, CrowdyCPP 0.64.0).** `client.kit(app_id)`
15
+ gains typed clients for the ck-exec starter hubs, the client half of the game kit whose server
16
+ half is `ckx_sdk::kit`: `kit.world` (conditions and resource nodes mirrored, harvests, liveops for
17
+ developers), `kit.matchmaking.queue(name)` (parties matched whole), `kit.sessions.open(key)` (lobby
18
+ to result), `kit.npcs.area(key)` (mobs, NPCs, players' pets), `kit.topology` (compose, check, build
19
+ and deploy the starters), and `kit.spectate`, `kit.emotes` and `kit.shards`. They share one exec
20
+ connection (`kit.runtime`) that paces calls under the gateway's limit, resends only what is safe
21
+ and mirrors topics with resync on gaps, epochs and reconnects; a hub's refusal is a `KitError`
22
+ with its `code`. Both clients have it: the blocking one runs a mirror's resync beside the
23
+ connection's reader thread. Exec reconnects wait with jitter. See [MIGRATION.md](MIGRATION.md).
24
+
14
25
  **v0.11.0: access that ends ends for good, and channel and team bans (CrowdyJS 18.10.0, CrowdyCPP
15
26
  0.63.0).** A host's `4403` close (ck-exec 0.16: the player was suspended, revoked, signed out or
16
27
  blocked) is final: `ExecConnection.on_access_ended` hears the reason, the call in flight fails
@@ -260,6 +271,33 @@ cannot hold (a type outside 0-255, a position outside 0-15) is kept in the chunk
260
271
  applied a second time. A game with other addressing reads every edit from
261
272
  `session.on("voxel_update", ...)`, which includes those echoes.
262
273
 
274
+ ## Game Kit
275
+
276
+ `client.kit(app_id)` drives the ck-exec starter hubs (the server half is `ckx_sdk::kit`), with
277
+ the same modules as CrowdyJS's `client.kit(appId)`:
278
+
279
+ ```python
280
+ kit = game.kit(app_id)
281
+ await kit.world.conditions.start() # mirrored: time of day, weather, liveops modifiers
282
+ queue = kit.matchmaking.queue("ranked")
283
+ queue.on_matched(lambda session: print("matched into", session))
284
+ await queue.join(1200)
285
+ watching = asyncio.create_task(queue.watch()) # asks while the player waits
286
+ try:
287
+ await kit.npcs.area_at(12, -3).attack(4)
288
+ except KitError as e:
289
+ if e.code == "cooldown":
290
+ ...
291
+ ```
292
+
293
+ `kit.world`, `kit.matchmaking`, `kit.sessions`, `kit.npcs` and `kit.topology` (compose, check,
294
+ build and deploy the starters) share one exec connection (`kit.runtime`): it paces calls under the
295
+ gateway's 120 per 10 s, sends a call again only when that is safe (it did not run, or it carries
296
+ an `action_id` the hub answers once), and its mirrors (`HubState`, `CollectionMirror`,
297
+ `PrivateState`) take a new snapshot after a gap, another epoch or a reconnect. `kit.spectate`,
298
+ `kit.emotes` and `kit.shards` are the client conventions, and `kit.social` the parties, guilds and
299
+ chat rooms. The blocking client's kit is the same, with blocking calls.
300
+
263
301
  ## Crowdy Studio
264
302
 
265
303
  ```python
@@ -5,7 +5,7 @@ are in `pyproject.toml` (`[project].version`, `[tool.crowdypy.crowdyjs]`,
5
5
  `[tool.crowdypy.crowdycpp]`); `tests/unit/test_release_versions.py` refuses this page when
6
6
  its version disagrees.
7
7
 
8
- - CrowdyPy `0.11.0`
8
+ - CrowdyPy `0.12.0`
9
9
  - API surface: CrowdyJS (the pinned version and commit in `pyproject.toml`); the generated
10
10
  `docs/parity-matrix.md` lists every covered method, every native equivalent and every
11
11
  browser exclusion with its reason. The gate is strict: there are no portable gaps, and a
@@ -58,6 +58,7 @@ player once and signs it in for the later suites.
58
58
  | 2026-10-08 | local stack: ck-api at the distance-limited channel branch (off `dev`), two replication servers serving message type 32, the 3-node Citus lab | 0.6.0 (branch) | identity, ranged channel, replication, world and world data suites: 10 passed |
59
59
  | 2026-10-09 | dev tier, app `96701660793088`, after replication server v0.35.0 and ck-api v2.38.0 reached dev | `crowdypy 0.6.0.dev1` from PyPI (installed into a clean Python 3.12 with uv) | identity (incl. the terms gate), ranged channel, replication, world and world data suites: 10 passed |
60
60
  | 2026-10-13 | dev tier (ck-api v2.42.0), app `96701660793088`, the `harness` provisioning token with `CROWDY_E2E_EMAIL=crowdy-e2e-py@test.invalid` | 0.10.0 (branch, vendoring CrowdyCPP `dev/v0.62.0`) | identity (the terms-gate case now registers with the token and no consents), input log, ranged channel, replication, world and world data suites: 12 passed; open grid (needs `CROWDY_E2E_THROWAWAY_OWNER=1`) and Studio skipped |
61
+ | 2026-10-14 | dev tier (ck-api v2.44.1, replication server v0.39.0), app `96701660793088`, the `harness` provisioning token | 0.11.0 (`dev` at `586fc40`, vendoring CrowdyCPP 0.63.0) | identity, input log, ranged channel, replication, world and world data suites: 12 passed; open grid (needs `CROWDY_E2E_THROWAWAY_OWNER=1`) and Studio skipped |
61
62
 
62
63
  ## Not covered here
63
64
 
@@ -73,6 +74,7 @@ These CrowdyCPP suites have no CrowdyPy counterpart yet; the reason is in each r
73
74
  | `e2e_soak_two_clients`, `e2e_permission_refresh` | long-running; slated for `CROWDY_E2E_SLOW=1` suites |
74
75
  | `e2e_host_election`, `e2e_durable_stores`, `e2e_chunk_store_live` | the World Stores' host, save and chunk persistence run over GraphQL timers covered by unit suites against fakes; live coverage needs a dedicated app (chunk write-back closes the wilderness) |
75
76
  | `e2e_cross_app`, `e2e_cross_tenant`, `e2e_malicious_input` | platform isolation properties the CrowdyCPP suites already exercise against the same API |
77
+ | `e2e_bans_blocks` | 0.11.0's `channels.ban` / `teams.ban`, `account_blocked_of` and `group_member_banned_of` send the documents CrowdyCPP's suite exercises live, and the unit suites check them against a mocked API; an account block needs the tier operator's credentials. The tier round trip and the nightly identity probe run the same bans and blocks on each tier |
76
78
 
77
79
  0.8.0's additions (channel audio, the echo of your own voxel edit, `APP_PAUSED`, access
78
80
  suspension, player profiles, `exec.restart_type`) have no live suite yet, in CrowdyPy or in
@@ -4,16 +4,16 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
4
4
 
5
5
  ## Target
6
6
 
7
- - CrowdyJS: `18.10.0` at `b3e2de96ae738d272488ca06ab6de2c792aef14f`
8
- - CrowdyCPP (native core): `0.63.0` at `8682d39ab9cd368996eb35b76e6dfb10b43b7d62`
7
+ - CrowdyJS: `18.11.0` at `5167437788a8ea683d2fde6d3bafa2639feaa45e`
8
+ - CrowdyCPP (native core): `0.64.0` at `78ac8396d4bd0b3bfdd271c867f480e471488095`
9
9
  - schema.gql identical to CrowdyJS's: yes
10
10
  - Gate mode: strict portable parity (every portable gap is release-blocking)
11
11
 
12
12
  ## Summary
13
13
 
14
- - Covered: 1080
14
+ - Covered: 1146
15
15
  - Portable gap: 0
16
- - Native equivalent: 42
16
+ - Native equivalent: 44
17
17
  - Browser exclusion: 113
18
18
  - Deprecated roots: 2
19
19
  - Unclassified: 0
@@ -462,6 +462,7 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
462
462
  | `ChannelsAPI -> ChannelsAPI` | covered |
463
463
  | `ChunkStore -> ChunkStore` | covered |
464
464
  | `ChunksAPI -> ChunksAPI` | covered |
465
+ | `CollectionMirror -> CollectionMirror` | covered |
465
466
  | `CrowdyClient -> AsyncCrowdyClient` | covered |
466
467
  | `CrowdyStudioAPI -> CrowdyStudioAPI` | covered |
467
468
  | `CrowdyStudioController -> CrowdyStudioController` | covered |
@@ -472,11 +473,14 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
472
473
  | `CrowdyStudioTextHud -> (none)` | browser exclusion — HUD layer renders text-only player presentation into game-owned DOM |
473
474
  | `DiscoveryDomain -> DiscoveryDomain` | covered |
474
475
  | `EmbeddedHost -> (none)` | browser exclusion — iframe/postMessage bridge to the first-party shell page; there is no frame around a Python client |
476
+ | `EmotesKit -> EmotesKit` | covered |
475
477
  | `ErrorStore -> ErrorStore` | covered |
476
478
  | `EventRouter -> EventRouter` | covered |
477
479
  | `ExecAPI -> ExecAPI` | covered |
478
480
  | `ExecConnection -> ExecConnection` | covered |
479
481
  | `GameAppsAPI -> GameAppsAPI` | covered |
482
+ | `GameKitClient -> GameKitClient` | covered |
483
+ | `GameSessionHandle -> GameSessionHandle` | covered |
480
484
  | `GraphQLClient -> AsyncGraphQLClient` | covered |
481
485
  | `GridScope -> GridScope` | covered |
482
486
  | `GridsAPI -> GridsAPI` | covered |
@@ -484,20 +488,32 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
484
488
  | `HostTracker -> HostTracker` | covered |
485
489
  | `HostingAPI -> (none)` | browser exclusion — wrapper over the Crowdy Games hosting roots, which publish browser bundles; no Python client publishes one (CrowdyCPP classifies it the same way) |
486
490
  | `InputLogAPI -> InputLogAPI` | covered |
491
+ | `KitError -> KitError` | covered |
492
+ | `KitRuntime -> KitRuntime` | covered |
493
+ | `KitTopology -> KitTopology` | covered |
487
494
  | `LocalActorStore -> LocalActorStore` | covered |
488
495
  | `MarketplaceAPI -> MarketplaceAPI` | covered |
496
+ | `MatchQueue -> MatchQueue` | covered |
497
+ | `MatchmakingKit -> MatchmakingKit` | covered |
498
+ | `NpcArea -> NpcArea` | covered |
499
+ | `NpcsKit -> NpcsKit` | covered |
489
500
  | `OrganizationsAPI -> OrganizationsAPI` | covered |
490
501
  | `PaymentsAPI -> PaymentsAPI` | covered |
491
502
  | `PlatformAPI -> PlatformAPI` | covered |
492
503
  | `PlayerWalletAPI -> PlayerWalletAPI` | covered |
493
504
  | `PortalAPI -> PortalAPI` | covered |
505
+ | `PrivateState -> PrivateState` | covered |
494
506
  | `QuotasAPI -> QuotasAPI` | covered |
495
507
  | `RemoteActorLane -> RemoteActorLane` | covered |
496
508
  | `RemoteActorStore -> RemoteActorStore` | covered |
497
509
  | `SaveStateStore -> SaveStateStore` | covered |
498
510
  | `ServerStatusAPI -> ServerStatusAPI` | covered |
511
+ | `SessionsKit -> SessionsKit` | covered |
512
+ | `ShardKit -> ShardKit` | covered |
499
513
  | `SharedEnvironmentAPI -> SharedEnvironmentAPI` | covered |
500
514
  | `SocialKit -> SocialKit` | covered |
515
+ | `SpectateKit -> SpectateKit` | covered |
516
+ | `SpectatorHeartbeat -> SpectatorHeartbeat` | covered |
501
517
  | `StateAPI -> StateAPI` | covered |
502
518
  | `StudioLayoutController -> StudioLayoutController` | covered |
503
519
  | `TeamsAPI -> TeamsAPI` | covered |
@@ -512,7 +528,9 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
512
528
  | `WorkerMessageReader -> (none)` | browser exclusion — binds vscode-jsonrpc to browser Web Worker messaging |
513
529
  | `WorkerMessageWriter -> (none)` | browser exclusion — binds vscode-jsonrpc to browser Web Worker messaging |
514
530
  | `WorldClient -> WorldClient` | covered |
531
+ | `WorldKit -> WorldKit` | covered |
515
532
  | `WorldSessionCore -> WorldSessionCore` | covered |
533
+ | `WritableKitStore -> WritableKitStore` | covered |
516
534
 
517
535
  ## Methods
518
536
 
@@ -667,6 +685,8 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
667
685
  | `ChunksAPI.updateLods` | covered |
668
686
  | `ChunksAPI.updateState` | covered |
669
687
  | `ChunksAPI.voxelList` | covered |
688
+ | `CollectionMirror.list` | covered |
689
+ | `CollectionMirror.member` | covered |
670
690
  | `CrowdyClient.close` | native equivalent — AsyncCrowdyClient.aclose(), the asyncio spelling; the blocking CrowdyClient has close() |
671
691
  | `CrowdyClient.getToken` | covered |
672
692
  | `CrowdyClient.graphqlEndpoint` | covered |
@@ -745,6 +765,8 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
745
765
  | `CrowdyStudioGitHubTransport.unbind` | covered |
746
766
  | `DiscoveryDomain.app` | covered |
747
767
  | `DiscoveryDomain.apps` | covered |
768
+ | `EmotesKit.parse` | covered |
769
+ | `EmotesKit.send` | covered |
748
770
  | `ErrorStore.clear` | covered |
749
771
  | `ErrorStore.last` | covered |
750
772
  | `ErrorStore.lastFor` | covered |
@@ -826,6 +848,25 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
826
848
  | `GameAppsAPI.setPermissionLimits` | covered |
827
849
  | `GameAppsAPI.transferOwnership` | covered |
828
850
  | `GameAppsAPI.userPermissions` | covered |
851
+ | `GameKitClient.close` | covered |
852
+ | `GameKitClient.emotes` | covered |
853
+ | `GameKitClient.matchmaking` | covered |
854
+ | `GameKitClient.npcs` | covered |
855
+ | `GameKitClient.sessions` | covered |
856
+ | `GameKitClient.shards` | covered |
857
+ | `GameKitClient.spectate` | covered |
858
+ | `GameKitClient.topology` | covered |
859
+ | `GameKitClient.world` | covered |
860
+ | `GameSessionHandle.act` | covered |
861
+ | `GameSessionHandle.configure` | covered |
862
+ | `GameSessionHandle.currentTurn` | covered |
863
+ | `GameSessionHandle.isMyTurn` | covered |
864
+ | `GameSessionHandle.join` | covered |
865
+ | `GameSessionHandle.leave` | covered |
866
+ | `GameSessionHandle.ready` | covered |
867
+ | `GameSessionHandle.startGame` | covered |
868
+ | `GameSessionHandle.unwatch` | covered |
869
+ | `GameSessionHandle.watch` | covered |
829
870
  | `GraphQLClient.endpoint` | covered |
830
871
  | `GraphQLClient.getEndpoint` | covered |
831
872
  | `GraphQLClient.query` | covered |
@@ -858,6 +899,19 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
858
899
  | `HostTracker.onHostChanged` | covered |
859
900
  | `InputLogAPI.messages` | covered |
860
901
  | `InputLogAPI.sessions` | covered |
902
+ | `KitError.from` | native equivalent — KitError.from_error(error): `from` is a Python keyword |
903
+ | `KitRuntime.call` | covered |
904
+ | `KitRuntime.close` | covered |
905
+ | `KitRuntime.connection` | covered |
906
+ | `KitRuntime.onAccessEnded` | covered |
907
+ | `KitRuntime.onReconnect` | covered |
908
+ | `KitRuntime.playerId` | covered |
909
+ | `KitRuntime.subscribe` | covered |
910
+ | `KitRuntime.subscriptions` | covered |
911
+ | `KitTopology.deploy` | covered |
912
+ | `KitTopology.pack` | covered |
913
+ | `KitTopology.plan` | covered |
914
+ | `KitTopology.types` | covered |
861
915
  | `LocalActorStore.chunk` | covered |
862
916
  | `LocalActorStore.join` | covered |
863
917
  | `LocalActorStore.lastAck` | covered |
@@ -883,6 +937,33 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
883
937
  | `MarketplaceAPI.setGridClaimPolicy` | covered |
884
938
  | `MarketplaceAPI.setListingStatus` | covered |
885
939
  | `MarketplaceAPI.transferListing` | covered |
940
+ | `MatchQueue.accept` | covered |
941
+ | `MatchQueue.configure` | covered |
942
+ | `MatchQueue.decline` | covered |
943
+ | `MatchQueue.join` | covered |
944
+ | `MatchQueue.leave` | covered |
945
+ | `MatchQueue.onMatched` | covered |
946
+ | `MatchQueue.place` | covered |
947
+ | `MatchQueue.status` | covered |
948
+ | `MatchQueue.unwatch` | covered |
949
+ | `MatchQueue.watch` | covered |
950
+ | `MatchmakingKit.queue` | covered |
951
+ | `NpcArea.adopt` | covered |
952
+ | `NpcArea.attack` | covered |
953
+ | `NpcArea.dismiss` | covered |
954
+ | `NpcArea.mobs` | covered |
955
+ | `NpcArea.myPets` | covered |
956
+ | `NpcArea.npcs` | covered |
957
+ | `NpcArea.pets` | covered |
958
+ | `NpcArea.release` | covered |
959
+ | `NpcArea.rename` | covered |
960
+ | `NpcArea.summon` | covered |
961
+ | `NpcArea.talk` | covered |
962
+ | `NpcArea.unwatch` | covered |
963
+ | `NpcArea.watch` | covered |
964
+ | `NpcsKit.area` | covered |
965
+ | `NpcsKit.areaAt` | covered |
966
+ | `NpcsKit.keyAt` | covered |
886
967
  | `OrganizationsAPI.bySlug` | covered |
887
968
  | `OrganizationsAPI.create` | covered |
888
969
  | `OrganizationsAPI.createRole` | covered |
@@ -935,6 +1016,11 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
935
1016
  | `PortalAPI.revokeAppAuthorization` | covered |
936
1017
  | `PortalAPI.setAppClientSettings` | covered |
937
1018
  | `PortalAPI.signIn` | browser exclusion — hosted sign-in navigates the browser to Studio /authorize (ck-api v1.88.0); a a Python client client sends no Origin header, signs in with auth().login and mints directly |
1019
+ | `PrivateState.get` | covered |
1020
+ | `PrivateState.refresh` | covered |
1021
+ | `PrivateState.start` | covered |
1022
+ | `PrivateState.stop` | covered |
1023
+ | `PrivateState.subscribe` | covered |
938
1024
  | `QuotasAPI.effective` | covered |
939
1025
  | `QuotasAPI.forApp` | covered |
940
1026
  | `QuotasAPI.forOrg` | covered |
@@ -975,6 +1061,9 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
975
1061
  | `ServerStatusAPI.listAll` | covered |
976
1062
  | `ServerStatusAPI.serverWithLeastClients` | covered |
977
1063
  | `ServerStatusAPI.versionInfo` | covered |
1064
+ | `SessionsKit.open` | covered |
1065
+ | `ShardKit.around` | covered |
1066
+ | `ShardKit.key` | covered |
978
1067
  | `SharedEnvironmentAPI.appRuntimeState` | covered |
979
1068
  | `SharedEnvironmentAPI.appSubscription` | covered |
980
1069
  | `SharedEnvironmentAPI.autoBilling` | covered |
@@ -1005,6 +1094,10 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
1005
1094
  | `SocialKit.party.join` | covered |
1006
1095
  | `SocialKit.party.leave` | covered |
1007
1096
  | `SocialKit.party.members` | covered |
1097
+ | `SpectateKit.observe` | covered |
1098
+ | `SpectatorHeartbeat.error` | covered |
1099
+ | `SpectatorHeartbeat.moveTo` | covered |
1100
+ | `SpectatorHeartbeat.stop` | covered |
1008
1101
  | `StateAPI.delete` | covered |
1009
1102
  | `StateAPI.getAll` | covered |
1010
1103
  | `StateAPI.getOne` | covered |
@@ -1079,11 +1172,18 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
1079
1172
  | `VoxelsAPI.update` | covered |
1080
1173
  | `WorldClient.actor` | covered |
1081
1174
  | `WorldClient.subscribe` | covered |
1175
+ | `WorldKit.cancel` | covered |
1176
+ | `WorldKit.harvest` | covered |
1177
+ | `WorldKit.schedule` | covered |
1178
+ | `WorldKit.state` | covered |
1082
1179
  | `WorldSessionCore.dispose` | covered |
1083
1180
  | `WorldSessionCore.on` | covered |
1084
1181
  | `WorldSessionCore.onDispose` | covered |
1085
1182
  | `WorldSessionCore.setSendTracker` | covered |
1086
1183
  | `WorldSessionCore.trackSend` | covered |
1184
+ | `WritableKitStore.get` | covered |
1185
+ | `WritableKitStore.set` | covered |
1186
+ | `WritableKitStore.subscribe` | covered |
1087
1187
 
1088
1188
  ## Package exports
1089
1189
 
@@ -1119,33 +1219,18 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
1119
1219
  | `CrowdyTimeoutError` | covered |
1120
1220
  | `CrowdyUserCodeFaultError` | covered |
1121
1221
  | `EMBEDDED_HOST_PROTOCOL_VERSION` | browser exclusion — iframe/postMessage bridge to the first-party shell page; there is no frame around a Python client |
1122
- | `EVENT_ABILITY` | covered |
1123
- | `EVENT_CONTACT_DAMAGE` | covered |
1124
- | `EVENT_CONTROL_POINT` | covered |
1125
- | `EVENT_MOVEMENT_VIOLATION` | covered |
1126
- | `EVENT_PROPOSAL` | covered |
1127
- | `EVENT_RACE_TIMING` | covered |
1128
- | `EVENT_SCORE` | covered |
1129
- | `EVENT_TURN` | covered |
1130
- | `EVENT_WEATHER` | covered |
1131
- | `EVENT_ZONE_CHANGE` | covered |
1132
1222
  | `EXEC_CLIENT_ABI_IMPORTS` | covered |
1133
1223
  | `EXEC_CLIENT_ABI_VERSION` | covered |
1134
1224
  | `EXEC_CLIENT_HOST_CALLS` | browser exclusion — page-side broker for player WASM in the browser glue Web Worker (worker lifecycle, host-call allowlists, rate caps, watchdogs) |
1135
1225
  | `EXEC_CLOSE_ACCESS_ENDED` | covered |
1136
1226
  | `EXEC_STATUSES` | covered |
1137
1227
  | `ExecModScope` | covered |
1138
- | `FLAG_GROUNDED` | covered |
1139
- | `FLAG_MOB` | covered |
1140
- | `FLAG_NPC` | covered |
1141
- | `FLAG_RESERVED3` | covered |
1142
1228
  | `GLUE_HOST_CALL_REQUEST_MAX_BYTES` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
1143
1229
  | `GLUE_HOST_FUNCTIONS` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
1144
1230
  | `GLUE_INVOKE_REPLY_MAX_BYTES` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
1145
1231
  | `GLUE_LOG_MAX_BYTES` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
1146
1232
  | `GLUE_STATE_MAX_BYTES` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
1147
1233
  | `GROUP_MEMBER_BANNED_CODE` | covered |
1148
- | `GameKitClient` | covered |
1149
1234
  | `GlueRuntime` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
1150
1235
  | `GraphQLTransport` | native equivalent — pass an httpx.AsyncClient / httpx.Client as http_client= (transport, proxies, HTTP/2, timeouts) |
1151
1236
  | `GridScopeError` | covered |
@@ -1157,7 +1242,6 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
1157
1242
  | `PLAYER_CODE_LOG_LINES_PER_SECOND` | browser exclusion — page-side broker for player WASM in the browser glue Web Worker (worker lifecycle, host-call allowlists, rate caps, watchdogs) |
1158
1243
  | `PLAYER_CODE_LOG_MAX_CHARS` | browser exclusion — page-side broker for player WASM in the browser glue Web Worker (worker lifecycle, host-call allowlists, rate caps, watchdogs) |
1159
1244
  | `PLAYER_PROFILES_MAX` | covered |
1160
- | `POSE_BYTES` | covered |
1161
1245
  | `PlayerCodeBroker` | browser exclusion — page-side broker for player WASM in the browser glue Web Worker (worker lifecycle, host-call allowlists, rate caps, watchdogs) |
1162
1246
  | `PortalConsentRequiredError` | covered |
1163
1247
  | `RELAY_MAX_BUNDLE_MEMBERS` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.MAX_BUNDLE_MEMBERS |
@@ -1200,21 +1284,18 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
1200
1284
  | `createMintRediscover` | covered |
1201
1285
  | `createSignContext` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.encode_long_spatial / spatial_hmac take the token directly |
1202
1286
  | `decodeBase64` | covered |
1203
- | `decodeEnginePose` | covered |
1204
1287
  | `decodeExecFrame` | covered |
1205
1288
  | `decodeVoicePacket` | covered |
1206
1289
  | `defaultClientGridEventBus` | browser exclusion — page-local event bus between CLIENT mods running in this browser's glue workers |
1207
1290
  | `defaultHostedSignInUrl` | covered |
1208
1291
  | `encodeBase64` | covered |
1209
- | `encodeEnginePose` | covered |
1210
1292
  | `encodeExecFrame` | covered |
1211
1293
  | `encodeVoiceHeader` | covered |
1212
1294
  | `encodeVoicePacket` | covered |
1213
- | `engineLanes` | covered |
1214
- | `enginePoseCodec` | covered |
1215
1295
  | `execGatewayRefusal` | covered |
1216
1296
  | `execModType` | covered |
1217
1297
  | `execStatus` | covered |
1298
+ | `execWireIntegers` | native equivalent — msgspec writes a Python int as a msgpack integer of its width, so there is no float for a hub's integer field to refuse; @msgpack/msgpack writes a JS number of 2^32 or more as a float without it |
1218
1299
  | `fragmentFrame` | covered |
1219
1300
  | `generateCrowdyUuid` | covered |
1220
1301
  | `generatePkcePair` | covered |
@@ -1234,24 +1315,11 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
1234
1315
  | `moveFromError` | covered |
1235
1316
  | `moveFromErrors` | covered |
1236
1317
  | `packMessageBundle` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.bundle |
1237
- | `parseAbilityEvent` | covered |
1238
- | `parseContactDamage` | covered |
1239
- | `parseControlPointEvent` | covered |
1240
- | `parseEngineEvent` | covered |
1241
1318
  | `parseFuelBudget` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
1242
- | `parseMovementViolation` | covered |
1243
- | `parseProposalEvent` | covered |
1244
- | `parseRaceTimingEvent` | covered |
1245
1319
  | `parseRelayFrame` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.parse_datagram (a relay frame is one datagram) |
1246
- | `parseScoreEvent` | covered |
1247
- | `parseTurnEvent` | covered |
1248
1320
  | `parseVideoFragmentHeader` | covered |
1249
- | `parseWeatherEvent` | covered |
1250
- | `parseZoneChangeEvent` | covered |
1251
1321
  | `payloadBytesOf` | native equivalent — connection.stats(): CrowdyCPP's counters (datagrams, messages and bytes, by message type) |
1252
1322
  | `playerFaultOf` | covered |
1253
- | `poseSuffix` | covered |
1254
- | `runOptimisticAction` | covered |
1255
1323
  | `runWithWatchdog` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
1256
1324
  | `serializeActorUpdate` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.encode_long_spatial with the message type |
1257
1325
  | `serializeAudioPacket` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.encode_long_spatial with the message type |
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "crowdypy"
7
- version = "0.11.0.dev1"
7
+ version = "0.12.0.dev1"
8
8
  description = "Official Python SDK for Crowded Kingdoms: typed GraphQL clients and a native UDP replication core"
9
9
  readme = "README.md"
10
10
  license = "MIT AND Apache-2.0"
@@ -119,14 +119,14 @@ environment = { OPENSSL_ROOT_DIR = "C:/vcpkg/installed/x64-windows-static-md" }
119
119
  # --------------------------------------------------------------------------------------
120
120
 
121
121
  [tool.crowdypy.crowdyjs]
122
- version = "18.10.0"
123
- commit = "b3e2de96ae738d272488ca06ab6de2c792aef14f"
122
+ version = "18.11.0"
123
+ commit = "5167437788a8ea683d2fde6d3bafa2639feaa45e"
124
124
 
125
125
  [tool.crowdypy.crowdycpp]
126
- version = "0.63.0"
127
- tag = "dev/v0.63.0"
128
- commit = "8682d39ab9cd368996eb35b76e6dfb10b43b7d62"
129
- tree-sha256 = "318b0db6138c877a666261fe71d1fc8bb2a644f333f3c927487f435371856c87"
126
+ version = "0.64.0"
127
+ tag = "dev/v0.64.0"
128
+ commit = "78ac8396d4bd0b3bfdd271c867f480e471488095"
129
+ tree-sha256 = "db5facc1d3ad24f049623916e71a1020d9f6cdb79bc8fa9df091f926f67aa053"
130
130
 
131
131
  # schema.gql and operations/ are CrowdyJS's, copied from the commit pinned above by
132
132
  # scripts/schema_sync.py, which records these hashes and re-derives them in CI.
@@ -7,8 +7,8 @@
7
7
  The async modules are the source of truth: ``graphql.py``, ``client.py``,
8
8
  ``rediscover.py``, ``grid_scope.py``, ``world.py``, ``stores.py``, ``domains/`` and
9
9
  ``kit/``. A token-level rewrite (formatting is preserved) drops ``async``/``await``, maps
10
- the async names to their blocking twins and points imports of those modules at
11
- ``crowdypy._sync``. ``asyncio.sleep`` becomes ``time.sleep``; any other use of asyncio in a
10
+ the async names to their blocking twins, unwraps ``Awaitable[X]`` to ``X`` and points imports
11
+ of those modules at ``crowdypy._sync``. ``asyncio.sleep`` becomes ``time.sleep``; any other use of asyncio in a
12
12
  source module is refused, because it would have no blocking equivalent.
13
13
  """
14
14
 
@@ -54,6 +54,7 @@ NAMES = {
54
54
  "AsyncReplicationConnection": "ReplicationConnection",
55
55
  "AsyncExecConnection": "ExecConnection",
56
56
  "run_soon": "run_now",
57
+ "run_detached": "run_in_thread",
57
58
  "AsyncClient": "Client",
58
59
  "aclose": "close",
59
60
  "__aenter__": "__enter__",
@@ -105,6 +106,14 @@ def transform(source: str, rel: str) -> str:
105
106
  ):
106
107
  raise SystemExit(f"unasync: {rel}:{tok.start[0]} uses asyncio beyond asyncio.sleep")
107
108
  edits.append((pos(tok.start), pos(tok.end), "time"))
109
+ elif tok.type == tokenize.NAME and tok.string == "Awaitable" and nxt and nxt.string == "[":
110
+ depth = 0
111
+ for close in tokens[i + 1 :]:
112
+ depth += {"[": 1, "]": -1}.get(close.string, 0) if close.type == tokenize.OP else 0
113
+ if depth == 0:
114
+ break
115
+ edits.append((pos(tok.start), pos(nxt.end), ""))
116
+ edits.append((pos(close.start), pos(close.end), ""))
108
117
  elif tok.type == tokenize.NAME and tok.string in NAMES:
109
118
  edits.append((pos(tok.start), pos(tok.end), NAMES[tok.string]))
110
119
  elif (
@@ -14,7 +14,14 @@ import threading
14
14
  from collections.abc import Awaitable, Callable
15
15
  from typing import Any
16
16
 
17
- __all__ = ["AsyncSingleFlight", "SingleFlight", "run_now", "run_soon"]
17
+ __all__ = [
18
+ "AsyncSingleFlight",
19
+ "SingleFlight",
20
+ "run_detached",
21
+ "run_in_thread",
22
+ "run_now",
23
+ "run_soon",
24
+ ]
18
25
 
19
26
 
20
27
  class AsyncSingleFlight[T]:
@@ -127,3 +134,20 @@ def run_now(job: Callable[[], Any]) -> None:
127
134
  job()
128
135
  except Exception:
129
136
  _logger.exception("background job failed")
137
+
138
+
139
+ def run_detached(job: Callable[[], Awaitable[Any]]) -> None:
140
+ """Start ``job`` without waiting for it, from a callback that must not wait: a push or a
141
+ reconnect handler. A failure is logged.
142
+
143
+ In the async client this is :func:`run_soon`. scripts/unasync.py maps it to
144
+ :func:`run_in_thread`, because the blocking client runs those handlers on a connection's
145
+ reader thread, and a call made there would wait on a reply only that thread can read.
146
+ """
147
+ run_soon(job)
148
+
149
+
150
+ def run_in_thread(job: Callable[[], Any]) -> None:
151
+ """Run ``job`` on a daemon thread; a failure is logged (the blocking twin of
152
+ :func:`run_detached`)."""
153
+ threading.Thread(target=run_now, args=(job,), name="crowdypy-kit", daemon=True).start()