crowdypy 0.8.0.dev1__tar.gz → 0.9.1.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 (508) hide show
  1. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/MIGRATION.md +23 -0
  2. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/PKG-INFO +7 -1
  3. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/README.md +6 -0
  4. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/docs/compatibility.md +5 -1
  5. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/docs/parity-matrix.md +2 -2
  6. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/exec/Exec.graphql +1 -0
  7. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/pyproject.toml +9 -9
  8. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/schema.gql +5 -1
  9. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/check_content_policy.py +5 -1
  10. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/check_pin_tiers.py +75 -6
  11. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_generated/enums.py +1 -1
  12. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_generated/inputs.py +1 -1
  13. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_generated/operations.py +7 -7
  14. crowdypy-0.9.1.dev1/src/crowdypy/_sync/domains/input_log.py +113 -0
  15. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_version.py +1 -1
  16. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/exec.py +4 -1
  17. crowdypy-0.9.1.dev1/src/crowdypy/domains/input_log.py +112 -0
  18. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/player_host/schemas.v1.json +2 -2
  19. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/fixtures/player-host.v1.json +2 -2
  20. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/domains/test_studio_exec_domains.py +4 -0
  21. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/domains/test_world_domains.py +19 -0
  22. crowdypy-0.9.1.dev1/tests/unit/test_check_pin_tiers.py +59 -0
  23. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/uv.lock +2 -2
  24. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/CMakeLists.txt +1 -1
  25. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/PROVENANCE.md +1 -1
  26. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/exec.hpp +7 -5
  27. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/generated/enums.hpp +2 -2
  28. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/generated/operations.hpp +8 -2
  29. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/package.json +6 -6
  30. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdy-studio-diagnostics.v1.json +2 -2
  31. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdyjs-studio-layout.v1.json +2 -2
  32. crowdypy-0.8.0.dev1/src/crowdypy/_sync/domains/input_log.py +0 -80
  33. crowdypy-0.8.0.dev1/src/crowdypy/domains/input_log.py +0 -79
  34. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/.gitattributes +0 -0
  35. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/.gitignore +0 -0
  36. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/.gitleaks.toml +0 -0
  37. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/AGENTS.md +0 -0
  38. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/CMakeLists.txt +0 -0
  39. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/LICENSE +0 -0
  40. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/SECURITY.md +0 -0
  41. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/benchmarks/README.md +0 -0
  42. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/benchmarks/bench_replication.py +0 -0
  43. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/docs/e2e-coverage.md +0 -0
  44. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/licenses/OpenSSL-LICENSE.txt +0 -0
  45. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/native/common.hpp +0 -0
  46. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/native/module.cpp +0 -0
  47. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/native/replication.hpp +0 -0
  48. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/native/replication_binding.cpp +0 -0
  49. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/native/session_binding.cpp +0 -0
  50. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/native/voice_binding.cpp +0 -0
  51. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/native/wire_binding.cpp +0 -0
  52. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/actors/Actor.graphql +0 -0
  53. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/actors/Actors.graphql +0 -0
  54. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/actors/BatchLookupActors.graphql +0 -0
  55. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/actors/CreateActor.graphql +0 -0
  56. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/actors/DeleteActor.graphql +0 -0
  57. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/actors/UpdateActor.graphql +0 -0
  58. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/actors/UpdateActorState.graphql +0 -0
  59. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/AppAccessTiers.graphql +0 -0
  60. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/AppFeatures.graphql +0 -0
  61. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/AppGrantMemberCandidates.graphql +0 -0
  62. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/AppUserAccessByApp.graphql +0 -0
  63. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/ArchiveAccessTier.graphql +0 -0
  64. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/ClaimFreeAppAccess.graphql +0 -0
  65. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/CreateAccessTier.graphql +0 -0
  66. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/DefineAppFeature.graphql +0 -0
  67. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/GrantAppAccess.graphql +0 -0
  68. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/GrantMyAppAccess.graphql +0 -0
  69. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/GrantTierFeature.graphql +0 -0
  70. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/MyAppAccess.graphql +0 -0
  71. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/RevokeAppAccess.graphql +0 -0
  72. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/RevokeTierFeature.graphql +0 -0
  73. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/RuntimePermissions.graphql +0 -0
  74. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/SuspendAppAccess.graphql +0 -0
  75. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/TierFeatures.graphql +0 -0
  76. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/appAccess/UpdateAccessTier.graphql +0 -0
  77. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/App.graphql +0 -0
  78. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/AppBySlug.graphql +0 -0
  79. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/AppDiscovery.graphql +0 -0
  80. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/AppsForOrg.graphql +0 -0
  81. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/ArchiveApp.graphql +0 -0
  82. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/CodeAdmissions.graphql +0 -0
  83. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/CreateApp.graphql +0 -0
  84. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/MarketplaceApps.graphql +0 -0
  85. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/MyApps.graphql +0 -0
  86. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/PlaceableDatacenters.graphql +0 -0
  87. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/apps/UpdateApp.graphql +0 -0
  88. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/auth/Logout.graphql +0 -0
  89. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/auth/LogoutAllDevices.graphql +0 -0
  90. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/avatars/Avatars.graphql +0 -0
  91. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/billing/AppBudget.graphql +0 -0
  92. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/billing/AppBudgets.graphql +0 -0
  93. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/billing/SetAppBudget.graphql +0 -0
  94. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/billing/WalletBalance.graphql +0 -0
  95. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/billing/WalletTransactions.graphql +0 -0
  96. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/AddChannelMember.graphql +0 -0
  97. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/Channel.graphql +0 -0
  98. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/ChannelMembers.graphql +0 -0
  99. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/ChannelPolicy.graphql +0 -0
  100. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/ChannelRoles.graphql +0 -0
  101. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/Channels.graphql +0 -0
  102. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/CreateChannel.graphql +0 -0
  103. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/CreateChannelRole.graphql +0 -0
  104. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/DeleteChannel.graphql +0 -0
  105. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/DeleteChannelRole.graphql +0 -0
  106. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/JoinChannel.graphql +0 -0
  107. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/LeaveChannel.graphql +0 -0
  108. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/MyChannels.graphql +0 -0
  109. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/RemoveChannelMember.graphql +0 -0
  110. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/RequestToJoinChannel.graphql +0 -0
  111. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/SetChannelMemberRoles.graphql +0 -0
  112. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/SetChannelPolicy.graphql +0 -0
  113. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/UpdateChannel.graphql +0 -0
  114. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/channels/UpdateChannelRole.graphql +0 -0
  115. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/chunks/GetChunk.graphql +0 -0
  116. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/chunks/GetChunkLods.graphql +0 -0
  117. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/chunks/GetChunksByDistance.graphql +0 -0
  118. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/chunks/GetVoxelList.graphql +0 -0
  119. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/chunks/UpdateChunk.graphql +0 -0
  120. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/chunks/UpdateChunkLods.graphql +0 -0
  121. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/chunks/UpdateChunkState.graphql +0 -0
  122. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/crowdyStudio/CrowdyStudio.graphql +0 -0
  123. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/gameApps/GameApps.graphql +0 -0
  124. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/grids/CreateGridChannel.graphql +0 -0
  125. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/grids/GridChannels.graphql +0 -0
  126. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/grids/MintGridToken.graphql +0 -0
  127. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/host/Host.graphql +0 -0
  128. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/inputLog/InputLogMessages.graphql +0 -0
  129. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/inputLog/InputLogSessions.graphql +0 -0
  130. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/marketplace/Marketplace.graphql +0 -0
  131. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/CreateOrgRole.graphql +0 -0
  132. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/CreateOrgToken.graphql +0 -0
  133. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/CreateOrganization.graphql +0 -0
  134. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/DeleteOrgRole.graphql +0 -0
  135. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/InviteOrgMember.graphql +0 -0
  136. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/MemberRoles.graphql +0 -0
  137. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/MyOrganizations.graphql +0 -0
  138. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/OrgMembers.graphql +0 -0
  139. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/OrgPermissions.graphql +0 -0
  140. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/OrgRoles.graphql +0 -0
  141. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/OrgTokens.graphql +0 -0
  142. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/Organization.graphql +0 -0
  143. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/OrganizationBySlug.graphql +0 -0
  144. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/RemoveOrgMember.graphql +0 -0
  145. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/RevokeOrgToken.graphql +0 -0
  146. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/UpdateOrgMemberRoles.graphql +0 -0
  147. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/UpdateOrgRole.graphql +0 -0
  148. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/organizations/UpdateOrgToken.graphql +0 -0
  149. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/payments/CapturePaypalCheckout.graphql +0 -0
  150. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/payments/CreateCheckout.graphql +0 -0
  151. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/payments/MyCheckouts.graphql +0 -0
  152. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/platform/PlatformConfig.graphql +0 -0
  153. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/playerWallet/PlayerWallet.graphql +0 -0
  154. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/quotas/DeleteQuota.graphql +0 -0
  155. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/quotas/EffectiveQuota.graphql +0 -0
  156. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/quotas/QuotasForApp.graphql +0 -0
  157. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/quotas/QuotasForOrg.graphql +0 -0
  158. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/quotas/SetQuota.graphql +0 -0
  159. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/serverStatus/ActiveGraphQLServers.graphql +0 -0
  160. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/serverStatus/GameClientBootstrap.graphql +0 -0
  161. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/serverStatus/GraphqlServers.graphql +0 -0
  162. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/serverStatus/ServerWithLeastClients.graphql +0 -0
  163. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/serverStatus/VersionInfo.graphql +0 -0
  164. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/sharedEnvironment/SharedEnvironment.graphql +0 -0
  165. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/state/DeleteUserAppState.graphql +0 -0
  166. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/state/UpdateUserAppState.graphql +0 -0
  167. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/state/UserAppState.graphql +0 -0
  168. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/state/UserAppStates.graphql +0 -0
  169. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/AddTeamMember.graphql +0 -0
  170. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/CreateTeam.graphql +0 -0
  171. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/CreateTeamRole.graphql +0 -0
  172. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/DeleteTeam.graphql +0 -0
  173. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/DeleteTeamRole.graphql +0 -0
  174. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/JoinTeam.graphql +0 -0
  175. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/LeaveTeam.graphql +0 -0
  176. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/MyTeams.graphql +0 -0
  177. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/RemoveTeamMember.graphql +0 -0
  178. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/RequestToJoinTeam.graphql +0 -0
  179. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/SetTeamMemberRoles.graphql +0 -0
  180. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/SetTeamPolicy.graphql +0 -0
  181. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/Team.graphql +0 -0
  182. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/TeamMembers.graphql +0 -0
  183. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/TeamPolicy.graphql +0 -0
  184. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/TeamRoles.graphql +0 -0
  185. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/Teams.graphql +0 -0
  186. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/UpdateTeam.graphql +0 -0
  187. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teams/UpdateTeamRole.graphql +0 -0
  188. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/teleport/TeleportRequest.graphql +0 -0
  189. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/usage/AppGraphqlOperations.graphql +0 -0
  190. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/usage/AppUsageSummary.graphql +0 -0
  191. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/usage/PlayerPulse.graphql +0 -0
  192. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/users/DeleteMyAccount.graphql +0 -0
  193. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/users/FreePlayWindow.graphql +0 -0
  194. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/users/Me.graphql +0 -0
  195. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/users/PlayerProfile.graphql +0 -0
  196. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/users/UpdateGamertag.graphql +0 -0
  197. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/users/UpdateUserState.graphql +0 -0
  198. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/users/User.graphql +0 -0
  199. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/voxels/ListVoxelUpdatesByDistance.graphql +0 -0
  200. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/voxels/ListVoxels.graphql +0 -0
  201. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/voxels/RollbackVoxelUpdates.graphql +0 -0
  202. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/voxels/UpdateVoxel.graphql +0 -0
  203. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/operations/voxels/VoxelUpdateHistory.graphql +0 -0
  204. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/_pins.py +0 -0
  205. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/assert_default_origin.py +0 -0
  206. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/build_openssl.sh +0 -0
  207. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/cibw_before_all_linux.sh +0 -0
  208. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/resolve-release-tier.sh +0 -0
  209. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/resolve-release-tier.test.sh +0 -0
  210. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/resolve_pypi_version.py +0 -0
  211. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/stamp_version.py +0 -0
  212. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/ci/verify_artifacts.py +0 -0
  213. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/codegen.py +0 -0
  214. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/schema_drift.py +0 -0
  215. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/schema_sync.py +0 -0
  216. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/unasync.py +0 -0
  217. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/scripts/vendor_crowdycpp.py +0 -0
  218. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/__init__.py +0 -0
  219. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_concurrency.py +0 -0
  220. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_default_origin.py +0 -0
  221. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_generated/__init__.py +0 -0
  222. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_grid.py +0 -0
  223. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_native.pyi +0 -0
  224. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_operation.py +0 -0
  225. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/__init__.py +0 -0
  226. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/client.py +0 -0
  227. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/__init__.py +0 -0
  228. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/_base.py +0 -0
  229. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/actors.py +0 -0
  230. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/admin.py +0 -0
  231. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/app_access.py +0 -0
  232. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/apps.py +0 -0
  233. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/auth.py +0 -0
  234. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/avatars.py +0 -0
  235. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/billing.py +0 -0
  236. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/channels.py +0 -0
  237. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/chunks.py +0 -0
  238. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/crowdy_studio.py +0 -0
  239. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/crowdy_studio_agent.py +0 -0
  240. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/crowdy_studio_github.py +0 -0
  241. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/discovery.py +0 -0
  242. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/exec.py +0 -0
  243. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/game_apps.py +0 -0
  244. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/grids.py +0 -0
  245. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/host.py +0 -0
  246. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/marketplace.py +0 -0
  247. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/organizations.py +0 -0
  248. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/payments.py +0 -0
  249. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/platform.py +0 -0
  250. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/player_wallet.py +0 -0
  251. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/portal.py +0 -0
  252. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/quotas.py +0 -0
  253. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/server_status.py +0 -0
  254. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/shared_environment.py +0 -0
  255. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/state.py +0 -0
  256. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/teams.py +0 -0
  257. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/teleport.py +0 -0
  258. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/udp.py +0 -0
  259. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/usage.py +0 -0
  260. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/users.py +0 -0
  261. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/domains/voxels.py +0 -0
  262. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/graphql.py +0 -0
  263. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/grid_scope.py +0 -0
  264. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/kit/__init__.py +0 -0
  265. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/kit/actions.py +0 -0
  266. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/kit/kit.py +0 -0
  267. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/kit/social.py +0 -0
  268. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/kit/wire.py +0 -0
  269. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/rediscover.py +0 -0
  270. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/stores.py +0 -0
  271. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/_sync/world.py +0 -0
  272. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/auth_state.py +0 -0
  273. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/client.py +0 -0
  274. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/codecs.py +0 -0
  275. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/datacenter_redirect.py +0 -0
  276. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/__init__.py +0 -0
  277. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/_base.py +0 -0
  278. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/actors.py +0 -0
  279. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/admin.py +0 -0
  280. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/app_access.py +0 -0
  281. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/apps.py +0 -0
  282. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/auth.py +0 -0
  283. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/avatars.py +0 -0
  284. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/billing.py +0 -0
  285. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/channels.py +0 -0
  286. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/chunks.py +0 -0
  287. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/crowdy_studio.py +0 -0
  288. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/crowdy_studio_agent.py +0 -0
  289. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/crowdy_studio_github.py +0 -0
  290. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/discovery.py +0 -0
  291. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/game_apps.py +0 -0
  292. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/grids.py +0 -0
  293. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/host.py +0 -0
  294. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/marketplace.py +0 -0
  295. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/organizations.py +0 -0
  296. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/payments.py +0 -0
  297. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/platform.py +0 -0
  298. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/player_wallet.py +0 -0
  299. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/portal.py +0 -0
  300. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/quotas.py +0 -0
  301. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/server_status.py +0 -0
  302. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/shared_environment.py +0 -0
  303. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/state.py +0 -0
  304. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/teams.py +0 -0
  305. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/teleport.py +0 -0
  306. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/udp.py +0 -0
  307. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/usage.py +0 -0
  308. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/users.py +0 -0
  309. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/domains/voxels.py +0 -0
  310. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/enums.py +0 -0
  311. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/errors.py +0 -0
  312. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/estate.py +0 -0
  313. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/exec_gateway.py +0 -0
  314. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/graphql.py +0 -0
  315. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/grid_scope.py +0 -0
  316. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/inputs.py +0 -0
  317. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/kit/__init__.py +0 -0
  318. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/kit/actions.py +0 -0
  319. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/kit/kit.py +0 -0
  320. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/kit/social.py +0 -0
  321. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/kit/wire.py +0 -0
  322. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/lb_cookie.py +0 -0
  323. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/media.py +0 -0
  324. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/pkce.py +0 -0
  325. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/player_host/__init__.py +0 -0
  326. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/player_host/agent_errors.py +0 -0
  327. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/player_host/agent_types.py +0 -0
  328. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/player_host/json_schema.py +0 -0
  329. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/player_host/schemas.py +0 -0
  330. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/player_host/types.py +0 -0
  331. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/py.typed +0 -0
  332. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/rediscover.py +0 -0
  333. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/replication.py +0 -0
  334. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/session.py +0 -0
  335. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/stores.py +0 -0
  336. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/studio/__init__.py +0 -0
  337. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/studio/client_tick_interval.py +0 -0
  338. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/studio/controller.py +0 -0
  339. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/studio/diagnostics.py +0 -0
  340. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/studio/github_new_repo.py +0 -0
  341. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/studio/layout.py +0 -0
  342. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/studio/models.py +0 -0
  343. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/studio/starter_projects.py +0 -0
  344. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/subscriptions.py +0 -0
  345. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/sync.py +0 -0
  346. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/utils.py +0 -0
  347. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/wire.py +0 -0
  348. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/src/crowdypy/world.py +0 -0
  349. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/conftest.py +0 -0
  350. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/__init__.py +0 -0
  351. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/conftest.py +0 -0
  352. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/test_e2e_identity.py +0 -0
  353. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/test_e2e_open_grid_exec_gateway.py +0 -0
  354. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/test_e2e_ranged_channel.py +0 -0
  355. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/test_e2e_replication.py +0 -0
  356. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/test_e2e_studio.py +0 -0
  357. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/test_e2e_world.py +0 -0
  358. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/e2e/test_e2e_world_data.py +0 -0
  359. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/fixtures/README.md +0 -0
  360. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/fixtures/binary-wire-fixtures.json +0 -0
  361. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/fixtures/exec-client-frames.json +0 -0
  362. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/fixtures/voice-frames.json +0 -0
  363. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/__init__.py +0 -0
  364. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/domains/__init__.py +0 -0
  365. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/domains/test_crowdycpp_roots.py +0 -0
  366. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/domains/test_org_domains.py +0 -0
  367. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/domains/test_social_domains.py +0 -0
  368. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_core.py +0 -0
  369. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_durable_stores.py +0 -0
  370. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_estate_moves.py +0 -0
  371. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_exec_gateway.py +0 -0
  372. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_fixture_provenance.py +0 -0
  373. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_grid_scope.py +0 -0
  374. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_kit.py +0 -0
  375. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_lazy_exports.py +0 -0
  376. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_player_host.py +0 -0
  377. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_refusals.py +0 -0
  378. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_release_versions.py +0 -0
  379. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_replication.py +0 -0
  380. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_sdk_audience.py +0 -0
  381. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_studio_controller.py +0 -0
  382. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_studio_diagnostics.py +0 -0
  383. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_studio_layout.py +0 -0
  384. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_subscriptions.py +0 -0
  385. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_transport.py +0 -0
  386. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_udp_api.py +0 -0
  387. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_voice_frames.py +0 -0
  388. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_wire.py +0 -0
  389. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tests/unit/test_world_session.py +0 -0
  390. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tools/e2e/provision.py +0 -0
  391. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tools/fixtures/player_host.mjs +0 -0
  392. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tools/parity/classifications.toml +0 -0
  393. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/tools/parity/parity.py +0 -0
  394. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/LICENSE +0 -0
  395. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/cmake/CheckPublicHeaders.cmake +0 -0
  396. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/cmake/CrowdyCPPConfig.cmake.in +0 -0
  397. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/cmake/CrowdyFindOpus.cmake +0 -0
  398. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/cmake/studio_layout_fixture.hpp.in +0 -0
  399. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/client.hpp +0 -0
  400. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/core/base64.hpp +0 -0
  401. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/core/bytes.hpp +0 -0
  402. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/core/clock.hpp +0 -0
  403. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/core/crypto.hpp +0 -0
  404. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/core/logger.hpp +0 -0
  405. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/core/result.hpp +0 -0
  406. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/core/spsc.hpp +0 -0
  407. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/core/uuid.hpp +0 -0
  408. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/crowdy.hpp +0 -0
  409. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/default_origin.hpp +0 -0
  410. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/admin.hpp +0 -0
  411. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/auth.hpp +0 -0
  412. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio.hpp +0 -0
  413. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_agent.hpp +0 -0
  414. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_github.hpp +0 -0
  415. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/discovery.hpp +0 -0
  416. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/domain_base.hpp +0 -0
  417. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/game_apps.hpp +0 -0
  418. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/grids.hpp +0 -0
  419. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/groups.hpp +0 -0
  420. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/marketplace.hpp +0 -0
  421. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/player_wallet.hpp +0 -0
  422. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/portal.hpp +0 -0
  423. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/realtime_control.hpp +0 -0
  424. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/server_status.hpp +0 -0
  425. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/types.hpp +0 -0
  426. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/users.hpp +0 -0
  427. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/domains/world_data.hpp +0 -0
  428. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/async_scope.hpp +0 -0
  429. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/auth_state.hpp +0 -0
  430. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/datacenter_redirect.hpp +0 -0
  431. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/dispatcher.hpp +0 -0
  432. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/errors.hpp +0 -0
  433. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/estate.hpp +0 -0
  434. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/graphql_client.hpp +0 -0
  435. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/http.hpp +0 -0
  436. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/json.hpp +0 -0
  437. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/rediscover.hpp +0 -0
  438. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/subscription_client.hpp +0 -0
  439. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/websocket.hpp +0 -0
  440. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/kit/actions.hpp +0 -0
  441. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +0 -0
  442. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/kit/social.hpp +0 -0
  443. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/kit/wire.hpp +0 -0
  444. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/media/opus.hpp +0 -0
  445. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/media/video_frames.hpp +0 -0
  446. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/media/voice_frames.hpp +0 -0
  447. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/adapter.hpp +0 -0
  448. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/player_host.hpp +0 -0
  449. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/schemas.hpp +0 -0
  450. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/types.hpp +0 -0
  451. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/replication/connection.hpp +0 -0
  452. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/replication/session_provider.hpp +0 -0
  453. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/replication/types.hpp +0 -0
  454. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/replication/udp_socket.hpp +0 -0
  455. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/session/chunk_store.hpp +0 -0
  456. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/session/codec.hpp +0 -0
  457. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/session/durable.hpp +0 -0
  458. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/session/keys.hpp +0 -0
  459. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/session/stores.hpp +0 -0
  460. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/session/world_session.hpp +0 -0
  461. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/controller.hpp +0 -0
  462. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/diagnostics.hpp +0 -0
  463. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/editor.hpp +0 -0
  464. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github.hpp +0 -0
  465. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github_layout.hpp +0 -0
  466. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/integration.hpp +0 -0
  467. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/layout.hpp +0 -0
  468. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/models.hpp +0 -0
  469. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/studio/runtime.hpp +0 -0
  470. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/wire/codec.hpp +0 -0
  471. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/wire/protocol.hpp +0 -0
  472. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/include/crowdy/world.hpp +0 -0
  473. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/client.cpp +0 -0
  474. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/core/base64.cpp +0 -0
  475. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/core/clock.cpp +0 -0
  476. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/core/crypto_default_unavailable.cpp +0 -0
  477. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/core/crypto_openssl.cpp +0 -0
  478. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/core/crypto_unavailable.cpp +0 -0
  479. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/core/logger.cpp +0 -0
  480. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/core/uuid.cpp +0 -0
  481. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/domains/exec.cpp +0 -0
  482. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/async_transport.cpp +0 -0
  483. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/auth_state.cpp +0 -0
  484. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/error_extensions.hpp +0 -0
  485. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/errors.cpp +0 -0
  486. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/graphql_client.cpp +0 -0
  487. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/http_curl.cpp +0 -0
  488. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/http_none.cpp +0 -0
  489. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/json.cpp +0 -0
  490. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/subscription_client.cpp +0 -0
  491. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/websocket_curl.cpp +0 -0
  492. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/graphql/websocket_none.cpp +0 -0
  493. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/media/opus.cpp +0 -0
  494. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/player_host/schemas.cpp +0 -0
  495. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/player_host/types.cpp +0 -0
  496. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/replication/connection.cpp +0 -0
  497. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/replication/socket_errors.hpp +0 -0
  498. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/replication/udp_socket.cpp +0 -0
  499. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/session/world_session.cpp +0 -0
  500. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/studio/diagnostics.cpp +0 -0
  501. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/studio/editor.cpp +0 -0
  502. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/src/studio/integration.cpp +0 -0
  503. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/third_party/yyjson/LICENSE +0 -0
  504. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.c +0 -0
  505. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.h +0 -0
  506. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-client-frames.json +0 -0
  507. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-gateway-cases.json +0 -0
  508. {crowdypy-0.8.0.dev1 → crowdypy-0.9.1.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/voice-frames.json +0 -0
@@ -3,6 +3,29 @@
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.9.1
7
+
8
+ A patch release with the same API as 0.9.0, the same CrowdyJS (18.8.0) and CrowdyCPP (0.61.0) pins.
9
+
10
+ - **`client.input_log` sends a session filter's `userId` as a string**, the decimal string every
11
+ id is on the wire. An `int` used to go out as a JSON number.
12
+ - **Its docstrings say when a read is retryable.** From the Game API release after v2.40.2,
13
+ `InputLogAPI.messages` answers `INPUT_LOG_TEMPORARILY_UNAVAILABLE` when the log cannot be read
14
+ right now and `INPUT_LOG_RATE_LIMITED` while another read of yours is running; both carry
15
+ `extensions.retryable`, so retry with the same cursor after a short back-off.
16
+
17
+ ## 0.9.0
18
+
19
+ CrowdyJS 18.8.0 and CrowdyCPP 0.61.0. Additive, with one floor: the build documents select
20
+ `ExecBuild.sdkVersion`, so `exec.build`, `build_status`, `wait_for_build`, `mod_build`,
21
+ `mod_client_build`, `mod_build_status` and `wait_for_mod_build` need ck-api v2.40.2 (an older
22
+ one refuses the selection).
23
+
24
+ - **`ExecBuild.sdk_version`**: the version of `ckx-sdk` the platform compiled the build against
25
+ (`crowdy-client-sdk` for a CLIENT half), from the toolchain of the API instance that ran it. The
26
+ platform points a crate at its own copy of the SDK whatever version the crate names, so this,
27
+ not your manifest, says what your code was checked against. `None` until the build starts.
28
+
6
29
  ## 0.8.0
7
30
 
8
31
  CrowdyJS 18.7.0 and CrowdyCPP 0.60.0. Additive, with reads that change for values they used to
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crowdypy
3
- Version: 0.8.0.dev1
3
+ Version: 0.9.1.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,9 @@ 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.9.1: the input log's session filter sends `userId` as a string, and its reads document when
55
+ to retry.** See the 0.9.1 bullet below; 0.9.0 added the SDK a build compiled against.
56
+
54
57
  **v0.8.0: voice, channel audio, wide voxels, and pause and access refusals (CrowdyJS 18.7.0, CrowdyCPP 0.60.0).**
55
58
  - Voice: `crowdypy.media`'s voice helpers (an optional 10-byte header per codec frame,
56
59
  `VoicePacketizer`, `VoiceJitterBuffer`), and `client.udp.send_channel_audio()` with the
@@ -63,6 +66,9 @@ wheel. Python never touches a datagram.
63
66
  carry, and `app_paused_of`, `access_refusal_of` and `actor_exists_of` read the new refusals.
64
67
  - New calls: `users.player_profile(s)`, `app_access.suspend` and `unsuspend`, and
65
68
  `exec.restart_type`.
69
+ - 0.9.0: every build (`exec.build`, `build_status`, `wait_for_build` and the mod builds) carries
70
+ `sdk_version`, the `ckx-sdk` (CLIENT half: `crowdy-client-sdk`) version the platform compiled it
71
+ against, whatever the crate names. It needs ck-api v2.40.2, since the build documents select it.
66
72
  - 0.8.0 needs the ck-api release after v2.39.0, since the token mutations select
67
73
  `runtimeGate`. Channel audio and the voxel echo need replication server v0.37.0.
68
74
  - 0.7.0 brought the input log (`client.input_log.sessions()` and `messages()`, and
@@ -11,6 +11,9 @@ 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.9.1: the input log's session filter sends `userId` as a string, and its reads document when
15
+ to retry.** See the 0.9.1 bullet below; 0.9.0 added the SDK a build compiled against.
16
+
14
17
  **v0.8.0: voice, channel audio, wide voxels, and pause and access refusals (CrowdyJS 18.7.0, CrowdyCPP 0.60.0).**
15
18
  - Voice: `crowdypy.media`'s voice helpers (an optional 10-byte header per codec frame,
16
19
  `VoicePacketizer`, `VoiceJitterBuffer`), and `client.udp.send_channel_audio()` with the
@@ -23,6 +26,9 @@ wheel. Python never touches a datagram.
23
26
  carry, and `app_paused_of`, `access_refusal_of` and `actor_exists_of` read the new refusals.
24
27
  - New calls: `users.player_profile(s)`, `app_access.suspend` and `unsuspend`, and
25
28
  `exec.restart_type`.
29
+ - 0.9.0: every build (`exec.build`, `build_status`, `wait_for_build` and the mod builds) carries
30
+ `sdk_version`, the `ckx-sdk` (CLIENT half: `crowdy-client-sdk`) version the platform compiled it
31
+ against, whatever the crate names. It needs ck-api v2.40.2, since the build documents select it.
26
32
  - 0.8.0 needs the ck-api release after v2.39.0, since the token mutations select
27
33
  `runtimeGate`. Channel audio and the voxel echo need replication server v0.37.0.
28
34
  - 0.7.0 brought the input log (`client.input_log.sessions()` and `messages()`, and
@@ -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.8.0`
8
+ - CrowdyPy `0.9.1`
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
@@ -41,6 +41,10 @@ requirement names one exactly, the same way a caret never matches an npm prerele
41
41
  - `auth.record_player_consents` and `auth.player_legal_acceptance` need ck-api v2.35.0; an
42
42
  older API answers them with a GraphQL validation error. From v2.35.0 a gameplay token
43
43
  waits for both consents (`LEGAL_ACCEPTANCE_REQUIRED`).
44
+ - The input log (`client.input_log`, 0.7.0) needs ck-api v2.39.0 or later: every app read selects
45
+ `replayLoggingEnabled`, which an older API refuses with a GraphQL validation error. The retryable
46
+ `INPUT_LOG_TEMPORARILY_UNAVAILABLE` / `INPUT_LOG_RATE_LIMITED` and the `logging_off` / `shutdown`
47
+ end reasons come with the ck-api release after v2.40.2.
44
48
  - `udp.send_ranged_channel_message` needs a replication server that serves message type 32
45
49
  (CHANNEL_MESSAGE_RANGED_REQUEST); one that does not delivers nothing.
46
50
  - 0.8.0 selects `runtimeGate` on every token mutation (`portal.mint_app_token`,
@@ -4,8 +4,8 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
4
4
 
5
5
  ## Target
6
6
 
7
- - CrowdyJS: `18.7.0` at `1ff76217bf396325f3c2774ca4d89644ab4ce352`
8
- - CrowdyCPP (native core): `0.60.0` at `995e34ffaab9ecf0ca6c17a59707cc0ed4a88086`
7
+ - CrowdyJS: `18.8.0` at `d7b755abe73bd9e157673325cbfcfb3975f71cc3`
8
+ - CrowdyCPP (native core): `0.61.0` at `72f4a154a8defde1f99d6dfd983cb6629c26d233`
9
9
  - schema.gql identical to CrowdyJS's: yes
10
10
  - Gate mode: strict portable parity (every portable gap is release-blocking)
11
11
 
@@ -152,6 +152,7 @@ fragment ExecBuildFields on ExecBuild {
152
152
  status
153
153
  kind
154
154
  log
155
+ sdkVersion
155
156
  createdAt
156
157
  startedAt
157
158
  finishedAt
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "crowdypy"
7
- version = "0.8.0.dev1"
7
+ version = "0.9.1.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,20 +119,20 @@ environment = { OPENSSL_ROOT_DIR = "C:/vcpkg/installed/x64-windows-static-md" }
119
119
  # --------------------------------------------------------------------------------------
120
120
 
121
121
  [tool.crowdypy.crowdyjs]
122
- version = "18.7.0"
123
- commit = "1ff76217bf396325f3c2774ca4d89644ab4ce352"
122
+ version = "18.8.0"
123
+ commit = "d7b755abe73bd9e157673325cbfcfb3975f71cc3"
124
124
 
125
125
  [tool.crowdypy.crowdycpp]
126
- version = "0.60.0"
127
- tag = "dev/v0.60.0"
128
- commit = "995e34ffaab9ecf0ca6c17a59707cc0ed4a88086"
129
- tree-sha256 = "cee4e9d4db822b6f6ae06d5fd257ba354ee94d3100a345dd5048d37c14ea7cc9"
126
+ version = "0.61.0"
127
+ tag = "dev/v0.61.0"
128
+ commit = "72f4a154a8defde1f99d6dfd983cb6629c26d233"
129
+ tree-sha256 = "559bbbcc37455ae020abdf7e128cb84e05bead6e8f52b4f4a8e4293a6f1f0a18"
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.
133
133
  [tool.crowdypy.graphql]
134
- schema-sha256 = "d2e735887acea223a7ce95e009cb17a894a3954012b939ce05e5ccf5693dedcd"
135
- operations-sha256 = "15ab08f0f194e6355b3dcb28eb7d3a0a4ac9f064af457b054a60e4b403e6519e"
134
+ schema-sha256 = "61f99f99fc80be9de388e7295faa247fe508cc0d2f7d2b832a2709ed76c464b2"
135
+ operations-sha256 = "e9e0ad2ac5f585815d3f3b2b2f3b4443736f9ae602905fbe82b236b7cc4bfd66"
136
136
 
137
137
  # The SDL the docs site publishes. scripts/schema_drift.py compares the snapshot against it
138
138
  # on a schedule; nothing on the per-commit path reads the network.
@@ -5936,9 +5936,13 @@ type ExecBuild {
5936
5936
  """
5937
5937
  kind: String!
5938
5938
  """
5939
- The compiler’s output once the build finishes, at most 64 KB (the end is kept).
5939
+ The compiler’s output once the build finishes, at most 64 KB (the end is kept). Its first line names the toolchain the build ran with.
5940
5940
  """
5941
5941
  log: String
5942
+ """
5943
+ The SDK version the build compiled against, from the toolchain of the API instance that ran it: `ckx-sdk` for a ck-exec build, `crowdy-client-sdk` for a CLIENT half. A crate’s own version requirement for the SDK is not what decides this. Null until the build starts, and for builds from before it was recorded.
5944
+ """
5945
+ sdkVersion: String
5942
5946
  """When the build was requested."""
5943
5947
  createdAt: DateTime!
5944
5948
  """When it started compiling."""
@@ -41,7 +41,6 @@ DENYLIST = (
41
41
  "dev-run-buddy",
42
42
  )
43
43
  SKIP_DIRS = {
44
- ".git": "object store; holds every historical revision by construction",
45
44
  ".venv": "the developer's virtualenv; third-party code",
46
45
  "build": "CMake build trees, regenerated per build",
47
46
  "node_modules": "third-party dependencies",
@@ -76,6 +75,11 @@ def tree() -> Iterator[tuple[str, bytes]]:
76
75
  current = stack.pop()
77
76
  for entry in sorted(current.iterdir()):
78
77
  rel = entry.relative_to(ROOT).as_posix()
78
+ if entry.name == ".git":
79
+ # A clone's object store, which holds every historical revision by
80
+ # construction, or a worktree's pointer file, which names the checkout's own
81
+ # path. Neither is ever packaged.
82
+ continue
79
83
  if entry.is_dir():
80
84
  if entry.name not in SKIP_DIRS:
81
85
  stack.append(entry)
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- """Both pins name commits promoted to THIS branch's tier of their repositories.
2
+ """Both pins name published releases, promoted to THIS branch's tier of their repositories.
3
3
 
4
4
  python scripts/ci/check_pin_tiers.py --crowdyjs <checkout> --crowdycpp <checkout> --tier dev
5
5
  python scripts/ci/check_pin_tiers.py --crowdyjs <checkout> --crowdycpp <checkout> --from-ref
@@ -10,6 +10,11 @@ CrowdyPy's ``dev`` may pin only CrowdyJS and CrowdyCPP commits reachable from th
10
10
  branch head: a promotion merges forward, so one commit satisfies every tier once it has
11
11
  travelled the ladder, and pinning a head would make an unrelated landing turn this red.
12
12
  The checkouts need full history (``fetch-depth: 0``).
13
+
14
+ And released: each pinned commit must be the target of a ``<tier>/v<version>`` tag of its
15
+ repository for the pinned version (any tier's, for the same ladder reason). Reachability
16
+ alone let 0.7.0 pin CrowdyJS ``ca9fbb5`` as 18.6.0 while ``dev/v18.6.0`` is ``7662d0b0``.
17
+ That half needs no tier, so it runs on every ref.
13
18
  """
14
19
 
15
20
  from __future__ import annotations
@@ -43,6 +48,55 @@ def _from_ref() -> str | None:
43
48
  return _tier_of(branch) if branch and branch != "HEAD" else None
44
49
 
45
50
 
51
+ def parse_tag_refs(text: str) -> dict[str, str]:
52
+ """``git ls-remote --tags`` output: tag name -> the commit it points at (an annotated tag's
53
+ peeled ``^{}`` line wins over the tag object's own sha)."""
54
+ out: dict[str, str] = {}
55
+ for line in text.splitlines():
56
+ parts = line.strip().split()
57
+ if len(parts) != 2 or len(parts[0]) != 40 or not parts[1].startswith("refs/tags/"):
58
+ continue
59
+ sha, ref = parts
60
+ name = ref.removeprefix("refs/tags/")
61
+ if name.endswith("^{}"):
62
+ out[name.removesuffix("^{}")] = sha
63
+ else:
64
+ out.setdefault(name, sha)
65
+ return out
66
+
67
+
68
+ def tag_verdict(commit: str, version: str, tags: dict[str, str]) -> tuple[bool, str]:
69
+ """Whether ``commit`` is a published ``version``: the target of a ``<tier>/v<version>`` tag."""
70
+ named = [f"{tier}/v{version}" for tier in TIERS]
71
+ matching = [name for name in named if tags.get(name) == commit]
72
+ if matching:
73
+ return True, f"{commit[:12]} is {', '.join(matching)}"
74
+ elsewhere = [f"{name} is {tags[name][:12]}" for name in named if name in tags]
75
+ if elsewhere:
76
+ return False, f"{commit[:12]} is not a published {version}: {', '.join(elsewhere)}"
77
+ return False, f"{commit[:12]} is not a published {version}: no {' / '.join(named)} tag exists"
78
+
79
+
80
+ def tagged(repo: Path, commit: str, version: str) -> tuple[bool, str]:
81
+ listed = subprocess.run(
82
+ [
83
+ "git",
84
+ "-C",
85
+ str(repo),
86
+ "ls-remote",
87
+ "--tags",
88
+ "origin",
89
+ *[f"refs/tags/{tier}/v{version}*" for tier in TIERS],
90
+ ],
91
+ capture_output=True,
92
+ text=True,
93
+ check=False,
94
+ )
95
+ if listed.returncode != 0:
96
+ return False, f"cannot list the tags of {repo}: {listed.stderr.strip()[:200]}"
97
+ return tag_verdict(commit, version, parse_tag_refs(listed.stdout))
98
+
99
+
46
100
  def reachable(repo: Path, commit: str, tier: str) -> tuple[bool, str]:
47
101
  fetched = subprocess.run(
48
102
  [
@@ -93,23 +147,38 @@ def main(argv: list[str] | None = None) -> int:
93
147
  group.add_argument("--from-ref", action="store_true")
94
148
  args = parser.parse_args(argv)
95
149
  tier = args.tier or _from_ref()
96
- if tier is None:
97
- print(
98
- "check_pin_tiers: this ref carries no tier, so the comparison was SKIPPED (a PR into dev/test/prod is judged by that base)"
99
- )
100
- return 0
101
150
  pins = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))["tool"]["crowdypy"]
102
151
  failed = False
152
+ unreleased = False
103
153
  for name, repo, pin in (
104
154
  ("CrowdyJS", args.crowdyjs, pins["crowdyjs"]),
105
155
  ("CrowdyCPP", args.crowdycpp, pins["crowdycpp"]),
106
156
  ):
157
+ ok, detail = tagged(repo, pin["commit"], pin["version"])
158
+ unreleased |= not ok
159
+ print(
160
+ f"check_pin_tiers: {name} {pin['version']}: {detail}",
161
+ file=sys.stdout if ok else sys.stderr,
162
+ )
163
+ if tier is None:
164
+ continue
107
165
  ok, detail = reachable(repo, pin["commit"], tier)
108
166
  failed |= not ok
109
167
  print(
110
168
  f"check_pin_tiers: {name} {pin['version']}: {detail}",
111
169
  file=sys.stdout if ok else sys.stderr,
112
170
  )
171
+ if unreleased:
172
+ print(
173
+ "check_pin_tiers: pin the commit a release tag points at (CrowdyJS's, then CrowdyCPP's).",
174
+ file=sys.stderr,
175
+ )
176
+ return 1
177
+ if tier is None:
178
+ print(
179
+ "check_pin_tiers: this ref carries no tier, so the reachability comparison was SKIPPED (a PR into dev/test/prod is judged by that base)"
180
+ )
181
+ return 0
113
182
  if failed:
114
183
  print(
115
184
  f"check_pin_tiers: a CrowdyPy {tier} branch may pin only commits promoted to {tier}. "
@@ -1,6 +1,6 @@
1
1
  """GENERATED by scripts/codegen.py from schema.gql. Do not edit.
2
2
 
3
- schema.gql sha256: d2e735887acea223a7ce95e009cb17a894a3954012b939ce05e5ccf5693dedcd
3
+ schema.gql sha256: 61f99f99fc80be9de388e7295faa247fe508cc0d2f7d2b832a2709ed76c464b2
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: d2e735887acea223a7ce95e009cb17a894a3954012b939ce05e5ccf5693dedcd
7
+ schema.gql sha256: 61f99f99fc80be9de388e7295faa247fe508cc0d2f7d2b832a2709ed76c464b2
8
8
  """
9
9
 
10
10
  from __future__ import annotations
@@ -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: d2e735887acea223a7ce95e009cb17a894a3954012b939ce05e5ccf5693dedcd
4
- operations/ sha256: 15ab08f0f194e6355b3dcb28eb7d3a0a4ac9f064af457b054a60e4b403e6519e
3
+ schema.gql sha256: 61f99f99fc80be9de388e7295faa247fe508cc0d2f7d2b832a2709ed76c464b2
4
+ operations/ sha256: e9e0ad2ac5f585815d3f3b2b2f3b4443736f9ae602905fbe82b236b7cc4bfd66
5
5
  """
6
6
 
7
7
  from crowdypy._operation import Operation
@@ -692,7 +692,7 @@ EXEC_BUILD = Operation(
692
692
  name='ExecBuild',
693
693
  kind='mutation',
694
694
  root_fields=('execBuild',),
695
- document='mutation ExecBuild($input: ExecBuildInput!) {\n execBuild(input: $input) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
695
+ document='mutation ExecBuild($input: ExecBuildInput!) {\n execBuild(input: $input) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n sdkVersion\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
696
696
  )
697
697
 
698
698
  # exec/Exec.graphql
@@ -700,7 +700,7 @@ EXEC_BUILD_STATUS = Operation(
700
700
  name='ExecBuildStatus',
701
701
  kind='query',
702
702
  root_fields=('execBuildStatus',),
703
- document='query ExecBuildStatus($appId: BigInt!, $buildId: String!) {\n execBuildStatus(appId: $appId, buildId: $buildId) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
703
+ document='query ExecBuildStatus($appId: BigInt!, $buildId: String!) {\n execBuildStatus(appId: $appId, buildId: $buildId) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n sdkVersion\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
704
704
  )
705
705
 
706
706
  # exec/Exec.graphql
@@ -772,7 +772,7 @@ EXEC_MOD_BUILD = Operation(
772
772
  name='ExecModBuild',
773
773
  kind='mutation',
774
774
  root_fields=('execModBuild',),
775
- document='mutation ExecModBuild($appId: BigInt!, $crate: ExecBuildCrateInput!) {\n execModBuild(appId: $appId, crate: $crate) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
775
+ document='mutation ExecModBuild($appId: BigInt!, $crate: ExecBuildCrateInput!) {\n execModBuild(appId: $appId, crate: $crate) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n sdkVersion\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
776
776
  )
777
777
 
778
778
  # exec/Exec.graphql
@@ -780,7 +780,7 @@ EXEC_MOD_BUILD_STATUS = Operation(
780
780
  name='ExecModBuildStatus',
781
781
  kind='query',
782
782
  root_fields=('execModBuildStatus',),
783
- document='query ExecModBuildStatus($appId: BigInt!, $buildId: String!) {\n execModBuildStatus(appId: $appId, buildId: $buildId) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
783
+ document='query ExecModBuildStatus($appId: BigInt!, $buildId: String!) {\n execModBuildStatus(appId: $appId, buildId: $buildId) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n sdkVersion\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
784
784
  )
785
785
 
786
786
  # exec/Exec.graphql
@@ -796,7 +796,7 @@ EXEC_MOD_CLIENT_BUILD = Operation(
796
796
  name='ExecModClientBuild',
797
797
  kind='mutation',
798
798
  root_fields=('execModClientBuild',),
799
- document='mutation ExecModClientBuild($appId: BigInt!, $crate: ExecBuildCrateInput!) {\n execModClientBuild(appId: $appId, crate: $crate) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
799
+ document='mutation ExecModClientBuild($appId: BigInt!, $crate: ExecBuildCrateInput!) {\n execModClientBuild(appId: $appId, crate: $crate) {\n ...ExecBuildFields\n }\n}\n\nfragment ExecBuildFields on ExecBuild {\n buildId\n status\n kind\n log\n sdkVersion\n createdAt\n startedAt\n finishedAt\n artifacts {\n crate\n digest\n sizeBytes\n capabilitySummaryJson\n capabilityHash\n tickIntervalMs\n }\n}',
800
800
  )
801
801
 
802
802
  # exec/Exec.graphql
@@ -0,0 +1,113 @@
1
+ # GENERATED by scripts/unasync.py from src/crowdypy/domains/input_log.py. Do not edit.
2
+ """The input log (``client.input_log``): recorded client inputs of an app with replay logging on.
3
+
4
+ An app with replay logging on (``App.replayLoggingEnabled``, set with ``client.apps.update``)
5
+ has every client input the realtime servers accept recorded. These calls read them back on
6
+ the app-scoped client for the app; an identity session token is refused. A player reads only
7
+ the sessions and inputs they sent; a holder of ``manage_apps`` on the app reads every session.
8
+ Inputs are kept for the input log's published retention (up to about an hour longer), so an old
9
+ session can still be listed after its inputs are gone. Both answer ``INPUT_LOG_UNAVAILABLE`` on a
10
+ deployment without input logging. From the Game API release after v2.40.2,
11
+ :meth:`InputLogAPI.messages` answers ``INPUT_LOG_TEMPORARILY_UNAVAILABLE`` when the log cannot be
12
+ read right now and ``INPUT_LOG_RATE_LIMITED`` while another read of yours is running (one per user,
13
+ two per app): both carry ``extensions.retryable``, so retry with the same cursor after a short
14
+ back-off. Earlier Game APIs answer ``INPUT_LOG_UNAVAILABLE``, or an empty page, instead.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from collections.abc import Mapping
20
+ from typing import Any
21
+
22
+ import msgspec
23
+
24
+ from crowdypy._generated import inputs
25
+ from crowdypy._generated import operations as ops
26
+ from crowdypy._sync.domains._base import Domain, omit_none
27
+ from crowdypy.utils import bigint
28
+
29
+ __all__ = ["InputLogAPI"]
30
+
31
+
32
+ def _session_filter(
33
+ filter: inputs.InputLogSessionFilter | Mapping[str, Any] | None,
34
+ ) -> inputs.InputLogSessionFilter | Mapping[str, Any] | None:
35
+ """``userId`` as the decimal string every id is on the wire: an int went out as a JSON
36
+ number, safe at today's ids and unlike every other id the SDK sends."""
37
+ if isinstance(filter, inputs.InputLogSessionFilter):
38
+ # Typed str, so an int here is a caller past the type hints: exactly the case to mend.
39
+ user_id: Any = filter.user_id
40
+ if isinstance(user_id, int) and not isinstance(user_id, bool):
41
+ return msgspec.structs.replace(filter, user_id=bigint(user_id))
42
+ return filter
43
+ if isinstance(filter, Mapping) and isinstance(filter.get("userId"), int):
44
+ return {**filter, "userId": bigint(filter["userId"])}
45
+ return filter
46
+
47
+
48
+ class InputLogAPI(Domain):
49
+ def sessions(
50
+ self,
51
+ app_id: str | int,
52
+ *,
53
+ first: int | None = None,
54
+ after: str | None = None,
55
+ filter: inputs.InputLogSessionFilter | Mapping[str, Any] | None = None,
56
+ ) -> dict[str, Any]:
57
+ """An app's recorded sessions, newest first: ``edges { cursor node }``, ``pageInfo``,
58
+ ``totalCount``. A session is one game token's inputs.
59
+
60
+ ``filter`` takes ``userId`` (another user's needs ``manage_apps``, else ``FORBIDDEN``;
61
+ an int is sent as its decimal string), ``from`` / ``to`` and ``messageType``. Page with
62
+ ``first`` (default 50, max 200) and the previous page's ``pageInfo.endCursor`` as
63
+ ``after``. A node's ``endReason`` is ``expired``, ``revoked``, ``reconnect`` or
64
+ ``released`` as the client saw it, ``logging_off`` or ``shutdown`` from the Game API
65
+ release after v2.40.2, ``unrecorded``, or null while the session may still run.
66
+ """
67
+ result: dict[str, Any] = self._request(
68
+ ops.INPUT_LOG_SESSIONS,
69
+ omit_none(
70
+ {
71
+ "appId": bigint(app_id),
72
+ "first": first,
73
+ "after": after,
74
+ "filter": _session_filter(filter),
75
+ }
76
+ ),
77
+ )
78
+ return result
79
+
80
+ def messages(
81
+ self,
82
+ app_id: str | int,
83
+ game_token_id: str | int,
84
+ *,
85
+ first: int | None = None,
86
+ after: str | None = None,
87
+ filter: inputs.InputLogMessageFilter | Mapping[str, Any] | None = None,
88
+ ) -> dict[str, Any]:
89
+ """One session's recorded inputs (``game_token_id`` from :meth:`sessions`), oldest first.
90
+
91
+ ``body`` is the client message in base64 (``decode_base64`` gives the bytes), from its
92
+ type byte up to its authentication tail, which is not recorded; ``sizeBytes`` is what
93
+ stored input logs are billed on. Spatial inputs carry their chunk and actor, channel
94
+ inputs their channel. **Keep paging while ``pageInfo.hasNextPage`` is true**, not while
95
+ ``endCursor`` is set: a page can be short, or empty, when it reached the server's time or
96
+ scan limit; keep the previous cursor if one comes back null. ``filter`` takes ``from`` /
97
+ ``to`` and ``messageTypes`` (at most 64). Another user's session answers ``NOT_FOUND``
98
+ without ``manage_apps``; a malformed cursor, or (from the Game API release after v2.40.2)
99
+ one from another session, ``BAD_USER_INPUT``.
100
+ """
101
+ result: dict[str, Any] = self._request(
102
+ ops.INPUT_LOG_MESSAGES,
103
+ omit_none(
104
+ {
105
+ "appId": bigint(app_id),
106
+ "gameTokenId": bigint(game_token_id),
107
+ "first": first,
108
+ "after": after,
109
+ "filter": filter,
110
+ }
111
+ ),
112
+ )
113
+ return result
@@ -1,3 +1,3 @@
1
1
  """The CrowdyPy release this source tree builds."""
2
2
 
3
- __version__ = "0.8.0"
3
+ __version__ = "0.9.1"
@@ -337,13 +337,16 @@ class ExecBuild(msgspec.Struct, rename="camel", frozen=True, kw_only=True):
337
337
  """A build, its log and one module per crate.
338
338
 
339
339
  ``status`` is ``queued``, ``building``, ``succeeded`` or ``failed``; ``kind`` is ``exec``
340
- for ck-exec modules and ``client`` for the CLIENT half of a mod.
340
+ for ck-exec modules and ``client`` for the CLIENT half of a mod. ``sdk_version`` is the
341
+ ``ckx-sdk`` version the platform compiled against (``crowdy-client-sdk``'s for a CLIENT
342
+ half), whatever version the crate names; ``None`` until the build starts (ck-api v2.40.2).
341
343
  """
342
344
 
343
345
  build_id: str
344
346
  status: str
345
347
  kind: str
346
348
  log: str | None = None
349
+ sdk_version: str | None = None
347
350
  created_at: str
348
351
  started_at: str | None = None
349
352
  finished_at: str | None = None
@@ -0,0 +1,112 @@
1
+ """The input log (``client.input_log``): recorded client inputs of an app with replay logging on.
2
+
3
+ An app with replay logging on (``App.replayLoggingEnabled``, set with ``client.apps.update``)
4
+ has every client input the realtime servers accept recorded. These calls read them back on
5
+ the app-scoped client for the app; an identity session token is refused. A player reads only
6
+ the sessions and inputs they sent; a holder of ``manage_apps`` on the app reads every session.
7
+ Inputs are kept for the input log's published retention (up to about an hour longer), so an old
8
+ session can still be listed after its inputs are gone. Both answer ``INPUT_LOG_UNAVAILABLE`` on a
9
+ deployment without input logging. From the Game API release after v2.40.2,
10
+ :meth:`InputLogAPI.messages` answers ``INPUT_LOG_TEMPORARILY_UNAVAILABLE`` when the log cannot be
11
+ read right now and ``INPUT_LOG_RATE_LIMITED`` while another read of yours is running (one per user,
12
+ two per app): both carry ``extensions.retryable``, so retry with the same cursor after a short
13
+ back-off. Earlier Game APIs answer ``INPUT_LOG_UNAVAILABLE``, or an empty page, instead.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ from collections.abc import Mapping
19
+ from typing import Any
20
+
21
+ import msgspec
22
+
23
+ from crowdypy._generated import inputs
24
+ from crowdypy._generated import operations as ops
25
+ from crowdypy.domains._base import Domain, omit_none
26
+ from crowdypy.utils import bigint
27
+
28
+ __all__ = ["InputLogAPI"]
29
+
30
+
31
+ def _session_filter(
32
+ filter: inputs.InputLogSessionFilter | Mapping[str, Any] | None,
33
+ ) -> inputs.InputLogSessionFilter | Mapping[str, Any] | None:
34
+ """``userId`` as the decimal string every id is on the wire: an int went out as a JSON
35
+ number, safe at today's ids and unlike every other id the SDK sends."""
36
+ if isinstance(filter, inputs.InputLogSessionFilter):
37
+ # Typed str, so an int here is a caller past the type hints: exactly the case to mend.
38
+ user_id: Any = filter.user_id
39
+ if isinstance(user_id, int) and not isinstance(user_id, bool):
40
+ return msgspec.structs.replace(filter, user_id=bigint(user_id))
41
+ return filter
42
+ if isinstance(filter, Mapping) and isinstance(filter.get("userId"), int):
43
+ return {**filter, "userId": bigint(filter["userId"])}
44
+ return filter
45
+
46
+
47
+ class InputLogAPI(Domain):
48
+ async def sessions(
49
+ self,
50
+ app_id: str | int,
51
+ *,
52
+ first: int | None = None,
53
+ after: str | None = None,
54
+ filter: inputs.InputLogSessionFilter | Mapping[str, Any] | None = None,
55
+ ) -> dict[str, Any]:
56
+ """An app's recorded sessions, newest first: ``edges { cursor node }``, ``pageInfo``,
57
+ ``totalCount``. A session is one game token's inputs.
58
+
59
+ ``filter`` takes ``userId`` (another user's needs ``manage_apps``, else ``FORBIDDEN``;
60
+ an int is sent as its decimal string), ``from`` / ``to`` and ``messageType``. Page with
61
+ ``first`` (default 50, max 200) and the previous page's ``pageInfo.endCursor`` as
62
+ ``after``. A node's ``endReason`` is ``expired``, ``revoked``, ``reconnect`` or
63
+ ``released`` as the client saw it, ``logging_off`` or ``shutdown`` from the Game API
64
+ release after v2.40.2, ``unrecorded``, or null while the session may still run.
65
+ """
66
+ result: dict[str, Any] = await self._request(
67
+ ops.INPUT_LOG_SESSIONS,
68
+ omit_none(
69
+ {
70
+ "appId": bigint(app_id),
71
+ "first": first,
72
+ "after": after,
73
+ "filter": _session_filter(filter),
74
+ }
75
+ ),
76
+ )
77
+ return result
78
+
79
+ async def messages(
80
+ self,
81
+ app_id: str | int,
82
+ game_token_id: str | int,
83
+ *,
84
+ first: int | None = None,
85
+ after: str | None = None,
86
+ filter: inputs.InputLogMessageFilter | Mapping[str, Any] | None = None,
87
+ ) -> dict[str, Any]:
88
+ """One session's recorded inputs (``game_token_id`` from :meth:`sessions`), oldest first.
89
+
90
+ ``body`` is the client message in base64 (``decode_base64`` gives the bytes), from its
91
+ type byte up to its authentication tail, which is not recorded; ``sizeBytes`` is what
92
+ stored input logs are billed on. Spatial inputs carry their chunk and actor, channel
93
+ inputs their channel. **Keep paging while ``pageInfo.hasNextPage`` is true**, not while
94
+ ``endCursor`` is set: a page can be short, or empty, when it reached the server's time or
95
+ scan limit; keep the previous cursor if one comes back null. ``filter`` takes ``from`` /
96
+ ``to`` and ``messageTypes`` (at most 64). Another user's session answers ``NOT_FOUND``
97
+ without ``manage_apps``; a malformed cursor, or (from the Game API release after v2.40.2)
98
+ one from another session, ``BAD_USER_INPUT``.
99
+ """
100
+ result: dict[str, Any] = await self._request(
101
+ ops.INPUT_LOG_MESSAGES,
102
+ omit_none(
103
+ {
104
+ "appId": bigint(app_id),
105
+ "gameTokenId": bigint(game_token_id),
106
+ "first": first,
107
+ "after": after,
108
+ "filter": filter,
109
+ }
110
+ ),
111
+ )
112
+ return result
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "crowdyJs": {
3
- "version": "18.7.0",
4
- "commit": "1ff76217bf396325f3c2774ca4d89644ab4ce352"
3
+ "version": "18.8.0",
4
+ "commit": "d7b755abe73bd9e157673325cbfcfb3975f71cc3"
5
5
  },
6
6
  "schemas": {
7
7
  "GAME_COMMAND_RESULT_SCHEMA_V1": {