crowdypy 0.4.0.dev1__tar.gz → 0.5.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 (489) hide show
  1. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/AGENTS.md +6 -2
  2. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/MIGRATION.md +38 -1
  3. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/PKG-INFO +17 -18
  4. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/README.md +16 -17
  5. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/docs/compatibility.md +1 -1
  6. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/docs/e2e-coverage.md +4 -0
  7. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/docs/parity-matrix.md +8 -3
  8. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/gameApps/GameApps.graphql +16 -0
  9. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/pyproject.toml +9 -9
  10. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/schema.gql +54 -6
  11. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_generated/enums.py +1 -1
  12. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_generated/inputs.py +9 -1
  13. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_generated/operations.py +20 -2
  14. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio_agent.py +2 -1
  15. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/exec.py +95 -4
  16. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/game_apps.py +26 -0
  17. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_version.py +1 -1
  18. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/crowdy_studio_agent.py +2 -1
  19. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/exec.py +99 -3
  20. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/game_apps.py +26 -0
  21. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/exec_gateway.py +17 -2
  22. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/player_host/schemas.v1.json +2 -2
  23. crowdypy-0.5.0.dev1/tests/e2e/test_e2e_open_grid_exec_gateway.py +203 -0
  24. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/fixtures/player-host.v1.json +2 -2
  25. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/domains/test_crowdycpp_roots.py +2 -2
  26. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/domains/test_world_domains.py +9 -0
  27. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_exec_gateway.py +59 -0
  28. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_replication.py +6 -1
  29. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_studio_controller.py +1 -1
  30. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_studio_diagnostics.py +9 -5
  31. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/uv.lock +1 -1
  32. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/CMakeLists.txt +1 -1
  33. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/PROVENANCE.md +1 -1
  34. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/exec.hpp +32 -4
  35. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/game_apps.hpp +30 -0
  36. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/generated/enums.hpp +2 -2
  37. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/generated/operations.hpp +36 -2
  38. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/websocket.hpp +7 -0
  39. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/chunk_store.hpp +3 -3
  40. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/package.json +6 -6
  41. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/domains/exec.cpp +155 -9
  42. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/websocket_curl.cpp +10 -4
  43. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdy-studio-diagnostics.v1.json +2 -2
  44. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdyjs-studio-layout.v1.json +2 -2
  45. crowdypy-0.5.0.dev1/vendor/CrowdyCPP/tools/parity/fixtures/exec-gateway-cases.json +24 -0
  46. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/.gitattributes +0 -0
  47. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/.gitignore +0 -0
  48. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/.gitleaks.toml +0 -0
  49. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/CMakeLists.txt +0 -0
  50. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/LICENSE +0 -0
  51. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/SECURITY.md +0 -0
  52. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/benchmarks/README.md +0 -0
  53. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/benchmarks/bench_replication.py +0 -0
  54. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/licenses/OpenSSL-LICENSE.txt +0 -0
  55. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/native/common.hpp +0 -0
  56. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/native/module.cpp +0 -0
  57. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/native/replication.hpp +0 -0
  58. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/native/replication_binding.cpp +0 -0
  59. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/native/session_binding.cpp +0 -0
  60. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/native/wire_binding.cpp +0 -0
  61. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/actors/Actor.graphql +0 -0
  62. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/actors/Actors.graphql +0 -0
  63. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/actors/BatchLookupActors.graphql +0 -0
  64. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/actors/CreateActor.graphql +0 -0
  65. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/actors/DeleteActor.graphql +0 -0
  66. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/actors/UpdateActor.graphql +0 -0
  67. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/actors/UpdateActorState.graphql +0 -0
  68. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/AppAccessTiers.graphql +0 -0
  69. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/AppFeatures.graphql +0 -0
  70. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/AppGrantMemberCandidates.graphql +0 -0
  71. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/AppUserAccessByApp.graphql +0 -0
  72. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/ArchiveAccessTier.graphql +0 -0
  73. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/ClaimFreeAppAccess.graphql +0 -0
  74. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/CreateAccessTier.graphql +0 -0
  75. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/DefineAppFeature.graphql +0 -0
  76. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/GrantAppAccess.graphql +0 -0
  77. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/GrantMyAppAccess.graphql +0 -0
  78. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/GrantTierFeature.graphql +0 -0
  79. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/MyAppAccess.graphql +0 -0
  80. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/RevokeAppAccess.graphql +0 -0
  81. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/RevokeTierFeature.graphql +0 -0
  82. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/RuntimePermissions.graphql +0 -0
  83. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/TierFeatures.graphql +0 -0
  84. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/appAccess/UpdateAccessTier.graphql +0 -0
  85. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/App.graphql +0 -0
  86. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/AppBySlug.graphql +0 -0
  87. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/AppDiscovery.graphql +0 -0
  88. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/AppsForOrg.graphql +0 -0
  89. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/ArchiveApp.graphql +0 -0
  90. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/CodeAdmissions.graphql +0 -0
  91. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/CreateApp.graphql +0 -0
  92. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/MarketplaceApps.graphql +0 -0
  93. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/MyApps.graphql +0 -0
  94. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/PlaceableDatacenters.graphql +0 -0
  95. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/apps/UpdateApp.graphql +0 -0
  96. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/auth/Logout.graphql +0 -0
  97. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/auth/LogoutAllDevices.graphql +0 -0
  98. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/avatars/Avatars.graphql +0 -0
  99. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/billing/AppBudget.graphql +0 -0
  100. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/billing/AppBudgets.graphql +0 -0
  101. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/billing/SetAppBudget.graphql +0 -0
  102. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/billing/WalletBalance.graphql +0 -0
  103. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/billing/WalletTransactions.graphql +0 -0
  104. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/AddChannelMember.graphql +0 -0
  105. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/Channel.graphql +0 -0
  106. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/ChannelMembers.graphql +0 -0
  107. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/ChannelPolicy.graphql +0 -0
  108. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/ChannelRoles.graphql +0 -0
  109. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/Channels.graphql +0 -0
  110. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/CreateChannel.graphql +0 -0
  111. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/CreateChannelRole.graphql +0 -0
  112. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/DeleteChannel.graphql +0 -0
  113. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/DeleteChannelRole.graphql +0 -0
  114. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/JoinChannel.graphql +0 -0
  115. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/LeaveChannel.graphql +0 -0
  116. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/MyChannels.graphql +0 -0
  117. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/RemoveChannelMember.graphql +0 -0
  118. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/RequestToJoinChannel.graphql +0 -0
  119. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/SetChannelMemberRoles.graphql +0 -0
  120. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/SetChannelPolicy.graphql +0 -0
  121. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/UpdateChannel.graphql +0 -0
  122. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/channels/UpdateChannelRole.graphql +0 -0
  123. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/chunks/GetChunk.graphql +0 -0
  124. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/chunks/GetChunkLods.graphql +0 -0
  125. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/chunks/GetChunksByDistance.graphql +0 -0
  126. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/chunks/GetVoxelList.graphql +0 -0
  127. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/chunks/UpdateChunk.graphql +0 -0
  128. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/chunks/UpdateChunkLods.graphql +0 -0
  129. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/chunks/UpdateChunkState.graphql +0 -0
  130. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/crowdyStudio/CrowdyStudio.graphql +0 -0
  131. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/exec/Exec.graphql +0 -0
  132. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/grids/CreateGridChannel.graphql +0 -0
  133. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/grids/GridChannels.graphql +0 -0
  134. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/grids/MintGridToken.graphql +0 -0
  135. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/host/Host.graphql +0 -0
  136. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/marketplace/Marketplace.graphql +0 -0
  137. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/CreateOrgRole.graphql +0 -0
  138. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/CreateOrgToken.graphql +0 -0
  139. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/CreateOrganization.graphql +0 -0
  140. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/DeleteOrgRole.graphql +0 -0
  141. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/InviteOrgMember.graphql +0 -0
  142. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/MemberRoles.graphql +0 -0
  143. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/MyOrganizations.graphql +0 -0
  144. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/OrgMembers.graphql +0 -0
  145. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/OrgPermissions.graphql +0 -0
  146. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/OrgRoles.graphql +0 -0
  147. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/OrgTokens.graphql +0 -0
  148. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/Organization.graphql +0 -0
  149. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/OrganizationBySlug.graphql +0 -0
  150. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/RemoveOrgMember.graphql +0 -0
  151. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/RevokeOrgToken.graphql +0 -0
  152. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/UpdateOrgMemberRoles.graphql +0 -0
  153. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/UpdateOrgRole.graphql +0 -0
  154. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/organizations/UpdateOrgToken.graphql +0 -0
  155. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/payments/CapturePaypalCheckout.graphql +0 -0
  156. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/payments/CreateCheckout.graphql +0 -0
  157. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/payments/MyCheckouts.graphql +0 -0
  158. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/platform/PlatformConfig.graphql +0 -0
  159. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/playerWallet/PlayerWallet.graphql +0 -0
  160. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/quotas/DeleteQuota.graphql +0 -0
  161. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/quotas/EffectiveQuota.graphql +0 -0
  162. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/quotas/QuotasForApp.graphql +0 -0
  163. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/quotas/QuotasForOrg.graphql +0 -0
  164. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/quotas/SetQuota.graphql +0 -0
  165. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/serverStatus/ActiveGraphQLServers.graphql +0 -0
  166. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/serverStatus/GameClientBootstrap.graphql +0 -0
  167. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/serverStatus/GraphqlServers.graphql +0 -0
  168. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/serverStatus/ServerWithLeastClients.graphql +0 -0
  169. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/serverStatus/VersionInfo.graphql +0 -0
  170. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/sharedEnvironment/SharedEnvironment.graphql +0 -0
  171. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/state/DeleteUserAppState.graphql +0 -0
  172. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/state/UpdateUserAppState.graphql +0 -0
  173. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/state/UserAppState.graphql +0 -0
  174. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/state/UserAppStates.graphql +0 -0
  175. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/AddTeamMember.graphql +0 -0
  176. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/CreateTeam.graphql +0 -0
  177. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/CreateTeamRole.graphql +0 -0
  178. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/DeleteTeam.graphql +0 -0
  179. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/DeleteTeamRole.graphql +0 -0
  180. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/JoinTeam.graphql +0 -0
  181. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/LeaveTeam.graphql +0 -0
  182. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/MyTeams.graphql +0 -0
  183. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/RemoveTeamMember.graphql +0 -0
  184. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/RequestToJoinTeam.graphql +0 -0
  185. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/SetTeamMemberRoles.graphql +0 -0
  186. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/SetTeamPolicy.graphql +0 -0
  187. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/Team.graphql +0 -0
  188. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/TeamMembers.graphql +0 -0
  189. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/TeamPolicy.graphql +0 -0
  190. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/TeamRoles.graphql +0 -0
  191. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/Teams.graphql +0 -0
  192. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/UpdateTeam.graphql +0 -0
  193. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teams/UpdateTeamRole.graphql +0 -0
  194. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/teleport/TeleportRequest.graphql +0 -0
  195. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/usage/AppGraphqlOperations.graphql +0 -0
  196. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/usage/AppUsageSummary.graphql +0 -0
  197. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/usage/PlayerPulse.graphql +0 -0
  198. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/users/DeleteMyAccount.graphql +0 -0
  199. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/users/FreePlayWindow.graphql +0 -0
  200. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/users/Me.graphql +0 -0
  201. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/users/UpdateGamertag.graphql +0 -0
  202. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/users/UpdateUserState.graphql +0 -0
  203. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/users/User.graphql +0 -0
  204. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/voxels/ListVoxelUpdatesByDistance.graphql +0 -0
  205. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/voxels/ListVoxels.graphql +0 -0
  206. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/voxels/RollbackVoxelUpdates.graphql +0 -0
  207. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/voxels/UpdateVoxel.graphql +0 -0
  208. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/operations/voxels/VoxelUpdateHistory.graphql +0 -0
  209. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/_pins.py +0 -0
  210. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/assert_default_origin.py +0 -0
  211. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/build_openssl.sh +0 -0
  212. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/check_content_policy.py +0 -0
  213. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/check_pin_tiers.py +0 -0
  214. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/cibw_before_all_linux.sh +0 -0
  215. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/resolve-release-tier.sh +0 -0
  216. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/resolve-release-tier.test.sh +0 -0
  217. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/resolve_pypi_version.py +0 -0
  218. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/stamp_version.py +0 -0
  219. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/ci/verify_artifacts.py +0 -0
  220. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/codegen.py +0 -0
  221. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/schema_drift.py +0 -0
  222. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/schema_sync.py +0 -0
  223. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/unasync.py +0 -0
  224. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/scripts/vendor_crowdycpp.py +0 -0
  225. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/__init__.py +0 -0
  226. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_concurrency.py +0 -0
  227. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_default_origin.py +0 -0
  228. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_generated/__init__.py +0 -0
  229. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_grid.py +0 -0
  230. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_native.pyi +0 -0
  231. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_operation.py +0 -0
  232. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/__init__.py +0 -0
  233. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/client.py +0 -0
  234. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/__init__.py +0 -0
  235. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/_base.py +0 -0
  236. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/actors.py +0 -0
  237. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/admin.py +0 -0
  238. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/app_access.py +0 -0
  239. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/apps.py +0 -0
  240. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/auth.py +0 -0
  241. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/avatars.py +0 -0
  242. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/billing.py +0 -0
  243. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/channels.py +0 -0
  244. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/chunks.py +0 -0
  245. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio.py +0 -0
  246. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio_github.py +0 -0
  247. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/discovery.py +0 -0
  248. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/grids.py +0 -0
  249. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/host.py +0 -0
  250. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/marketplace.py +0 -0
  251. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/organizations.py +0 -0
  252. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/payments.py +0 -0
  253. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/platform.py +0 -0
  254. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/player_wallet.py +0 -0
  255. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/portal.py +0 -0
  256. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/quotas.py +0 -0
  257. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/server_status.py +0 -0
  258. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/shared_environment.py +0 -0
  259. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/state.py +0 -0
  260. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/teams.py +0 -0
  261. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/teleport.py +0 -0
  262. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/udp.py +0 -0
  263. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/usage.py +0 -0
  264. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/users.py +0 -0
  265. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/domains/voxels.py +0 -0
  266. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/graphql.py +0 -0
  267. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/grid_scope.py +0 -0
  268. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/kit/__init__.py +0 -0
  269. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/kit/actions.py +0 -0
  270. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/kit/kit.py +0 -0
  271. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/kit/social.py +0 -0
  272. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/kit/wire.py +0 -0
  273. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/rediscover.py +0 -0
  274. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/stores.py +0 -0
  275. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/_sync/world.py +0 -0
  276. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/auth_state.py +0 -0
  277. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/client.py +0 -0
  278. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/codecs.py +0 -0
  279. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/datacenter_redirect.py +0 -0
  280. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/__init__.py +0 -0
  281. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/_base.py +0 -0
  282. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/actors.py +0 -0
  283. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/admin.py +0 -0
  284. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/app_access.py +0 -0
  285. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/apps.py +0 -0
  286. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/auth.py +0 -0
  287. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/avatars.py +0 -0
  288. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/billing.py +0 -0
  289. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/channels.py +0 -0
  290. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/chunks.py +0 -0
  291. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/crowdy_studio.py +0 -0
  292. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/crowdy_studio_github.py +0 -0
  293. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/discovery.py +0 -0
  294. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/grids.py +0 -0
  295. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/host.py +0 -0
  296. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/marketplace.py +0 -0
  297. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/organizations.py +0 -0
  298. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/payments.py +0 -0
  299. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/platform.py +0 -0
  300. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/player_wallet.py +0 -0
  301. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/portal.py +0 -0
  302. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/quotas.py +0 -0
  303. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/server_status.py +0 -0
  304. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/shared_environment.py +0 -0
  305. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/state.py +0 -0
  306. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/teams.py +0 -0
  307. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/teleport.py +0 -0
  308. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/udp.py +0 -0
  309. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/usage.py +0 -0
  310. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/users.py +0 -0
  311. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/domains/voxels.py +0 -0
  312. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/enums.py +0 -0
  313. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/errors.py +0 -0
  314. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/estate.py +0 -0
  315. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/graphql.py +0 -0
  316. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/grid_scope.py +0 -0
  317. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/inputs.py +0 -0
  318. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/kit/__init__.py +0 -0
  319. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/kit/actions.py +0 -0
  320. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/kit/kit.py +0 -0
  321. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/kit/social.py +0 -0
  322. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/kit/wire.py +0 -0
  323. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/lb_cookie.py +0 -0
  324. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/media.py +0 -0
  325. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/pkce.py +0 -0
  326. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/player_host/__init__.py +0 -0
  327. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/player_host/agent_errors.py +0 -0
  328. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/player_host/agent_types.py +0 -0
  329. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/player_host/json_schema.py +0 -0
  330. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/player_host/schemas.py +0 -0
  331. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/player_host/types.py +0 -0
  332. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/py.typed +0 -0
  333. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/rediscover.py +0 -0
  334. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/replication.py +0 -0
  335. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/session.py +0 -0
  336. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/stores.py +0 -0
  337. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/studio/__init__.py +0 -0
  338. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/studio/client_tick_interval.py +0 -0
  339. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/studio/controller.py +0 -0
  340. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/studio/diagnostics.py +0 -0
  341. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/studio/github_new_repo.py +0 -0
  342. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/studio/layout.py +0 -0
  343. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/studio/models.py +0 -0
  344. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/studio/starter_projects.py +0 -0
  345. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/subscriptions.py +0 -0
  346. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/sync.py +0 -0
  347. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/utils.py +0 -0
  348. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/wire.py +0 -0
  349. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/src/crowdypy/world.py +0 -0
  350. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/conftest.py +0 -0
  351. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/e2e/__init__.py +0 -0
  352. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/e2e/conftest.py +0 -0
  353. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/e2e/test_e2e_identity.py +0 -0
  354. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/e2e/test_e2e_replication.py +0 -0
  355. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/e2e/test_e2e_studio.py +0 -0
  356. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/e2e/test_e2e_world.py +0 -0
  357. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/e2e/test_e2e_world_data.py +0 -0
  358. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/fixtures/README.md +0 -0
  359. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/fixtures/binary-wire-fixtures.json +0 -0
  360. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/fixtures/exec-client-frames.json +0 -0
  361. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/__init__.py +0 -0
  362. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/domains/__init__.py +0 -0
  363. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/domains/test_org_domains.py +0 -0
  364. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/domains/test_social_domains.py +0 -0
  365. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/domains/test_studio_exec_domains.py +0 -0
  366. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_core.py +0 -0
  367. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_durable_stores.py +0 -0
  368. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_estate_moves.py +0 -0
  369. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_fixture_provenance.py +0 -0
  370. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_grid_scope.py +0 -0
  371. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_kit.py +0 -0
  372. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_lazy_exports.py +0 -0
  373. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_player_host.py +0 -0
  374. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_release_versions.py +0 -0
  375. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_sdk_audience.py +0 -0
  376. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_studio_layout.py +0 -0
  377. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_subscriptions.py +0 -0
  378. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_transport.py +0 -0
  379. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_udp_api.py +0 -0
  380. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_wire.py +0 -0
  381. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tests/unit/test_world_session.py +0 -0
  382. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tools/e2e/provision.py +0 -0
  383. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tools/fixtures/player_host.mjs +0 -0
  384. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tools/parity/classifications.toml +0 -0
  385. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/tools/parity/parity.py +0 -0
  386. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/LICENSE +0 -0
  387. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/cmake/CheckPublicHeaders.cmake +0 -0
  388. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/cmake/CrowdyCPPConfig.cmake.in +0 -0
  389. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/cmake/studio_layout_fixture.hpp.in +0 -0
  390. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/client.hpp +0 -0
  391. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/base64.hpp +0 -0
  392. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/bytes.hpp +0 -0
  393. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/clock.hpp +0 -0
  394. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/crypto.hpp +0 -0
  395. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/logger.hpp +0 -0
  396. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/result.hpp +0 -0
  397. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/spsc.hpp +0 -0
  398. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/uuid.hpp +0 -0
  399. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/crowdy.hpp +0 -0
  400. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/default_origin.hpp +0 -0
  401. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/admin.hpp +0 -0
  402. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/auth.hpp +0 -0
  403. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio.hpp +0 -0
  404. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_agent.hpp +0 -0
  405. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_github.hpp +0 -0
  406. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/discovery.hpp +0 -0
  407. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/domain_base.hpp +0 -0
  408. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/grids.hpp +0 -0
  409. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/groups.hpp +0 -0
  410. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/marketplace.hpp +0 -0
  411. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/player_wallet.hpp +0 -0
  412. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/portal.hpp +0 -0
  413. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/realtime_control.hpp +0 -0
  414. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/server_status.hpp +0 -0
  415. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/types.hpp +0 -0
  416. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/users.hpp +0 -0
  417. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/world_data.hpp +0 -0
  418. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/async_scope.hpp +0 -0
  419. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/auth_state.hpp +0 -0
  420. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/datacenter_redirect.hpp +0 -0
  421. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/dispatcher.hpp +0 -0
  422. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/errors.hpp +0 -0
  423. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/estate.hpp +0 -0
  424. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/graphql_client.hpp +0 -0
  425. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/http.hpp +0 -0
  426. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/json.hpp +0 -0
  427. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/rediscover.hpp +0 -0
  428. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/subscription_client.hpp +0 -0
  429. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/actions.hpp +0 -0
  430. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +0 -0
  431. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/social.hpp +0 -0
  432. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/wire.hpp +0 -0
  433. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/video_frames.hpp +0 -0
  434. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/adapter.hpp +0 -0
  435. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/player_host.hpp +0 -0
  436. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/schemas.hpp +0 -0
  437. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/types.hpp +0 -0
  438. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/connection.hpp +0 -0
  439. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/session_provider.hpp +0 -0
  440. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/types.hpp +0 -0
  441. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/udp_socket.hpp +0 -0
  442. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/codec.hpp +0 -0
  443. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/durable.hpp +0 -0
  444. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/keys.hpp +0 -0
  445. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/stores.hpp +0 -0
  446. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/world_session.hpp +0 -0
  447. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/controller.hpp +0 -0
  448. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/diagnostics.hpp +0 -0
  449. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/editor.hpp +0 -0
  450. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github.hpp +0 -0
  451. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github_layout.hpp +0 -0
  452. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/integration.hpp +0 -0
  453. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/layout.hpp +0 -0
  454. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/models.hpp +0 -0
  455. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/runtime.hpp +0 -0
  456. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/wire/codec.hpp +0 -0
  457. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/wire/protocol.hpp +0 -0
  458. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/include/crowdy/world.hpp +0 -0
  459. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/client.cpp +0 -0
  460. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/core/base64.cpp +0 -0
  461. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/core/clock.cpp +0 -0
  462. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/core/crypto_default_unavailable.cpp +0 -0
  463. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/core/crypto_openssl.cpp +0 -0
  464. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/core/crypto_unavailable.cpp +0 -0
  465. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/core/logger.cpp +0 -0
  466. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/core/uuid.cpp +0 -0
  467. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/async_transport.cpp +0 -0
  468. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/auth_state.cpp +0 -0
  469. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/error_extensions.hpp +0 -0
  470. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/errors.cpp +0 -0
  471. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/graphql_client.cpp +0 -0
  472. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/http_curl.cpp +0 -0
  473. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/http_none.cpp +0 -0
  474. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/json.cpp +0 -0
  475. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/subscription_client.cpp +0 -0
  476. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/graphql/websocket_none.cpp +0 -0
  477. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/player_host/schemas.cpp +0 -0
  478. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/player_host/types.cpp +0 -0
  479. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/replication/connection.cpp +0 -0
  480. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/replication/socket_errors.hpp +0 -0
  481. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/replication/udp_socket.cpp +0 -0
  482. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/session/world_session.cpp +0 -0
  483. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/studio/diagnostics.cpp +0 -0
  484. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/studio/editor.cpp +0 -0
  485. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/src/studio/integration.cpp +0 -0
  486. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/LICENSE +0 -0
  487. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.c +0 -0
  488. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.h +0 -0
  489. {crowdypy-0.4.0.dev1 → crowdypy-0.5.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-client-frames.json +0 -0
@@ -122,8 +122,12 @@ names, a tag that is not the tree's version, and a default origin for another ti
122
122
  builds every wheel and the sdist, scans them, publishes `X.Y.Z.devN` (dev), `X.Y.ZrcN` (test)
123
123
  or `X.Y.Z` (prod) to PyPI by trusted publishing, downloads the published wheel back to read
124
124
  its origin again, and creates the GitHub release with the same files. PyPI publishing runs
125
- only when the repository variable `PYPI_PUBLISHING` is `enabled`, which the operator sets
126
- once the PyPI trusted publisher (workflow `release.yml`, environment `pypi`) is registered.
125
+ only when the repository variable `PYPI_PUBLISHING` is `enabled` (it is, since 2026-10-01),
126
+ through the trusted publisher on PyPI project `crowdypy` (owner CrowdedKingdoms, repository
127
+ CrowdyPy, workflow `release.yml`, environment `pypi`). The first version there,
128
+ `0.4.0.dev1`, was uploaded by hand from the `dev/v0.4.0` release's assets before the
129
+ publisher existed; every later one comes from its tag. PyPI accepts a version once, so a
130
+ re-run takes the next N (`scripts/ci/resolve_pypi_version.py` reads what PyPI already has).
127
131
 
128
132
  Merging a PR from the command line: `gh pr merge` fails its preflight on this org, so use
129
133
  `gh api -X PUT repos/CrowdedKingdoms/CrowdyPy/pulls/<n>/merge -f merge_method=merge`.
@@ -3,6 +3,43 @@
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.5.0
7
+
8
+ CrowdyJS 18.1.0 and CrowdyCPP 0.55.0. Additive, plus one refusal that is a security fix.
9
+
10
+ - **The ck-exec connect token goes only to a gateway on the estate.** `client.exec.connect`
11
+ and `connect_as_developer` dial a gateway only when `exec_gateway_refusal` (in
12
+ `crowdypy.domains.exec`) passes it. That means `ws` or `wss` without credentials (only
13
+ `wss` under an `https` game API), on the estate of the game API or of this release's default
14
+ origin (two IP addresses only when equal), or a loopback gateway for a loopback game API.
15
+ Any other gateway the game API names is refused before the token leaves the process, with
16
+ `CrowdyExecError("Unavailable", "refusing the gateway …")`. `AsyncExecConnection.open` and
17
+ `ExecConnection.open` still dial what they are given. The rule answers the 19 cases CrowdyJS
18
+ and CrowdyCPP check (`exec-gateway-cases.json`).
19
+ - **A refused upgrade carries the gateway's answer.** HTTP `401` (a token it will not take) is
20
+ `Denied` and anything else `Unavailable`, each with the gateway's reason, as in "the
21
+ gateway refused the connection (HTTP 401: bad signature)". Both used to be `Unavailable`
22
+ "connecting … failed".
23
+ - **Open grids:** `GameAppsAPI.open_permissions(app_id, grid_id)` and
24
+ `set_open_permissions(input)` (`manage_apps`) cover the keys a grid grants every player with
25
+ access to the app. An empty list closes it.
26
+ - CrowdyCPP 0.55.0 also builds on Windows when `<windows.h>` comes first (its `far` and
27
+ `near` macros broke a session header).
28
+ - New live suite `tests/e2e/test_e2e_open_grid_exec_gateway.py`, which runs as a throwaway
29
+ org admin with `CROWDY_E2E_THROWAWAY_OWNER=1`.
30
+
31
+ ## 0.4.1
32
+
33
+ Documentation only; nothing the package does changed. Still CrowdyJS 18.0.4 and CrowdyCPP
34
+ 0.54.0.
35
+
36
+ - The README, which PyPI shows, carries the current tier pins and an example of installing a
37
+ wheel straight from a GitHub release.
38
+ - The roots CrowdyPy wraps beyond CrowdyJS are described precisely: CrowdyJS's portable API
39
+ sends none of them, CrowdyCPP covers them, and CrowdyJS's in-browser agent does send the
40
+ two provider-consent roots and the model-usage root.
41
+ - 0.4.1 is the first version PyPI receives from the release workflow, by trusted publishing.
42
+
6
43
  ## 0.4.0
7
44
 
8
45
  Headless Crowdy Studio and full CrowdyJS parity. Additive; still CrowdyJS 18.0.4 and
@@ -25,7 +62,7 @@ CrowdyCPP 0.54.0.
25
62
  `parse_client_tick_interval_ms` port their CrowdyJS namesakes.
26
63
  - `canonical_json`, `digest_canonical_json` and `project_content_hash` compute the
27
64
  approval digests CrowdyJS computes.
28
- - **The roots CrowdyCPP sends and CrowdyJS does not:**
65
+ - **The roots CrowdyCPP covers and CrowdyJS's portable API leaves out:**
29
66
  - `AuthAPI.confirm_email` and `resend_confirmation_email`;
30
67
  - `UsageAPI.org_summary`, `app_projection` and `org_projection`;
31
68
  - `AppsAPI.compute_budget`, `set_compute_budget` and `clear_compute_budget`;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crowdypy
3
- Version: 0.4.0.dev1
3
+ Version: 0.5.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,19 +51,16 @@ 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.4.0: headless Crowdy Studio, and full parity with CrowdyJS.**
55
- - `crowdypy.studio.CrowdyStudioController` is the Studio editor without a browser: open
56
- projects, edit with autosave and revision conflicts, bind GitHub, apply agent patches with
57
- checkpoints, and build, deploy and run mods. `StudioLayoutController` and
58
- `parse_rustc_diagnostics` match CrowdyJS byte for byte.
59
- - The roots CrowdyCPP sends and CrowdyJS does not are wrapped too: email confirmation, usage
60
- projections, compute budgets, listing versions, the narrow Studio mutations, and
61
- `client.crowdy_studio_agent`.
62
- - `crowdypy.player_host` is the typed observation contract a game implements so tooling can
63
- read the player it controls, validated exactly as CrowdyJS validates it.
64
- - The parity gate is strict: [`docs/parity-matrix.md`](docs/parity-matrix.md) has no gaps.
65
- - 0.3.0 brought the World Stores, the Game Kit, ck-exec and subscriptions; 0.2.0 native UDP
66
- replication (`client.udp`); 0.1.0 the GraphQL client.
54
+ **v0.5.0: open grids, and the ck-exec gateway check (CrowdyJS 18.1.0, CrowdyCPP 0.55.0).**
55
+ - `client.exec.connect()` sends the connect token only to a gateway on the game API's estate
56
+ (or the release's default origin's); any other gateway is refused before it is dialed. A
57
+ gateway that refuses the token is reported as `Denied`, with its reason.
58
+ - `game_apps.open_permissions()` and `set_open_permissions()`: grids open to every player.
59
+ - 0.4 brought the headless Crowdy Studio (`crowdypy.studio`), player-host observation
60
+ (`crowdypy.player_host`), the roots CrowdyCPP covers beyond CrowdyJS, and the strict parity
61
+ gate ([`docs/parity-matrix.md`](docs/parity-matrix.md) has no gaps); 0.3.0 the World Stores,
62
+ the Game Kit, ck-exec and subscriptions; 0.2.0 native UDP replication (`client.udp`); 0.1.0
63
+ the GraphQL client.
67
64
 
68
65
  See [MIGRATION.md](MIGRATION.md).
69
66
 
@@ -83,12 +80,14 @@ API origin (`crowdypy.CROWDY_DEFAULT_TIER` says which):
83
80
 
84
81
  | Tier | PyPI version | Pin |
85
82
  |---|---|---|
86
- | dev | `X.Y.Z.devN` | `crowdypy==0.1.0.dev1` |
87
- | test | `X.Y.ZrcN` | `crowdypy==0.1.0rc1` |
88
- | prod | `X.Y.Z` | `crowdypy==0.1.0` |
83
+ | dev | `X.Y.Z.devN` | `crowdypy==0.4.0.dev1` |
84
+ | test | `X.Y.ZrcN` | `crowdypy==0.4.0rc1` |
85
+ | prod | `X.Y.Z` | `crowdypy==0.4.0` |
89
86
 
90
87
  pip skips pre-releases unless a requirement names one, so a prod range never picks up a dev
91
- or test build. The same wheels are attached to each GitHub release.
88
+ or test build. The same wheels and the sdist are attached to each
89
+ [GitHub release](https://github.com/CrowdedKingdoms/CrowdyPy/releases), and pip installs one
90
+ from its URL (`pip install https://github.com/CrowdedKingdoms/CrowdyPy/releases/download/<tag>/<wheel>`).
92
91
 
93
92
  ## Quick start
94
93
 
@@ -11,19 +11,16 @@ 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.4.0: headless Crowdy Studio, and full parity with CrowdyJS.**
15
- - `crowdypy.studio.CrowdyStudioController` is the Studio editor without a browser: open
16
- projects, edit with autosave and revision conflicts, bind GitHub, apply agent patches with
17
- checkpoints, and build, deploy and run mods. `StudioLayoutController` and
18
- `parse_rustc_diagnostics` match CrowdyJS byte for byte.
19
- - The roots CrowdyCPP sends and CrowdyJS does not are wrapped too: email confirmation, usage
20
- projections, compute budgets, listing versions, the narrow Studio mutations, and
21
- `client.crowdy_studio_agent`.
22
- - `crowdypy.player_host` is the typed observation contract a game implements so tooling can
23
- read the player it controls, validated exactly as CrowdyJS validates it.
24
- - The parity gate is strict: [`docs/parity-matrix.md`](docs/parity-matrix.md) has no gaps.
25
- - 0.3.0 brought the World Stores, the Game Kit, ck-exec and subscriptions; 0.2.0 native UDP
26
- replication (`client.udp`); 0.1.0 the GraphQL client.
14
+ **v0.5.0: open grids, and the ck-exec gateway check (CrowdyJS 18.1.0, CrowdyCPP 0.55.0).**
15
+ - `client.exec.connect()` sends the connect token only to a gateway on the game API's estate
16
+ (or the release's default origin's); any other gateway is refused before it is dialed. A
17
+ gateway that refuses the token is reported as `Denied`, with its reason.
18
+ - `game_apps.open_permissions()` and `set_open_permissions()`: grids open to every player.
19
+ - 0.4 brought the headless Crowdy Studio (`crowdypy.studio`), player-host observation
20
+ (`crowdypy.player_host`), the roots CrowdyCPP covers beyond CrowdyJS, and the strict parity
21
+ gate ([`docs/parity-matrix.md`](docs/parity-matrix.md) has no gaps); 0.3.0 the World Stores,
22
+ the Game Kit, ck-exec and subscriptions; 0.2.0 native UDP replication (`client.udp`); 0.1.0
23
+ the GraphQL client.
27
24
 
28
25
  See [MIGRATION.md](MIGRATION.md).
29
26
 
@@ -43,12 +40,14 @@ API origin (`crowdypy.CROWDY_DEFAULT_TIER` says which):
43
40
 
44
41
  | Tier | PyPI version | Pin |
45
42
  |---|---|---|
46
- | dev | `X.Y.Z.devN` | `crowdypy==0.1.0.dev1` |
47
- | test | `X.Y.ZrcN` | `crowdypy==0.1.0rc1` |
48
- | prod | `X.Y.Z` | `crowdypy==0.1.0` |
43
+ | dev | `X.Y.Z.devN` | `crowdypy==0.4.0.dev1` |
44
+ | test | `X.Y.ZrcN` | `crowdypy==0.4.0rc1` |
45
+ | prod | `X.Y.Z` | `crowdypy==0.4.0` |
49
46
 
50
47
  pip skips pre-releases unless a requirement names one, so a prod range never picks up a dev
51
- or test build. The same wheels are attached to each GitHub release.
48
+ or test build. The same wheels and the sdist are attached to each
49
+ [GitHub release](https://github.com/CrowdedKingdoms/CrowdyPy/releases), and pip installs one
50
+ from its URL (`pip install https://github.com/CrowdedKingdoms/CrowdyPy/releases/download/<tag>/<wheel>`).
52
51
 
53
52
  ## Quick start
54
53
 
@@ -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.4.0`
8
+ - CrowdyPy `0.5.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
@@ -17,6 +17,7 @@ Unconfigured, every suite skips, so `pytest` in CI records skips, not live passe
17
17
  | `CROWDY_E2E_HTTP_URL` | no | the game API origin, when not the minted `game_api_url` |
18
18
  | `CROWDY_E2E_STUDIO_GRID_ID` | no | a grid in the app that the owner controls (Studio suite) |
19
19
  | `CROWDY_E2E_SLOW=1` | no | long-running suites |
20
+ | `CROWDY_E2E_THROWAWAY_OWNER=1` | no | the open-grid suite registers a throwaway owner, org and app (archived afterwards) |
20
21
 
21
22
  ```bash
22
23
  pytest tests/e2e -q
@@ -39,6 +40,7 @@ player once and signs it in for the later suites.
39
40
  | `test_e2e_replication.py` | two players over native UDP: an actor update reaches the other player and echoes back to the sender; a 16-entity batched frame (`send_actor_updates`) reaches the other player; voxel updates and client events reach the other player | `e2e_two_client_actor`, `e2e_self_echo`, `e2e_spatial_distance` |
40
41
  | `test_e2e_world.py` | two World Stores sessions: each sees the other's actor natively; a voxel edit lands in the other session's chunk store | `e2e_stores_live`, `e2e_world_session` |
41
42
  | `test_e2e_world_data.py` | a GraphQL voxel write by an entitled player is recorded and listed back | `e2e_chunks` |
43
+ | `test_e2e_open_grid_exec_gateway.py` | as a throwaway org admin (`CROWDY_E2E_THROWAWAY_OWNER=1`): open a nested grid, read it back, a player holds its keys, a player-code key is refused `BAD_REQUEST`, close it; the tier's ck-exec gateway passes `exec_gateway_refusal`, a connection pings, and a tampered connect token is `Denied` with the gateway's HTTP 401 reason | `e2e_open_grid_exec_gateway` |
42
44
  | `test_e2e_studio.py` | the headless Studio controller creates a project from the mod starter, edits it with autosave, and archives it (optional: needs `CROWDY_E2E_STUDIO_GRID_ID`) | `e2e_crowdy_studio` |
43
45
 
44
46
  ## Live runs
@@ -47,6 +49,8 @@ player once and signs it in for the later suites.
47
49
  |---|---|---|---|
48
50
  | 2026-10-01 | local stack: ck-api at `dev` (`78386df3`), two replication servers, the 3-node Citus lab | 0.4.0 (branch) | 8 passed; Studio skipped (no grid in the app) |
49
51
  | 2026-10-01 | dev tier, app `96701660793088` (CrowdyPy e2e, in the org admin's org) | 0.4.0 (branch) | 8 passed; Studio skipped (the suite needs a grid the owner controls in that app; a placeholder is refused with `CROWDY_STUDIO_GRID_NOT_FOUND`) |
52
+ | 2026-10-01 | dev tier, app `96701660793088` | the published `dev/v0.4.0` wheel (`0.4.0.dev1`, manylinux x86_64, installed into a clean Python 3.12) | 8 passed |
53
+ | 2026-10-01 | dev tier, app `96701660793088` | `crowdypy 0.4.1.dev1` from PyPI (`pip install crowdypy` in a clean Python 3.12; the first version published by trusted publishing) | 8 passed; Studio skipped |
50
54
 
51
55
  ## Not covered here
52
56
 
@@ -4,14 +4,14 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
4
4
 
5
5
  ## Target
6
6
 
7
- - CrowdyJS: `18.0.4` at `c8634082689dbc9c11d720eaf4e05e828ad775d9`
8
- - CrowdyCPP (native core): `0.54.0` at `82803bce9824a7dc220c1e166a2308603d46d91d`
7
+ - CrowdyJS: `18.1.0` at `806b14130786d5b739d6124c0c4c275f8997af15`
8
+ - CrowdyCPP (native core): `0.55.0` at `344772ad0c2d577003c92fa30903d7fcada29940`
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: 1007
14
+ - Covered: 1012
15
15
  - Portable gap: 0
16
16
  - Native equivalent: 38
17
17
  - Browser exclusion: 95
@@ -183,6 +183,7 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
183
183
  | `mutation.setChannelPolicy` | covered |
184
184
  | `mutation.setCrowdyStudioAgentPolicy` | covered |
185
185
  | `mutation.setEarlyAccessOverride` | browser exclusion — super-admin or operator only; the SDK wraps nothing for platform roles (tooling calls it directly) |
186
+ | `mutation.setGridOpenPermissions` | covered |
186
187
  | `mutation.setGridPermissionLimits` | covered |
187
188
  | `mutation.setHostedGameEnabled` | browser exclusion — publishes and administers browser game bundles on the Crowdy Games web host; a Python client has no bundle to publish |
188
189
  | `mutation.setHostedGameListing` | browser exclusion — publishes and administers browser game bundles on the Crowdy Games web host; a Python client has no bundle to publish |
@@ -332,6 +333,7 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
332
333
  | `query.gridClaimPolicy` | covered |
333
334
  | `query.gridClaimRequests` | covered |
334
335
  | `query.gridGroupGrants` | covered |
336
+ | `query.gridOpenPermissions` | covered |
335
337
  | `query.gridOwnership` | covered |
336
338
  | `query.gridPermissionLimits` | covered |
337
339
  | `query.gridUserPermissions` | covered |
@@ -771,10 +773,12 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
771
773
  | `GameAppsAPI.groupGrants` | covered |
772
774
  | `GameAppsAPI.nearbyGrids` | covered |
773
775
  | `GameAppsAPI.nearbyPermissions` | covered |
776
+ | `GameAppsAPI.openPermissions` | covered |
774
777
  | `GameAppsAPI.ownership` | covered |
775
778
  | `GameAppsAPI.permissionLimits` | covered |
776
779
  | `GameAppsAPI.revokeGroup` | covered |
777
780
  | `GameAppsAPI.revokePermissions` | covered |
781
+ | `GameAppsAPI.setOpenPermissions` | covered |
778
782
  | `GameAppsAPI.setPermissionLimits` | covered |
779
783
  | `GameAppsAPI.transferOwnership` | covered |
780
784
  | `GameAppsAPI.userPermissions` | covered |
@@ -1126,6 +1130,7 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
1126
1130
  | `encodeExecFrame` | covered |
1127
1131
  | `engineLanes` | covered |
1128
1132
  | `enginePoseCodec` | covered |
1133
+ | `execGatewayRefusal` | covered |
1129
1134
  | `execModType` | covered |
1130
1135
  | `execStatus` | covered |
1131
1136
  | `fragmentFrame` | covered |
@@ -81,6 +81,14 @@ query GridPermissionLimits($appId: BigInt!, $gridId: BigInt!) {
81
81
  }
82
82
  }
83
83
 
84
+ query GridOpenPermissions($appId: BigInt!, $gridId: BigInt!) {
85
+ gridOpenPermissions(appId: $appId, gridId: $gridId) {
86
+ appId
87
+ gridId
88
+ permissionKeys
89
+ }
90
+ }
91
+
84
92
  query GridGroupGrants($appId: BigInt!, $gridId: BigInt!, $groupId: BigInt!) {
85
93
  gridGroupGrants(appId: $appId, gridId: $gridId, groupId: $groupId) {
86
94
  appId
@@ -145,6 +153,14 @@ mutation SetGridPermissionLimits($input: SetGridPermissionLimitsInput!) {
145
153
  }
146
154
  }
147
155
 
156
+ mutation SetGridOpenPermissions($input: SetGridOpenPermissionsInput!) {
157
+ setGridOpenPermissions(input: $input) {
158
+ appId
159
+ gridId
160
+ permissionKeys
161
+ }
162
+ }
163
+
148
164
  mutation AssignGroupToGrid($input: AssignGroupToGridInput!) {
149
165
  assignGroupToGrid(input: $input) {
150
166
  appId
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "crowdypy"
7
- version = "0.4.0.dev1"
7
+ version = "0.5.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"
@@ -117,20 +117,20 @@ environment = { OPENSSL_ROOT_DIR = "C:/vcpkg/installed/x64-windows-static-md" }
117
117
  # --------------------------------------------------------------------------------------
118
118
 
119
119
  [tool.crowdypy.crowdyjs]
120
- version = "18.0.4"
121
- commit = "c8634082689dbc9c11d720eaf4e05e828ad775d9"
120
+ version = "18.1.0"
121
+ commit = "806b14130786d5b739d6124c0c4c275f8997af15"
122
122
 
123
123
  [tool.crowdypy.crowdycpp]
124
- version = "0.54.0"
125
- tag = "dev/v0.54.0"
126
- commit = "82803bce9824a7dc220c1e166a2308603d46d91d"
127
- tree-sha256 = "94221e93ee685ee09275a65148d07416c93c19bf685f45a2ec3b74ce4517d01c"
124
+ version = "0.55.0"
125
+ tag = "dev/v0.55.0"
126
+ commit = "344772ad0c2d577003c92fa30903d7fcada29940"
127
+ tree-sha256 = "a930e844afa86b9804a8bd8d7d5a93a830f8ef720aa798f31b6dd89d35eaa3ee"
128
128
 
129
129
  # schema.gql and operations/ are CrowdyJS's, copied from the commit pinned above by
130
130
  # scripts/schema_sync.py, which records these hashes and re-derives them in CI.
131
131
  [tool.crowdypy.graphql]
132
- schema-sha256 = "5dcaf15c772c89fe250ecdbd83eb21b52b67f27d739fca38c2871b5553751ab0"
133
- operations-sha256 = "4b0990648ef236dd7901e1cc3413ee4034a0505051adb36d788568993ec31d6b"
132
+ schema-sha256 = "38c490a70f0bd92977fef5867e0b9e14a10d9467a2008dcd2c02bbc96878d8d3"
133
+ operations-sha256 = "d5e0c505589ea26ecc3398b12f02ad7bd786457f7010ad87dcb8af2ea9366c77"
134
134
 
135
135
  # The SDL the docs site publishes. scripts/schema_drift.py compares the snapshot against it
136
136
  # on a schedule; nothing on the per-commit path reads the network.
@@ -1265,7 +1265,7 @@ type App {
1265
1265
  """
1266
1266
  gridClaimApproverUserIds: [String!]!
1267
1267
  """
1268
- Whether players may write the app's wilderness: chunks that no grid but the app's world grid covers. True (the default) leaves those writes to the ordinary voxel permission; false refuses every voxel and chunk write there (updateVoxel, sendVoxelUpdate, updateChunk, ck-exec's world.set_voxels), whoever makes it. Set with updateApp (manage_apps).
1268
+ Whether players may write the app's wilderness: chunks that no grid but the app's world grid covers. True (the default) leaves those writes to the ordinary voxel permission; false refuses every voxel and chunk write there (updateVoxel, sendVoxelUpdate, updateChunk, ck-exec's world.set_voxels, and a client's voxel updates sent straight to the realtime servers), whoever makes it. Set with updateApp (manage_apps).
1269
1269
  """
1270
1270
  wildernessWritesOpen: Boolean!
1271
1271
  """Timestamp when the app was created."""
@@ -5251,6 +5251,20 @@ type GridPermissionLimits {
5251
5251
  permissionKeys: [String!]!
5252
5252
  }
5253
5253
 
5254
+ """
5255
+ The permission keys a grid grants every player with active access to the app (the grid_open_permissions input table).
5256
+ """
5257
+ type GridOpenPermissions {
5258
+ """The app (tenant) that owns the grid."""
5259
+ appId: BigInt!
5260
+ """The grid."""
5261
+ gridId: BigInt!
5262
+ """
5263
+ The keys every player with active access holds on this grid (its limits still cap them). Empty means the grid is not open.
5264
+ """
5265
+ permissionKeys: [String!]!
5266
+ }
5267
+
5254
5268
  """
5255
5269
  A single group/role -> permission-key grant on a grid (one row of the grid_group_grants input table).
5256
5270
  """
@@ -7059,6 +7073,15 @@ type Query {
7059
7073
  gridId: BigInt!
7060
7074
  ): GridPermissionLimits! @requiresPermission(scope: "app", permission: "manage_apps", scopeArg: "appId")
7061
7075
  """
7076
+ Read the permission keys a grid grants every player with active access to the app (an open build area, a public arena). An empty list means the grid is not open. Requires app-admin ('manage_apps').
7077
+ """
7078
+ gridOpenPermissions(
7079
+ """The app (tenant) that owns the grid."""
7080
+ appId: BigInt!
7081
+ """The grid whose open keys to read."""
7082
+ gridId: BigInt!
7083
+ ): GridOpenPermissions! @requiresPermission(scope: "app", permission: "manage_apps", scopeArg: "appId")
7084
+ """
7062
7085
  List the group/role -> permission-key grants configured on a grid for one group (rows of the `grid_group_grants` input table). These are inputs to the effective ACL, not the materialized result — use `gridUserPermissions` for a specific user's effective keys. Requires app-admin ('manage_apps').
7063
7086
  """
7064
7087
  gridGroupGrants(
@@ -8629,7 +8652,7 @@ type Mutation {
8629
8652
  appId: BigInt!
8630
8653
  ): GameHost
8631
8654
  """
8632
- Creates or replaces a chunk's dense voxel grid and/or per-voxel states for the given app and coordinates, records each provided voxel state as an individual voxel update, and asynchronously uploads the chunk to the CDN. WRITES world state. Leaves chunkState and LODs untouched. Requires an app token for the app and either the 'manage_apps' permission on the app (resolved via its org; super admins bypass) or the voxel edit permission for this chunk that updateVoxel checks (app access, the tier's update_voxel_data, and update_voxel_data on a grid covering the chunk). Throws FORBIDDEN otherwise, and for a chunk only the app's world grid covers while the app's wilderness is closed (App.wildernessWritesOpen false).
8655
+ Creates or replaces a chunk's dense voxel grid and/or per-voxel states for the given app and coordinates, records each provided voxel state as an individual voxel update, and asynchronously uploads the chunk to the CDN. WRITES world state. Leaves chunkState and LODs untouched. Requires an app token for the app and either the 'manage_apps' permission on the app (resolved via its org; super admins bypass) or the voxel edit permission for this chunk that updateVoxel checks (app access, the tier's update_voxel_data, and update_voxel_data on the most specific grid covering the chunk). Throws FORBIDDEN otherwise, and for a chunk only the app's world grid covers while the app's wilderness is closed (App.wildernessWritesOpen false).
8633
8656
  """
8634
8657
  updateChunk(input: ChunkUpdateInput!): Chunk!
8635
8658
  """
@@ -8641,7 +8664,7 @@ type Mutation {
8641
8664
  """
8642
8665
  updateChunkLods(input: UpdateChunkLodsInput!): Chunk @requiresPermission(scope: "app", permission: "manage_apps", scopeArg: "input.appId")
8643
8666
  """
8644
- Records (upserts) a single voxel edit in the voxel_updates log for one chunk and returns the resulting Voxel. WRITES world state; a background maintenance job later folds these edits into the chunk's packed grid. Requires a valid bearer token AND voxel-edit permission for the target region: the user must have active app access, the `update_voxel_data` tier permission, and (when grids cover the chunk) `update_voxel_data` on a covering grid. A chunk only the app's world grid covers is refused while the app's wilderness is closed (App.wildernessWritesOpen false).
8667
+ Records (upserts) a single voxel edit in the voxel_updates log for one chunk and returns the resulting Voxel. WRITES world state; a background maintenance job later folds these edits into the chunk's packed grid. Requires a valid bearer token AND voxel-edit permission for the target region: the user must have active app access, the `update_voxel_data` tier permission, and `update_voxel_data` on the most specific grid covering the chunk (the smallest by volume; of equal ones the lowest grid id), so a claim, a plot or a safe zone decides its chunks and the app's world grid decides only the wilderness. A chunk no grid covers is refused, and so is a chunk only the app's world grid covers while the app's wilderness is closed (App.wildernessWritesOpen false).
8645
8668
  """
8646
8669
  updateVoxel(input: UpdateVoxelInput!): Voxel! @requiresPermission(scope: "runtime", permission: "update_voxel_data", scopeArg: "input.appId")
8647
8670
  """
@@ -8706,6 +8729,15 @@ type Mutation {
8706
8729
  input: SetGridPermissionLimitsInput!
8707
8730
  ): GridPermissionLimits! @requiresPermission(scope: "app", permission: "manage_apps", scopeArg: "input.appId")
8708
8731
  """
8732
+ Open a grid to every player: replace the permission keys it grants each player with active access to the app (writes the `grid_open_permissions` input table), then recompute the grid's materialized effective ACL for all of them. The most specific grid covering a chunk decides a voxel write there, so a zone inside the world grid that everyone may build in must grant `update_voxel_data` itself. The grid's limits still cap these keys; players who get access later receive them when they connect. Pass an empty array to close the grid. Refuses the app's world grid (already open), the four player-code keys, and a 33rd open grid in one app. Requires app-admin ('manage_apps').
8733
+ """
8734
+ setGridOpenPermissions(
8735
+ """
8736
+ The app, grid, and the keys it grants every player (empty array = close it).
8737
+ """
8738
+ input: SetGridOpenPermissionsInput!
8739
+ ): GridOpenPermissions! @requiresPermission(scope: "app", permission: "manage_apps", scopeArg: "input.appId")
8740
+ """
8709
8741
  Grant runtime permission keys to a group (optionally scoped to a single group role) on a grid by writing the `grid_group_grants` input table, then recompute the materialized effective ACL so every affected member gains the keys. Requires app-admin ('manage_apps'). Returns the grid's current group grants for the group. Use `grantGridPermissions` for per-user grants instead.
8710
8742
  """
8711
8743
  assignGroupToGrid(
@@ -8989,7 +9021,7 @@ type Mutation {
8989
9021
  gridId: BigInt!
8990
9022
  ): GridClaimResult!
8991
9023
  """
8992
- Claim one currently unclaimed chunk as a new player-owned grid. Requires an ordinary app-scoped player token and active app access, but never manage_apps. The app's policy must be SELF_CLAIM. The server validates the app's grid assignment and peer-overlap rules, then atomically creates a one-chunk grid, assigns current-user ownership, grants access/update_voxel_data/use_voice_chat/teleport plus the player-code keys and use_video_chat where the caller's tier already carries them, and materializes the effective ACL. Conflicts and policy denials throw GraphQL errors; no partial grid, ownership, or grant rows remain.
9024
+ Claim one wilderness chunk (a chunk no grid but the app's world grid covers) as a new player-owned grid. Requires an ordinary app-scoped player token and active app access, but never manage_apps. The app's policy must be SELF_CLAIM. A chunk inside another grid (a plot, a zone or another claim) is refused FORBIDDEN (GRID_NOT_CLAIMABLE): the claim would be the most specific grid there and take the chunk from whoever that grid grants. The server validates the app's grid assignment and peer-overlap rules, then atomically creates a one-chunk grid, assigns current-user ownership, grants access/update_voxel_data/use_voice_chat/teleport plus the player-code keys and use_video_chat where the caller's tier already carries them, and materializes the effective ACL. Conflicts and policy denials throw GraphQL errors; no partial grid, ownership, or grant rows remain.
8993
9025
  """
8994
9026
  claimGridChunk(
8995
9027
  """
@@ -9404,7 +9436,7 @@ type Mutation {
9404
9436
  input: ActorUpdateRequestInput!
9405
9437
  ): Boolean!
9406
9438
  """
9407
- Send a single voxel (block) update for spatial replication to nearby chunks. Requires a bearer game token; opens a UDP proxy session automatically if none exists. Returns Boolean! that is true only when the datagram was ACCEPTED FOR SENDING to the game server — NOT confirmation that the world applied the change. There is NO separate per-request success response: the change fans out to nearby clients (the sender included) as a VoxelUpdateNotification carrying the same sequenceNumber (VoxelUpdateResponse is legacy and is never emitted). Failures arrive ASYNCHRONOUSLY as a GenericErrorResponse; both are correlated by the request sequenceNumber (correlation only — not an idempotency key; the server does not dedupe replays). Throws FORBIDDEN synchronously for a chunk only the app's world grid covers while the app's wilderness is closed (App.wildernessWritesOpen false).
9439
+ Send a single voxel (block) update for spatial replication to nearby chunks. Requires a bearer game token; opens a UDP proxy session automatically if none exists. Returns Boolean! that is true only when the datagram was ACCEPTED FOR SENDING to the game server — NOT confirmation that the world applied the change. There is NO separate per-request success response: the change fans out to nearby clients (the sender included) as a VoxelUpdateNotification carrying the same sequenceNumber (VoxelUpdateResponse is legacy and is never emitted). Failures arrive ASYNCHRONOUSLY as a GenericErrorResponse; both are correlated by the request sequenceNumber (correlation only — not an idempotency key; the server does not dedupe replays). Throws FORBIDDEN synchronously, before anything is sent, without the voxel edit permission updateVoxel checks for the chunk (app access, the tier's update_voxel_data, and update_voxel_data on the most specific grid covering the chunk), and for a chunk only the app's world grid covers while the app's wilderness is closed (App.wildernessWritesOpen false).
9408
9440
  """
9409
9441
  sendVoxelUpdate(
9410
9442
  """
@@ -9921,7 +9953,7 @@ input UpdateAppInput {
9921
9953
  """
9922
9954
  metadata: String
9923
9955
  """
9924
- Open (true) or close (false) the app's wilderness to voxel and chunk writes: chunks that no grid but the app's world grid covers. Closing refuses every write there, whoever makes it; each game API replica acts on the change within 15 seconds. Omit to leave unchanged.
9956
+ Open (true) or close (false) the app's wilderness to voxel and chunk writes: chunks that no grid but the app's world grid covers. Closing refuses every write there, whoever makes it; each game API replica, and each realtime server for a client's direct voxel updates, acts on the change within about 15 seconds. Omit to leave unchanged.
9925
9957
  """
9926
9958
  wildernessWritesOpen: Boolean
9927
9959
  }
@@ -10667,6 +10699,22 @@ input SetGridPermissionLimitsInput {
10667
10699
  permissionKeys: [String!]!
10668
10700
  }
10669
10701
 
10702
+ """
10703
+ Set the permission keys a grid grants every player with active access to the app (writes the grid_open_permissions input table): an open build area, a public arena.
10704
+ """
10705
+ input SetGridOpenPermissionsInput {
10706
+ """The app (tenant) that owns the grid."""
10707
+ appId: BigInt!
10708
+ """
10709
+ The grid to open (or close). Not the app's world grid, which is open by default.
10710
+ """
10711
+ gridId: BigInt!
10712
+ """
10713
+ The keys every player with active access holds on this grid, capped by its limits. Empty array closes it (players keep only what they are granted directly or through a group). Each must be an active grid permission key, unique, at most 64 chars, and not one of the four player-code keys.
10714
+ """
10715
+ permissionKeys: [String!]!
10716
+ }
10717
+
10670
10718
  """
10671
10719
  Grant runtime permission keys to a group (optionally one role) on a grid (writes the grid_group_grants input table).
10672
10720
  """
@@ -1,6 +1,6 @@
1
1
  """GENERATED by scripts/codegen.py from schema.gql. Do not edit.
2
2
 
3
- schema.gql sha256: 5dcaf15c772c89fe250ecdbd83eb21b52b67f27d739fca38c2871b5553751ab0
3
+ schema.gql sha256: 38c490a70f0bd92977fef5867e0b9e14a10d9467a2008dcd2c02bbc96878d8d3
4
4
  """
5
5
 
6
6
  from enum import StrEnum
@@ -4,7 +4,7 @@ Every GraphQL input object as a msgspec Struct. Attributes are snake_case and en
4
4
  under their GraphQL names; an attribute left at UNSET is omitted from the request,
5
5
  which is how the API tells 'not provided' from an explicit null.
6
6
 
7
- schema.gql sha256: 5dcaf15c772c89fe250ecdbd83eb21b52b67f27d739fca38c2871b5553751ab0
7
+ schema.gql sha256: 38c490a70f0bd92977fef5867e0b9e14a10d9467a2008dcd2c02bbc96878d8d3
8
8
  """
9
9
 
10
10
  from __future__ import annotations
@@ -860,6 +860,13 @@ class SetCrowdyStudioProviderConsentInput(msgspec.Struct, kw_only=True, omit_def
860
860
  consented: bool
861
861
 
862
862
 
863
+ class SetGridOpenPermissionsInput(msgspec.Struct, kw_only=True, omit_defaults=True, rename={'app_id': 'appId', 'grid_id': 'gridId', 'permission_keys': 'permissionKeys'}):
864
+ 'Set the permission keys a grid grants every player with active access to the app (writes the grid_open_permissions input table): an open build area, a public arena.'
865
+ app_id: str
866
+ grid_id: str
867
+ permission_keys: list[str]
868
+
869
+
863
870
  class SetGridPermissionLimitsInput(msgspec.Struct, kw_only=True, omit_defaults=True, rename={'app_id': 'appId', 'grid_id': 'gridId', 'permission_keys': 'permissionKeys'}):
864
871
  'Set the per-grid permission-key whitelist (writes the grid_permission_limits input table).'
865
872
  app_id: str
@@ -1213,6 +1220,7 @@ __all__ = [
1213
1220
  'SetCrowdyStudioLibraryFileArchivedInput',
1214
1221
  'SetCrowdyStudioProjectArchivedInput',
1215
1222
  'SetCrowdyStudioProviderConsentInput',
1223
+ 'SetGridOpenPermissionsInput',
1216
1224
  'SetGridPermissionLimitsInput',
1217
1225
  'SetHostedGameEnabledInput',
1218
1226
  'SetHostedGameListingInput',
@@ -1,7 +1,7 @@
1
1
  """GENERATED by scripts/codegen.py from schema.gql and operations/. Do not edit.
2
2
 
3
- schema.gql sha256: 5dcaf15c772c89fe250ecdbd83eb21b52b67f27d739fca38c2871b5553751ab0
4
- operations/ sha256: 4b0990648ef236dd7901e1cc3413ee4034a0505051adb36d788568993ec31d6b
3
+ schema.gql sha256: 38c490a70f0bd92977fef5867e0b9e14a10d9467a2008dcd2c02bbc96878d8d3
4
+ operations/ sha256: d5e0c505589ea26ecc3398b12f02ad7bd786457f7010ad87dcb8af2ea9366c77
5
5
  """
6
6
 
7
7
  from crowdypy._operation import Operation
@@ -1079,6 +1079,14 @@ GRID_GROUP_GRANTS = Operation(
1079
1079
  document='query GridGroupGrants($appId: BigInt!, $gridId: BigInt!, $groupId: BigInt!) {\n gridGroupGrants(appId: $appId, gridId: $gridId, groupId: $groupId) {\n appId\n gridId\n groupId\n groupRoleId\n permissionKey\n expiresAt\n }\n}',
1080
1080
  )
1081
1081
 
1082
+ # gameApps/GameApps.graphql
1083
+ GRID_OPEN_PERMISSIONS = Operation(
1084
+ name='GridOpenPermissions',
1085
+ kind='query',
1086
+ root_fields=('gridOpenPermissions',),
1087
+ document='query GridOpenPermissions($appId: BigInt!, $gridId: BigInt!) {\n gridOpenPermissions(appId: $appId, gridId: $gridId) {\n appId\n gridId\n permissionKeys\n }\n}',
1088
+ )
1089
+
1082
1090
  # gameApps/GameApps.graphql
1083
1091
  GRID_OWNERSHIP = Operation(
1084
1092
  name='GridOwnership',
@@ -1743,6 +1751,14 @@ SET_CHANNEL_POLICY = Operation(
1743
1751
  document='mutation SetChannelPolicy($input: SetChannelPolicyInput!) {\n setChannelPolicy(input: $input) {\n appId\n groupType\n creationPolicy\n defaultMembershipPolicy\n maxMembers\n maxGroupsPerUser\n }\n}',
1744
1752
  )
1745
1753
 
1754
+ # gameApps/GameApps.graphql
1755
+ SET_GRID_OPEN_PERMISSIONS = Operation(
1756
+ name='SetGridOpenPermissions',
1757
+ kind='mutation',
1758
+ root_fields=('setGridOpenPermissions',),
1759
+ document='mutation SetGridOpenPermissions($input: SetGridOpenPermissionsInput!) {\n setGridOpenPermissions(input: $input) {\n appId\n gridId\n permissionKeys\n }\n}',
1760
+ )
1761
+
1746
1762
  # gameApps/GameApps.graphql
1747
1763
  SET_GRID_PERMISSION_LIMITS = Operation(
1748
1764
  name='SetGridPermissionLimits',
@@ -2263,6 +2279,7 @@ OPERATIONS: dict[str, Operation] = {op.name: op for op in (
2263
2279
  GRAPHQL_SERVERS,
2264
2280
  GRID_CHANNELS,
2265
2281
  GRID_GROUP_GRANTS,
2282
+ GRID_OPEN_PERMISSIONS,
2266
2283
  GRID_OWNERSHIP,
2267
2284
  GRID_PERMISSION_LIMITS,
2268
2285
  GRID_USER_PERMISSIONS,
@@ -2346,6 +2363,7 @@ OPERATIONS: dict[str, Operation] = {op.name: op for op in (
2346
2363
  SET_AUTO_BILLING,
2347
2364
  SET_CHANNEL_MEMBER_ROLES,
2348
2365
  SET_CHANNEL_POLICY,
2366
+ SET_GRID_OPEN_PERMISSIONS,
2349
2367
  SET_GRID_PERMISSION_LIMITS,
2350
2368
  SET_PLAYER_AUTO_BILLING,
2351
2369
  SET_PLAYER_RATE_MARKUP,
@@ -6,7 +6,8 @@ The model endpoint itself is REST (``GET /v1/model/models``, ``POST
6
6
  spends tokens through. These GraphQL companions read what it recorded and gate whether it
7
7
  may run: the player's provider consent and own usage (``use_studio_agent``), and the app's
8
8
  policy and sanitized usage (``view_compute_diagnostics``; ``manage_compute`` to change it).
9
- Mirrors CrowdyCPP's ``CrowdyStudioAgentAPI``; CrowdyJS sends these from its agent pane.
9
+ Mirrors CrowdyCPP's ``CrowdyStudioAgentAPI``. CrowdyJS's in-browser agent sends the consent
10
+ and model-usage roots itself; its portable API sends none of the seven.
10
11
  """
11
12
 
12
13
  from __future__ import annotations