crowdypy 0.9.0.dev1__tar.gz → 0.10.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 (511) hide show
  1. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/MIGRATION.md +37 -0
  2. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/PKG-INFO +10 -3
  3. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/README.md +9 -2
  4. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/docs/compatibility.md +5 -1
  5. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/docs/e2e-coverage.md +3 -1
  6. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/docs/parity-matrix.md +2 -2
  7. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/inputLog/InputLogSessions.graphql +1 -0
  8. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/pyproject.toml +9 -9
  9. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/schema.gql +52 -22
  10. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/check_content_policy.py +5 -1
  11. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/check_pin_tiers.py +75 -6
  12. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_generated/enums.py +1 -1
  13. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_generated/inputs.py +1 -1
  14. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_generated/operations.py +3 -3
  15. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/apps.py +3 -0
  16. crowdypy-0.10.0.dev1/src/crowdypy/_sync/domains/input_log.py +130 -0
  17. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_version.py +1 -1
  18. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/apps.py +3 -0
  19. crowdypy-0.10.0.dev1/src/crowdypy/domains/input_log.py +129 -0
  20. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/player_host/schemas.v1.json +2 -2
  21. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/conftest.py +13 -11
  22. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/test_e2e_identity.py +12 -2
  23. crowdypy-0.10.0.dev1/tests/e2e/test_e2e_input_log.py +62 -0
  24. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/fixtures/player-host.v1.json +2 -2
  25. crowdypy-0.10.0.dev1/tests/unit/domains/test_input_log_reads.py +97 -0
  26. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/domains/test_world_domains.py +19 -0
  27. crowdypy-0.10.0.dev1/tests/unit/test_check_pin_tiers.py +59 -0
  28. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/uv.lock +2 -2
  29. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/CMakeLists.txt +1 -1
  30. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/PROVENANCE.md +1 -1
  31. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/result.hpp +4 -0
  32. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/domain_base.hpp +17 -2
  33. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/world_data.hpp +92 -8
  34. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/generated/enums.hpp +2 -2
  35. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/generated/operations.hpp +4 -2
  36. crowdypy-0.10.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/cancel.hpp +38 -0
  37. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/errors.hpp +48 -0
  38. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/graphql_client.hpp +28 -5
  39. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/http.hpp +7 -0
  40. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/package.json +6 -6
  41. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/client.cpp +4 -0
  42. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/async_transport.cpp +3 -0
  43. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/error_extensions.hpp +2 -0
  44. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/graphql_client.cpp +75 -17
  45. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/http_curl.cpp +24 -0
  46. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/session/world_session.cpp +3 -0
  47. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdy-studio-diagnostics.v1.json +2 -2
  48. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdyjs-studio-layout.v1.json +2 -2
  49. crowdypy-0.9.0.dev1/src/crowdypy/_sync/domains/input_log.py +0 -80
  50. crowdypy-0.9.0.dev1/src/crowdypy/domains/input_log.py +0 -79
  51. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/.gitattributes +0 -0
  52. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/.gitignore +0 -0
  53. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/.gitleaks.toml +0 -0
  54. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/AGENTS.md +0 -0
  55. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/CMakeLists.txt +0 -0
  56. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/LICENSE +0 -0
  57. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/SECURITY.md +0 -0
  58. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/benchmarks/README.md +0 -0
  59. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/benchmarks/bench_replication.py +0 -0
  60. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/licenses/OpenSSL-LICENSE.txt +0 -0
  61. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/native/common.hpp +0 -0
  62. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/native/module.cpp +0 -0
  63. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/native/replication.hpp +0 -0
  64. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/native/replication_binding.cpp +0 -0
  65. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/native/session_binding.cpp +0 -0
  66. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/native/voice_binding.cpp +0 -0
  67. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/native/wire_binding.cpp +0 -0
  68. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/actors/Actor.graphql +0 -0
  69. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/actors/Actors.graphql +0 -0
  70. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/actors/BatchLookupActors.graphql +0 -0
  71. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/actors/CreateActor.graphql +0 -0
  72. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/actors/DeleteActor.graphql +0 -0
  73. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/actors/UpdateActor.graphql +0 -0
  74. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/actors/UpdateActorState.graphql +0 -0
  75. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/AppAccessTiers.graphql +0 -0
  76. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/AppFeatures.graphql +0 -0
  77. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/AppGrantMemberCandidates.graphql +0 -0
  78. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/AppUserAccessByApp.graphql +0 -0
  79. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/ArchiveAccessTier.graphql +0 -0
  80. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/ClaimFreeAppAccess.graphql +0 -0
  81. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/CreateAccessTier.graphql +0 -0
  82. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/DefineAppFeature.graphql +0 -0
  83. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/GrantAppAccess.graphql +0 -0
  84. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/GrantMyAppAccess.graphql +0 -0
  85. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/GrantTierFeature.graphql +0 -0
  86. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/MyAppAccess.graphql +0 -0
  87. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/RevokeAppAccess.graphql +0 -0
  88. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/RevokeTierFeature.graphql +0 -0
  89. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/RuntimePermissions.graphql +0 -0
  90. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/SuspendAppAccess.graphql +0 -0
  91. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/TierFeatures.graphql +0 -0
  92. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/appAccess/UpdateAccessTier.graphql +0 -0
  93. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/App.graphql +0 -0
  94. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/AppBySlug.graphql +0 -0
  95. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/AppDiscovery.graphql +0 -0
  96. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/AppsForOrg.graphql +0 -0
  97. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/ArchiveApp.graphql +0 -0
  98. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/CodeAdmissions.graphql +0 -0
  99. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/CreateApp.graphql +0 -0
  100. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/MarketplaceApps.graphql +0 -0
  101. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/MyApps.graphql +0 -0
  102. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/PlaceableDatacenters.graphql +0 -0
  103. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/apps/UpdateApp.graphql +0 -0
  104. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/auth/Logout.graphql +0 -0
  105. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/auth/LogoutAllDevices.graphql +0 -0
  106. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/avatars/Avatars.graphql +0 -0
  107. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/billing/AppBudget.graphql +0 -0
  108. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/billing/AppBudgets.graphql +0 -0
  109. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/billing/SetAppBudget.graphql +0 -0
  110. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/billing/WalletBalance.graphql +0 -0
  111. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/billing/WalletTransactions.graphql +0 -0
  112. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/AddChannelMember.graphql +0 -0
  113. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/Channel.graphql +0 -0
  114. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/ChannelMembers.graphql +0 -0
  115. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/ChannelPolicy.graphql +0 -0
  116. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/ChannelRoles.graphql +0 -0
  117. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/Channels.graphql +0 -0
  118. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/CreateChannel.graphql +0 -0
  119. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/CreateChannelRole.graphql +0 -0
  120. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/DeleteChannel.graphql +0 -0
  121. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/DeleteChannelRole.graphql +0 -0
  122. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/JoinChannel.graphql +0 -0
  123. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/LeaveChannel.graphql +0 -0
  124. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/MyChannels.graphql +0 -0
  125. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/RemoveChannelMember.graphql +0 -0
  126. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/RequestToJoinChannel.graphql +0 -0
  127. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/SetChannelMemberRoles.graphql +0 -0
  128. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/SetChannelPolicy.graphql +0 -0
  129. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/UpdateChannel.graphql +0 -0
  130. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/channels/UpdateChannelRole.graphql +0 -0
  131. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/chunks/GetChunk.graphql +0 -0
  132. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/chunks/GetChunkLods.graphql +0 -0
  133. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/chunks/GetChunksByDistance.graphql +0 -0
  134. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/chunks/GetVoxelList.graphql +0 -0
  135. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/chunks/UpdateChunk.graphql +0 -0
  136. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/chunks/UpdateChunkLods.graphql +0 -0
  137. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/chunks/UpdateChunkState.graphql +0 -0
  138. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/crowdyStudio/CrowdyStudio.graphql +0 -0
  139. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/exec/Exec.graphql +0 -0
  140. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/gameApps/GameApps.graphql +0 -0
  141. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/grids/CreateGridChannel.graphql +0 -0
  142. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/grids/GridChannels.graphql +0 -0
  143. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/grids/MintGridToken.graphql +0 -0
  144. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/host/Host.graphql +0 -0
  145. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/inputLog/InputLogMessages.graphql +0 -0
  146. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/marketplace/Marketplace.graphql +0 -0
  147. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/CreateOrgRole.graphql +0 -0
  148. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/CreateOrgToken.graphql +0 -0
  149. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/CreateOrganization.graphql +0 -0
  150. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/DeleteOrgRole.graphql +0 -0
  151. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/InviteOrgMember.graphql +0 -0
  152. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/MemberRoles.graphql +0 -0
  153. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/MyOrganizations.graphql +0 -0
  154. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/OrgMembers.graphql +0 -0
  155. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/OrgPermissions.graphql +0 -0
  156. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/OrgRoles.graphql +0 -0
  157. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/OrgTokens.graphql +0 -0
  158. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/Organization.graphql +0 -0
  159. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/OrganizationBySlug.graphql +0 -0
  160. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/RemoveOrgMember.graphql +0 -0
  161. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/RevokeOrgToken.graphql +0 -0
  162. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/UpdateOrgMemberRoles.graphql +0 -0
  163. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/UpdateOrgRole.graphql +0 -0
  164. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/organizations/UpdateOrgToken.graphql +0 -0
  165. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/payments/CapturePaypalCheckout.graphql +0 -0
  166. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/payments/CreateCheckout.graphql +0 -0
  167. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/payments/MyCheckouts.graphql +0 -0
  168. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/platform/PlatformConfig.graphql +0 -0
  169. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/playerWallet/PlayerWallet.graphql +0 -0
  170. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/quotas/DeleteQuota.graphql +0 -0
  171. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/quotas/EffectiveQuota.graphql +0 -0
  172. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/quotas/QuotasForApp.graphql +0 -0
  173. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/quotas/QuotasForOrg.graphql +0 -0
  174. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/quotas/SetQuota.graphql +0 -0
  175. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/serverStatus/ActiveGraphQLServers.graphql +0 -0
  176. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/serverStatus/GameClientBootstrap.graphql +0 -0
  177. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/serverStatus/GraphqlServers.graphql +0 -0
  178. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/serverStatus/ServerWithLeastClients.graphql +0 -0
  179. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/serverStatus/VersionInfo.graphql +0 -0
  180. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/sharedEnvironment/SharedEnvironment.graphql +0 -0
  181. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/state/DeleteUserAppState.graphql +0 -0
  182. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/state/UpdateUserAppState.graphql +0 -0
  183. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/state/UserAppState.graphql +0 -0
  184. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/state/UserAppStates.graphql +0 -0
  185. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/AddTeamMember.graphql +0 -0
  186. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/CreateTeam.graphql +0 -0
  187. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/CreateTeamRole.graphql +0 -0
  188. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/DeleteTeam.graphql +0 -0
  189. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/DeleteTeamRole.graphql +0 -0
  190. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/JoinTeam.graphql +0 -0
  191. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/LeaveTeam.graphql +0 -0
  192. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/MyTeams.graphql +0 -0
  193. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/RemoveTeamMember.graphql +0 -0
  194. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/RequestToJoinTeam.graphql +0 -0
  195. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/SetTeamMemberRoles.graphql +0 -0
  196. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/SetTeamPolicy.graphql +0 -0
  197. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/Team.graphql +0 -0
  198. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/TeamMembers.graphql +0 -0
  199. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/TeamPolicy.graphql +0 -0
  200. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/TeamRoles.graphql +0 -0
  201. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/Teams.graphql +0 -0
  202. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/UpdateTeam.graphql +0 -0
  203. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teams/UpdateTeamRole.graphql +0 -0
  204. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/teleport/TeleportRequest.graphql +0 -0
  205. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/usage/AppGraphqlOperations.graphql +0 -0
  206. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/usage/AppUsageSummary.graphql +0 -0
  207. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/usage/PlayerPulse.graphql +0 -0
  208. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/users/DeleteMyAccount.graphql +0 -0
  209. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/users/FreePlayWindow.graphql +0 -0
  210. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/users/Me.graphql +0 -0
  211. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/users/PlayerProfile.graphql +0 -0
  212. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/users/UpdateGamertag.graphql +0 -0
  213. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/users/UpdateUserState.graphql +0 -0
  214. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/users/User.graphql +0 -0
  215. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/voxels/ListVoxelUpdatesByDistance.graphql +0 -0
  216. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/voxels/ListVoxels.graphql +0 -0
  217. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/voxels/RollbackVoxelUpdates.graphql +0 -0
  218. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/voxels/UpdateVoxel.graphql +0 -0
  219. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/operations/voxels/VoxelUpdateHistory.graphql +0 -0
  220. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/_pins.py +0 -0
  221. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/assert_default_origin.py +0 -0
  222. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/build_openssl.sh +0 -0
  223. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/cibw_before_all_linux.sh +0 -0
  224. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/resolve-release-tier.sh +0 -0
  225. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/resolve-release-tier.test.sh +0 -0
  226. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/resolve_pypi_version.py +0 -0
  227. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/stamp_version.py +0 -0
  228. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/ci/verify_artifacts.py +0 -0
  229. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/codegen.py +0 -0
  230. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/schema_drift.py +0 -0
  231. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/schema_sync.py +0 -0
  232. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/unasync.py +0 -0
  233. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/scripts/vendor_crowdycpp.py +0 -0
  234. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/__init__.py +0 -0
  235. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_concurrency.py +0 -0
  236. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_default_origin.py +0 -0
  237. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_generated/__init__.py +0 -0
  238. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_grid.py +0 -0
  239. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_native.pyi +0 -0
  240. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_operation.py +0 -0
  241. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/__init__.py +0 -0
  242. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/client.py +0 -0
  243. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/__init__.py +0 -0
  244. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/_base.py +0 -0
  245. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/actors.py +0 -0
  246. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/admin.py +0 -0
  247. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/app_access.py +0 -0
  248. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/auth.py +0 -0
  249. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/avatars.py +0 -0
  250. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/billing.py +0 -0
  251. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/channels.py +0 -0
  252. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/chunks.py +0 -0
  253. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio.py +0 -0
  254. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio_agent.py +0 -0
  255. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio_github.py +0 -0
  256. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/discovery.py +0 -0
  257. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/exec.py +0 -0
  258. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/game_apps.py +0 -0
  259. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/grids.py +0 -0
  260. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/host.py +0 -0
  261. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/marketplace.py +0 -0
  262. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/organizations.py +0 -0
  263. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/payments.py +0 -0
  264. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/platform.py +0 -0
  265. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/player_wallet.py +0 -0
  266. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/portal.py +0 -0
  267. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/quotas.py +0 -0
  268. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/server_status.py +0 -0
  269. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/shared_environment.py +0 -0
  270. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/state.py +0 -0
  271. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/teams.py +0 -0
  272. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/teleport.py +0 -0
  273. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/udp.py +0 -0
  274. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/usage.py +0 -0
  275. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/users.py +0 -0
  276. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/domains/voxels.py +0 -0
  277. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/graphql.py +0 -0
  278. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/grid_scope.py +0 -0
  279. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/kit/__init__.py +0 -0
  280. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/kit/actions.py +0 -0
  281. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/kit/kit.py +0 -0
  282. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/kit/social.py +0 -0
  283. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/kit/wire.py +0 -0
  284. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/rediscover.py +0 -0
  285. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/stores.py +0 -0
  286. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/_sync/world.py +0 -0
  287. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/auth_state.py +0 -0
  288. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/client.py +0 -0
  289. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/codecs.py +0 -0
  290. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/datacenter_redirect.py +0 -0
  291. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/__init__.py +0 -0
  292. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/_base.py +0 -0
  293. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/actors.py +0 -0
  294. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/admin.py +0 -0
  295. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/app_access.py +0 -0
  296. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/auth.py +0 -0
  297. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/avatars.py +0 -0
  298. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/billing.py +0 -0
  299. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/channels.py +0 -0
  300. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/chunks.py +0 -0
  301. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/crowdy_studio.py +0 -0
  302. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/crowdy_studio_agent.py +0 -0
  303. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/crowdy_studio_github.py +0 -0
  304. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/discovery.py +0 -0
  305. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/exec.py +0 -0
  306. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/game_apps.py +0 -0
  307. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/grids.py +0 -0
  308. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/host.py +0 -0
  309. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/marketplace.py +0 -0
  310. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/organizations.py +0 -0
  311. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/payments.py +0 -0
  312. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/platform.py +0 -0
  313. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/player_wallet.py +0 -0
  314. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/portal.py +0 -0
  315. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/quotas.py +0 -0
  316. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/server_status.py +0 -0
  317. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/shared_environment.py +0 -0
  318. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/state.py +0 -0
  319. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/teams.py +0 -0
  320. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/teleport.py +0 -0
  321. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/udp.py +0 -0
  322. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/usage.py +0 -0
  323. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/users.py +0 -0
  324. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/domains/voxels.py +0 -0
  325. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/enums.py +0 -0
  326. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/errors.py +0 -0
  327. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/estate.py +0 -0
  328. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/exec_gateway.py +0 -0
  329. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/graphql.py +0 -0
  330. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/grid_scope.py +0 -0
  331. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/inputs.py +0 -0
  332. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/kit/__init__.py +0 -0
  333. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/kit/actions.py +0 -0
  334. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/kit/kit.py +0 -0
  335. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/kit/social.py +0 -0
  336. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/kit/wire.py +0 -0
  337. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/lb_cookie.py +0 -0
  338. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/media.py +0 -0
  339. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/pkce.py +0 -0
  340. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/player_host/__init__.py +0 -0
  341. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/player_host/agent_errors.py +0 -0
  342. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/player_host/agent_types.py +0 -0
  343. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/player_host/json_schema.py +0 -0
  344. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/player_host/schemas.py +0 -0
  345. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/player_host/types.py +0 -0
  346. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/py.typed +0 -0
  347. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/rediscover.py +0 -0
  348. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/replication.py +0 -0
  349. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/session.py +0 -0
  350. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/stores.py +0 -0
  351. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/studio/__init__.py +0 -0
  352. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/studio/client_tick_interval.py +0 -0
  353. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/studio/controller.py +0 -0
  354. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/studio/diagnostics.py +0 -0
  355. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/studio/github_new_repo.py +0 -0
  356. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/studio/layout.py +0 -0
  357. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/studio/models.py +0 -0
  358. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/studio/starter_projects.py +0 -0
  359. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/subscriptions.py +0 -0
  360. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/sync.py +0 -0
  361. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/utils.py +0 -0
  362. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/wire.py +0 -0
  363. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/src/crowdypy/world.py +0 -0
  364. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/conftest.py +0 -0
  365. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/__init__.py +0 -0
  366. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/test_e2e_open_grid_exec_gateway.py +0 -0
  367. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/test_e2e_ranged_channel.py +0 -0
  368. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/test_e2e_replication.py +0 -0
  369. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/test_e2e_studio.py +0 -0
  370. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/test_e2e_world.py +0 -0
  371. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/e2e/test_e2e_world_data.py +0 -0
  372. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/fixtures/README.md +0 -0
  373. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/fixtures/binary-wire-fixtures.json +0 -0
  374. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/fixtures/exec-client-frames.json +0 -0
  375. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/fixtures/voice-frames.json +0 -0
  376. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/__init__.py +0 -0
  377. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/domains/__init__.py +0 -0
  378. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/domains/test_crowdycpp_roots.py +0 -0
  379. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/domains/test_org_domains.py +0 -0
  380. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/domains/test_social_domains.py +0 -0
  381. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/domains/test_studio_exec_domains.py +0 -0
  382. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_core.py +0 -0
  383. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_durable_stores.py +0 -0
  384. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_estate_moves.py +0 -0
  385. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_exec_gateway.py +0 -0
  386. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_fixture_provenance.py +0 -0
  387. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_grid_scope.py +0 -0
  388. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_kit.py +0 -0
  389. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_lazy_exports.py +0 -0
  390. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_player_host.py +0 -0
  391. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_refusals.py +0 -0
  392. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_release_versions.py +0 -0
  393. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_replication.py +0 -0
  394. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_sdk_audience.py +0 -0
  395. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_studio_controller.py +0 -0
  396. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_studio_diagnostics.py +0 -0
  397. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_studio_layout.py +0 -0
  398. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_subscriptions.py +0 -0
  399. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_transport.py +0 -0
  400. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_udp_api.py +0 -0
  401. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_voice_frames.py +0 -0
  402. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_wire.py +0 -0
  403. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tests/unit/test_world_session.py +0 -0
  404. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tools/e2e/provision.py +0 -0
  405. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tools/fixtures/player_host.mjs +0 -0
  406. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tools/parity/classifications.toml +0 -0
  407. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/tools/parity/parity.py +0 -0
  408. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/LICENSE +0 -0
  409. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/cmake/CheckPublicHeaders.cmake +0 -0
  410. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/cmake/CrowdyCPPConfig.cmake.in +0 -0
  411. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/cmake/CrowdyFindOpus.cmake +0 -0
  412. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/cmake/studio_layout_fixture.hpp.in +0 -0
  413. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/client.hpp +0 -0
  414. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/base64.hpp +0 -0
  415. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/bytes.hpp +0 -0
  416. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/clock.hpp +0 -0
  417. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/crypto.hpp +0 -0
  418. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/logger.hpp +0 -0
  419. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/spsc.hpp +0 -0
  420. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/uuid.hpp +0 -0
  421. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/crowdy.hpp +0 -0
  422. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/default_origin.hpp +0 -0
  423. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/admin.hpp +0 -0
  424. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/auth.hpp +0 -0
  425. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio.hpp +0 -0
  426. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_agent.hpp +0 -0
  427. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_github.hpp +0 -0
  428. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/discovery.hpp +0 -0
  429. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/exec.hpp +0 -0
  430. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/game_apps.hpp +0 -0
  431. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/grids.hpp +0 -0
  432. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/groups.hpp +0 -0
  433. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/marketplace.hpp +0 -0
  434. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/player_wallet.hpp +0 -0
  435. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/portal.hpp +0 -0
  436. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/realtime_control.hpp +0 -0
  437. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/server_status.hpp +0 -0
  438. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/types.hpp +0 -0
  439. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/users.hpp +0 -0
  440. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/async_scope.hpp +0 -0
  441. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/auth_state.hpp +0 -0
  442. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/datacenter_redirect.hpp +0 -0
  443. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/dispatcher.hpp +0 -0
  444. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/estate.hpp +0 -0
  445. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/json.hpp +0 -0
  446. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/rediscover.hpp +0 -0
  447. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/subscription_client.hpp +0 -0
  448. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/websocket.hpp +0 -0
  449. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/actions.hpp +0 -0
  450. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +0 -0
  451. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/social.hpp +0 -0
  452. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/wire.hpp +0 -0
  453. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/opus.hpp +0 -0
  454. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/video_frames.hpp +0 -0
  455. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/voice_frames.hpp +0 -0
  456. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/adapter.hpp +0 -0
  457. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/player_host.hpp +0 -0
  458. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/schemas.hpp +0 -0
  459. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/types.hpp +0 -0
  460. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/connection.hpp +0 -0
  461. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/session_provider.hpp +0 -0
  462. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/types.hpp +0 -0
  463. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/udp_socket.hpp +0 -0
  464. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/chunk_store.hpp +0 -0
  465. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/codec.hpp +0 -0
  466. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/durable.hpp +0 -0
  467. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/keys.hpp +0 -0
  468. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/stores.hpp +0 -0
  469. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/world_session.hpp +0 -0
  470. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/controller.hpp +0 -0
  471. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/diagnostics.hpp +0 -0
  472. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/editor.hpp +0 -0
  473. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github.hpp +0 -0
  474. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github_layout.hpp +0 -0
  475. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/integration.hpp +0 -0
  476. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/layout.hpp +0 -0
  477. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/models.hpp +0 -0
  478. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/runtime.hpp +0 -0
  479. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/wire/codec.hpp +0 -0
  480. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/wire/protocol.hpp +0 -0
  481. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/include/crowdy/world.hpp +0 -0
  482. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/core/base64.cpp +0 -0
  483. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/core/clock.cpp +0 -0
  484. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/core/crypto_default_unavailable.cpp +0 -0
  485. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/core/crypto_openssl.cpp +0 -0
  486. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/core/crypto_unavailable.cpp +0 -0
  487. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/core/logger.cpp +0 -0
  488. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/core/uuid.cpp +0 -0
  489. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/domains/exec.cpp +0 -0
  490. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/auth_state.cpp +0 -0
  491. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/errors.cpp +0 -0
  492. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/http_none.cpp +0 -0
  493. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/json.cpp +0 -0
  494. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/subscription_client.cpp +0 -0
  495. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/websocket_curl.cpp +0 -0
  496. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/graphql/websocket_none.cpp +0 -0
  497. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/media/opus.cpp +0 -0
  498. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/player_host/schemas.cpp +0 -0
  499. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/player_host/types.cpp +0 -0
  500. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/replication/connection.cpp +0 -0
  501. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/replication/socket_errors.hpp +0 -0
  502. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/replication/udp_socket.cpp +0 -0
  503. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/studio/diagnostics.cpp +0 -0
  504. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/studio/editor.cpp +0 -0
  505. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/src/studio/integration.cpp +0 -0
  506. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/LICENSE +0 -0
  507. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.c +0 -0
  508. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.h +0 -0
  509. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-client-frames.json +0 -0
  510. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-gateway-cases.json +0 -0
  511. {crowdypy-0.9.0.dev1 → crowdypy-0.10.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/voice-frames.json +0 -0
@@ -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.10.0
7
+
8
+ CrowdyJS 18.9.0 and CrowdyCPP 0.62.0. Additive, with one floor: every sessions read selects
9
+ `InputLogSession.missingRecords`, so `client.input_log.sessions` needs the Game API release after
10
+ v2.40.2 (an older one refuses the selection).
11
+
12
+ - **`missingRecords`** on every recorded session: inputs the replication server accepted that
13
+ never reached the log (an overloaded server or a broker outage). 0 when the recording is
14
+ complete as far as it is known; `None` on one recorded before the count existed. A lost end of
15
+ the recording cannot be counted: that session closes as `unrecorded`.
16
+ - **End reasons.** `endReason` may also be `logging_off`, `shutdown`, `paused` (recording paused
17
+ while the app's logging setting could not be confirmed; a later record reopens the session) or
18
+ `unrecorded`; the `sessions` docstring says what each means.
19
+ - **Retrying a read.** `INPUT_LOG_TEMPORARILY_UNAVAILABLE` and `INPUT_LOG_RATE_LIMITED` carry
20
+ `extensions["retryable"]`: retry with the same cursor after a short back-off, a bounded number
21
+ of times. A malformed cursor, or one from another session, is `BAD_USER_INPUT`.
22
+ - **Stopping a read** (CrowdyJS's `signal`): cancel its task, or wrap it in `asyncio.timeout`. The
23
+ request is closed, which frees its share of the server's reads (one per user, two per app and
24
+ per org at a time); the client's own timeout applies either way. CrowdyCPP 0.62.0's
25
+ `CancelToken` is the C++ form; CrowdyPy's GraphQL client is Python's, so it needs none.
26
+ - **`INPUT_LOG_FUNDS_NEEDED`** on `client.apps.update(app_id, {"replayLoggingEnabled": True})` carries
27
+ `extensions["requiredMicrousd"]` and `["spendableMicrousd"]`: the balance turning logging on
28
+ needs and what the org wallet can spend.
29
+ - The vendored CrowdyCPP adds `Errc.Cancelled` beside the codes the replication layer reports;
30
+ nothing in the native client returns it.
31
+
32
+ ## 0.9.1
33
+
34
+ A patch release with the same API as 0.9.0, the same CrowdyJS (18.8.0) and CrowdyCPP (0.61.0) pins.
35
+
36
+ - **`client.input_log` sends a session filter's `userId` as a string**, the decimal string every
37
+ id is on the wire. An `int` used to go out as a JSON number.
38
+ - **Its docstrings say when a read is retryable.** From the Game API release after v2.40.2,
39
+ `InputLogAPI.messages` answers `INPUT_LOG_TEMPORARILY_UNAVAILABLE` when the log cannot be read
40
+ right now and `INPUT_LOG_RATE_LIMITED` while another read of yours is running; both carry
41
+ `extensions.retryable`, so retry with the same cursor after a short back-off.
42
+
6
43
  ## 0.9.0
7
44
 
8
45
  CrowdyJS 18.8.0 and CrowdyCPP 0.61.0. Additive, with one floor: the build documents select
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crowdypy
3
- Version: 0.9.0.dev1
3
+ Version: 0.10.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,8 +51,15 @@ 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.0: builds report the SDK they compiled against (CrowdyJS 18.8.0, CrowdyCPP 0.61.0).** See the 0.9.0
55
- bullet below.
54
+ **v0.10.0: the input log says what it lost (CrowdyJS 18.9.0, CrowdyCPP 0.62.0).** Every session
55
+ from `client.input_log.sessions` carries `missingRecords`, the inputs the replication server
56
+ accepted that never reached the log, which needs the Game API release after v2.40.2. Its
57
+ docstrings name the new end reasons (`paused` among them), the two read refusals worth retrying
58
+ with the same cursor, and how to stop a read nobody will see: cancel its task, which closes the
59
+ request and frees its server read share. See [MIGRATION.md](MIGRATION.md).
60
+
61
+ **v0.9.1: the input log's session filter sends `userId` as a string, and its reads document when
62
+ to retry.** See the 0.9.1 bullet below; 0.9.0 added the SDK a build compiled against.
56
63
 
57
64
  **v0.8.0: voice, channel audio, wide voxels, and pause and access refusals (CrowdyJS 18.7.0, CrowdyCPP 0.60.0).**
58
65
  - Voice: `crowdypy.media`'s voice helpers (an optional 10-byte header per codec frame,
@@ -11,8 +11,15 @@ 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.0: builds report the SDK they compiled against (CrowdyJS 18.8.0, CrowdyCPP 0.61.0).** See the 0.9.0
15
- bullet below.
14
+ **v0.10.0: the input log says what it lost (CrowdyJS 18.9.0, CrowdyCPP 0.62.0).** Every session
15
+ from `client.input_log.sessions` carries `missingRecords`, the inputs the replication server
16
+ accepted that never reached the log, which needs the Game API release after v2.40.2. Its
17
+ docstrings name the new end reasons (`paused` among them), the two read refusals worth retrying
18
+ with the same cursor, and how to stop a read nobody will see: cancel its task, which closes the
19
+ request and frees its server read share. See [MIGRATION.md](MIGRATION.md).
20
+
21
+ **v0.9.1: the input log's session filter sends `userId` as a string, and its reads document when
22
+ to retry.** See the 0.9.1 bullet below; 0.9.0 added the SDK a build compiled against.
16
23
 
17
24
  **v0.8.0: voice, channel audio, wide voxels, and pause and access refusals (CrowdyJS 18.7.0, CrowdyCPP 0.60.0).**
18
25
  - Voice: `crowdypy.media`'s voice helpers (an optional 10-byte header per codec frame,
@@ -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.9.0`
8
+ - CrowdyPy `0.10.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
@@ -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`,
@@ -18,7 +18,7 @@ Unconfigured, every suite skips, so `pytest` in CI records skips, not live passe
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
20
  | `CROWDY_E2E_THROWAWAY_OWNER=1` | no | the open-grid suite registers a throwaway owner, org and app (archived afterwards) |
21
- | `CROWDY_E2E_PROVISIONING_TOKEN` | dev and test | dev and test are staff-only, so a new derived player is refused (`TIER_ACCESS_REQUIRED`) unless `register` carries a provisioning token covering its address. Use the `harness` token (Secrets Manager `infra-cp/<tier>/loadtest/provisioning-token-harness`, `token` key) with `CROWDY_E2E_EMAIL=crowdy-e2e@test.invalid`. Sent on `register` only; other tiers ignore it |
21
+ | `CROWDY_E2E_PROVISIONING_TOKEN` | dev and test | dev and test are staff-only, so a new derived player is refused (`TIER_ACCESS_REQUIRED`) unless `register` carries a provisioning token covering its address. Use the `harness` token (Secrets Manager `infra-cp/<tier>/loadtest/provisioning-token-harness`, `token` key), which covers `crowdy-e2e*@test.invalid`, with `CROWDY_E2E_EMAIL=crowdy-e2e-py@test.invalid` (the `*` needs at least one character, so the bare `crowdy-e2e@test.invalid` is refused for a suite that registers the base address). Sent on `register` only; other tiers ignore it |
22
22
 
23
23
  ```bash
24
24
  pytest tests/e2e -q
@@ -44,6 +44,7 @@ player once and signs it in for the later suites.
44
44
  | `test_e2e_ranged_channel.py` | the owner's invite channel with four members, each keeping an actor at its own chunk: a distance-limited channel message from A reaches B at 5 chunks with `max_distance` 5 but not C (about 5.66) or D (7); 6 adds C, 7 adds D; A never receives its own; no send is refused | `e2e_ranged_channel` |
45
45
  | `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` |
46
46
  | `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` |
47
+ | `test_e2e_input_log.py` | read-only, as the owner: the app's sessions list with `missingRecords` on every node (the Game API release after v2.40.2 accepts the selection), one session's inputs page when there is one, and a cancelled read stops with the client still usable | `e2e_input_log` |
47
48
 
48
49
  ## Live runs
49
50
 
@@ -56,6 +57,7 @@ player once and signs it in for the later suites.
56
57
  | 2026-10-01 | dev tier, app `96701660793088`; the open-grid suite in its own throwaway org and app (`CROWDY_E2E_THROWAWAY_OWNER=1`) | `crowdypy 0.5.0.dev1` from PyPI (`pip install crowdypy` in a clean Python 3.12) | 10 passed; Studio skipped |
57
58
  | 2026-10-08 | local stack: ck-api at the distance-limited channel branch (off `dev`), two replication servers serving message type 32, the 3-node Citus lab | 0.6.0 (branch) | identity, ranged channel, replication, world and world data suites: 10 passed |
58
59
  | 2026-10-09 | dev tier, app `96701660793088`, after replication server v0.35.0 and ck-api v2.38.0 reached dev | `crowdypy 0.6.0.dev1` from PyPI (installed into a clean Python 3.12 with uv) | identity (incl. the terms gate), ranged channel, replication, world and world data suites: 10 passed |
60
+ | 2026-10-13 | dev tier (ck-api v2.42.0), app `96701660793088`, the `harness` provisioning token with `CROWDY_E2E_EMAIL=crowdy-e2e-py@test.invalid` | 0.10.0 (branch, vendoring CrowdyCPP `dev/v0.62.0`) | identity (the terms-gate case now registers with the token and no consents), input log, ranged channel, replication, world and world data suites: 12 passed; open grid (needs `CROWDY_E2E_THROWAWAY_OWNER=1`) and Studio skipped |
59
61
 
60
62
  ## Not covered here
61
63
 
@@ -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.8.0` at `d7b755abe73bd9e157673325cbfcfb3975f71cc3`
8
- - CrowdyCPP (native core): `0.61.0` at `72f4a154a8defde1f99d6dfd983cb6629c26d233`
7
+ - CrowdyJS: `18.9.0` at `cee1997127549e372c57baab2f0e12f1f423f31a`
8
+ - CrowdyCPP (native core): `0.62.0` at `3845e797d06e788f5a7c0d8e1e3fd6d501c75693`
9
9
  - schema.gql identical to CrowdyJS's: yes
10
10
  - Gate mode: strict portable parity (every portable gap is release-blocking)
11
11
 
@@ -18,6 +18,7 @@ query InputLogSessions(
18
18
  endReason
19
19
  messageCount
20
20
  byteCount
21
+ missingRecords
21
22
  messageTypes
22
23
  }
23
24
  }
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "crowdypy"
7
- version = "0.9.0.dev1"
7
+ version = "0.10.0.dev1"
8
8
  description = "Official Python SDK for Crowded Kingdoms: typed GraphQL clients and a native UDP replication core"
9
9
  readme = "README.md"
10
10
  license = "MIT AND Apache-2.0"
@@ -119,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.8.0"
123
- commit = "d7b755abe73bd9e157673325cbfcfb3975f71cc3"
122
+ version = "18.9.0"
123
+ commit = "cee1997127549e372c57baab2f0e12f1f423f31a"
124
124
 
125
125
  [tool.crowdypy.crowdycpp]
126
- version = "0.61.0"
127
- tag = "dev/v0.61.0"
128
- commit = "72f4a154a8defde1f99d6dfd983cb6629c26d233"
129
- tree-sha256 = "559bbbcc37455ae020abdf7e128cb84e05bead6e8f52b4f4a8e4293a6f1f0a18"
126
+ version = "0.62.0"
127
+ tag = "dev/v0.62.0"
128
+ commit = "3845e797d06e788f5a7c0d8e1e3fd6d501c75693"
129
+ tree-sha256 = "8a8226aa148e1c56ff620812ebaadb1fad757ebd5b801489cb1ec59e9cfe2695"
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 = "61f99f99fc80be9de388e7295faa247fe508cc0d2f7d2b832a2709ed76c464b2"
135
- operations-sha256 = "e9e0ad2ac5f585815d3f3b2b2f3b4443736f9ae602905fbe82b236b7cc4bfd66"
134
+ schema-sha256 = "4b19bc84aa340365f6a256dc10544ce9141d18437048867607c8a2d0e74a66de"
135
+ operations-sha256 = "013595fe2109633245b5c39446e884fad0ecb7d2fda3c2849c6087a5e6336f6c"
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.
@@ -1301,7 +1301,7 @@ type App {
1301
1301
  """
1302
1302
  wildernessWritesOpen: Boolean!
1303
1303
  """
1304
- Whether replay logging is on: the realtime servers record every client input they accept for this app, searchable with inputLogSessions and readable with inputLogMessages, and billed as stored input logs. False (the default) records nothing ("No replication logging"). Set with updateApp (manage_apps); turning it on needs a funded org wallet or a billing-exempt org.
1304
+ Whether replay logging is on: the realtime servers record every client message they accept for this app, searchable with inputLogSessions and readable with inputLogMessages, and billed as stored input logs. False (the default) records nothing ("No replication logging"). Set with updateApp (manage_apps); turning it on needs a wallet that covers the projected cost of one retention period, or a billing-exempt org.
1305
1305
  """
1306
1306
  replayLoggingEnabled: Boolean!
1307
1307
  """
@@ -4637,7 +4637,7 @@ type AppUsageSummary {
4637
4637
  """
4638
4638
  automationComputeUnits: String!
4639
4639
  """
4640
- Stored input logs over the window, in byte-hours (string counter): the sum of the hourly samples, which is the quantity input_log_storage_byte_hours bills. Each recorded byte (InputLogMessage.sizeBytes) is held for the input log retention, one byte-hour per hour. 0 when replay logging was off.
4640
+ Stored input logs over the window, in byte-hours (string counter): the sum of the hourly samples, which is the quantity input_log_storage_byte_hours bills. Each recorded byte (InputLogMessage.sizeBytes) is held for the input log retention, one byte-hour per hour, so recordings keep accruing byte-hours after replay logging is turned off, until they age out. 0 when nothing was held during the window.
4641
4641
  """
4642
4642
  inputLogByteHours: String!
4643
4643
  """
@@ -4681,7 +4681,7 @@ type AppUsageProjection {
4681
4681
  """
4682
4682
  onTrackToExceed: Boolean
4683
4683
  """
4684
- Stored input logs this calendar month so far, in byte-hours (input_log_storage_byte_hours, which has no free allowance). 0 when replay logging was off all month.
4684
+ Stored input logs this calendar month so far, in byte-hours (input_log_storage_byte_hours, which has no free allowance). Recordings keep accruing after replay logging is turned off, until they age out at the end of the retention; 0 when nothing was held this month.
4685
4685
  """
4686
4686
  inputLogByteHours: String!
4687
4687
  """
@@ -5156,11 +5156,11 @@ type InputLogSession {
5156
5156
  """When the latest recorded input or marker arrived."""
5157
5157
  lastSeenAt: DateTime!
5158
5158
  """
5159
- When the session ended, if its end was recorded; null while it may still be running.
5159
+ When the session ended; null while it may still be running. A session whose end was not recorded is closed at its last record once it has gone an hour without one. Later records reopen a session (endedAt returns to null).
5160
5160
  """
5161
5161
  endedAt: DateTime
5162
5162
  """
5163
- How the session ended, as the client saw it: expired, revoked, reconnect or released. Null while it may still be running.
5163
+ How the session ended: expired, revoked, reconnect or released, as the client saw it; logging_off, when the app turned replay logging off while the session was open; shutdown, when the realtime server recording it stopped (a deploy), after which the client reconnects elsewhere; paused, when recording paused because the app's logging setting could not be confirmed, which the client does not see (a later record reopens the session); or unrecorded, when its end was not recorded and it was closed an hour after its last record. Null while it may still be running.
5164
5164
  """
5165
5165
  endReason: String
5166
5166
  """Inputs recorded in the session."""
@@ -5171,6 +5171,10 @@ type InputLogSession {
5171
5171
  byteCount: BigInt!
5172
5172
  """The client message types the session contains, ascending."""
5173
5173
  messageTypes: [Int!]!
5174
+ """
5175
+ Records the realtime servers numbered for this session that never reached the log: recording is best-effort, so an overloaded server or a broker outage can leave gaps, and this is how many. 0 when the recording is complete as far as it is known. A lost end of the recording cannot be counted (its session closes as unrecorded instead). Null for a session recorded before the realtime servers numbered their records.
5176
+ """
5177
+ missingRecords: BigInt
5174
5178
  }
5175
5179
 
5176
5180
  """An edge in a InputLogSession connection."""
@@ -6501,7 +6505,9 @@ type Query {
6501
6505
  inputLogSessions(
6502
6506
  """The app whose recorded sessions to list."""
6503
6507
  appId: BigInt!
6504
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
6508
+ """
6509
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
6510
+ """
6505
6511
  first: Int
6506
6512
  """
6507
6513
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -6511,14 +6517,16 @@ type Query {
6511
6517
  filter: InputLogSessionFilter
6512
6518
  ): InputLogSessionConnection!
6513
6519
  """
6514
- The recorded inputs of one session, oldest first, each exactly as the client sent it (without its authentication tail). Read from the input log by the offset ranges its index holds, so inputs past the published retention are gone even while the session is still listed. With 'manage_apps' on the app you may read any session; anyone else may read only their own, and any other session answers NOT_FOUND. Game plane: send the app-scoped token for this app to the app's datacenter. Page with `first` (default 50, max 200) and `after`; a page can hold fewer than `first` inputs when it stopped at its time or scan limit, so keep paging while hasNextPage is true. INPUT_LOG_UNAVAILABLE when input logging is not configured on this deployment, and also, retryable with the same cursor, when the log cannot be read right now.
6520
+ The recorded inputs of one session, oldest first, each exactly as the client sent it (without its authentication tail). Read from the input log by the offset ranges its index holds, so inputs past the published retention are gone even while the session is still listed. With 'manage_apps' on the app you may read any session; anyone else may read only their own, and any other session answers NOT_FOUND. Game plane: send the app-scoped token for this app to the app's datacenter. Page with `first` (default 50, max 200) and `after`, the previous page's endCursor for this same session (a cursor from another session is BAD_USER_INPUT); a page can hold fewer than `first` inputs, or none, when it stopped at its time or scan limit, so keep paging while hasNextPage is true. An operation may select this field only once. A server runs one read per user (two per app and per org) at a time; a read over that share waits for the earlier one within its own few-second deadline, and a read whose request is closed stops. Errors: INPUT_LOG_UNAVAILABLE when input logging is not configured on this deployment, or this server may not read its log (do not retry); INPUT_LOG_RATE_LIMITED (429) when the wait for an earlier read ran out or left too little time to read, and INPUT_LOG_TEMPORARILY_UNAVAILABLE (503) when the log cannot be read just now, both with extensions.retryable: retry shortly with the same cursor. A read whose request closed stops as INPUT_LOG_READ_ABORTED (499), which nobody receives.
6515
6521
  """
6516
6522
  inputLogMessages(
6517
6523
  """The app the session belongs to."""
6518
6524
  appId: BigInt!
6519
6525
  """The session to read: InputLogSession.gameTokenId."""
6520
6526
  gameTokenId: BigInt!
6521
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
6527
+ """
6528
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
6529
+ """
6522
6530
  first: Int
6523
6531
  """
6524
6532
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -6583,7 +6591,9 @@ type Query {
6583
6591
  Super admin only. Paginated user search across email, gamertag, disambiguation, and exact user_id. Relay cursor connection; prefer this over the offset-based usersPaginated.
6584
6592
  """
6585
6593
  usersConnection(
6586
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
6594
+ """
6595
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
6596
+ """
6587
6597
  first: Int
6588
6598
  """
6589
6599
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -6630,7 +6640,9 @@ type Query {
6630
6640
  Relay-style cursor-paginated version of `actors`: lists actors owned by the authenticated user, optionally narrowed by `filter` (appId, avatarId, uuid, chunk). Page forward with `first` (default 50, max 200) and `after` (an opaque cursor from a previous page’s `pageInfo.endCursor`); `totalCount` is the full number of matching actors. Requires a valid game token; only the caller’s own actors are returned (full state included). Under an app token the list is confined to that token’s app.
6631
6641
  """
6632
6642
  actorsConnection(
6633
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
6643
+ """
6644
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
6645
+ """
6634
6646
  first: Int
6635
6647
  """
6636
6648
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -6724,7 +6736,9 @@ type Query {
6724
6736
  appUserAccessConnection(
6725
6737
  """Numeric id of the app whose access records to list."""
6726
6738
  appId: BigInt!
6727
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
6739
+ """
6740
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
6741
+ """
6728
6742
  first: Int
6729
6743
  """
6730
6744
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -6877,7 +6891,9 @@ type Query {
6877
6891
  Public marketplace listing of apps. PUBLIC: no authentication required. Returns ONLY apps with visibility=PUBLIC AND status=LIVE (drafts, unlisted, private, and archived apps are never returned). Results are ordered newest-first. Relay cursor connection; prefer this over the offset-based apps.
6878
6892
  """
6879
6893
  appsConnection(
6880
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
6894
+ """
6895
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
6896
+ """
6881
6897
  first: Int
6882
6898
  """
6883
6899
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -7007,10 +7023,12 @@ type Query {
7007
7023
  Organization id (BigInt as a decimal string) whose transactions to list.
7008
7024
  """
7009
7025
  orgId: BigInt!
7010
- """Maximum number of transactions to return. Defaults to 50 when omitted."""
7026
+ """
7027
+ Maximum number of transactions to return, 1 to 200 (a value outside is clamped). Defaults to 50 when omitted.
7028
+ """
7011
7029
  limit: Int @deprecated(reason: "Use walletTransactionsConnection(first:, after:) instead. See /overview/pagination.")
7012
7030
  """
7013
- Number of transactions to skip before returning results, for offset/limit pagination. Defaults to 0 when omitted.
7031
+ Number of transactions to skip before returning results, for offset/limit pagination, 0 to 9999999 (a value outside is clamped). Defaults to 0 when omitted.
7014
7032
  """
7015
7033
  offset: Int @deprecated(reason: "Use walletTransactionsConnection(first:, after:) instead. See /overview/pagination.")
7016
7034
  ): [WalletTransaction!]! @requiresPermission(scope: "org", permission: "view_billing", scopeArg: "orgId")
@@ -7022,7 +7040,9 @@ type Query {
7022
7040
  Organization id (BigInt as a decimal string) whose transactions to list.
7023
7041
  """
7024
7042
  orgId: BigInt!
7025
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
7043
+ """
7044
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
7045
+ """
7026
7046
  first: Int
7027
7047
  """
7028
7048
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -7129,7 +7149,9 @@ type Query {
7129
7149
  Lists the authenticated caller's own checkouts (newest first), across every org and app. Use this for a self-service payment history; use `checkoutsConnection` for the cross-tenant super-admin view. Requires an authenticated user. Relay cursor connection; prefer this over the offset-based myCheckouts.
7130
7150
  """
7131
7151
  myCheckoutsConnection(
7132
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
7152
+ """
7153
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
7154
+ """
7133
7155
  first: Int
7134
7156
  """
7135
7157
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -7157,7 +7179,9 @@ type Query {
7157
7179
  Cross-tenant payments audit across all users, orgs, and apps (newest first), with optional filtering. Restricted to super admins; requests from non-super-admins are rejected. For a caller's own history use `myCheckoutsConnection` instead. Relay cursor connection; prefer this over the offset-based checkouts.
7158
7180
  """
7159
7181
  checkoutsConnection(
7160
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
7182
+ """
7183
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
7184
+ """
7161
7185
  first: Int
7162
7186
  """
7163
7187
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -7185,7 +7209,9 @@ type Query {
7185
7209
  Audit log of inbound payment-provider webhook events (used for idempotent reconciliation of checkouts), newest first. Restricted to super admins; requests from non-super-admins are rejected. Relay cursor connection; prefer this over the offset-based paymentEvents.
7186
7210
  """
7187
7211
  paymentEventsConnection(
7188
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
7212
+ """
7213
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
7214
+ """
7189
7215
  first: Int
7190
7216
  """
7191
7217
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -7248,7 +7274,9 @@ type Query {
7248
7274
  playerUsageCharges(
7249
7275
  """Optional: only charges for this app."""
7250
7276
  appId: BigInt
7251
- """Max entries (default 50, max 200)."""
7277
+ """
7278
+ Maximum number of charges to return, 1 to 200 (a value outside is clamped). Defaults to 50 when omitted.
7279
+ """
7252
7280
  limit: Int
7253
7281
  ): [PlayerUsageCharge!]!
7254
7282
  """
@@ -7584,7 +7612,9 @@ type Query {
7584
7612
  Number of entries to skip for pagination. Defaults to 0 when omitted; allowed range is 0-1000000.
7585
7613
  """
7586
7614
  offset: Int @deprecated(reason: "Use voxelUpdateHistoryConnection(first:, after:) instead. See /overview/pagination. Removal no earlier than 2027-01-01. (Ignored by voxelUpdateHistoryConnection, which shares these args.)")
7587
- """Return the first N edges after `after`. Default 50; clamped to 1..200."""
7615
+ """
7616
+ Return the first N edges after `after`. Default 50; clamped to 1..200, so 0 returns one edge.
7617
+ """
7588
7618
  first: Int
7589
7619
  """
7590
7620
  Opaque cursor: return edges after this one. Pass a previous page's `pageInfo.endCursor`. Omit for the first page.
@@ -8829,7 +8859,7 @@ type Mutation {
8829
8859
  input: CreateAppInput!
8830
8860
  ): App! @requiresPermission(scope: "org", permission: "manage_apps", scopeArg: "input.orgId")
8831
8861
  """
8832
- Update mutable fields of an existing app (name, description, visibility, status, metadata, wildernessWritesOpen, replayLoggingEnabled); only fields present in the input are changed. Turning replayLoggingEnabled on is refused with INPUT_LOG_FUNDS_NEEDED unless the org's wallet has a spendable balance or the org is billing-exempt. Requires the 'manage_apps' permission on the app (resolved via its org); super admins bypass. Use this to publish (status=LIVE), change visibility, or restore an archived app (status back to DRAFT/LIVE). Throws if the app id does not exist.
8862
+ Update mutable fields of an existing app (name, description, visibility, status, metadata, wildernessWritesOpen, replayLoggingEnabled); only fields present in the input are changed. Turning replayLoggingEnabled on is refused with INPUT_LOG_FUNDS_NEEDED unless the org's wallet can spend at least the projected cost of keeping one retention period of the app's recent traffic (extensions.requiredMicrousd and spendableMicrousd say how much), or the org is billing-exempt; recordings already kept go on billing after it is turned off, until they age out. Requires the 'manage_apps' permission on the app (resolved via its org); super admins bypass. Use this to publish (status=LIVE), change visibility, or restore an archived app (status back to DRAFT/LIVE). Throws if the app id does not exist.
8833
8863
  """
8834
8864
  updateApp(
8835
8865
  """Numeric id of the app to update."""
@@ -10694,7 +10724,7 @@ input UpdateAppInput {
10694
10724
  """
10695
10725
  wildernessWritesOpen: Boolean
10696
10726
  """
10697
- Turn replay logging on (true) or off (false): record every client input the realtime servers accept for this app, kept for the input log's published retention and billed as stored input logs (input_log_storage_byte_hours, no free allowance). Turning it ON is refused with INPUT_LOG_FUNDS_NEEDED unless the org's wallet has a spendable balance or the org is billing-exempt; turning it off always succeeds. Recording starts and stops within about 15 seconds. Omit to leave unchanged.
10727
+ Turn replay logging on (true) or off (false): record every client message the realtime servers accept for this app (keep-alives included), kept for the input log's published retention and billed as stored input logs (input_log_storage_byte_hours, no free allowance). Turning it ON is refused with INPUT_LOG_FUNDS_NEEDED unless the org's wallet can spend at least the projected cost of keeping one retention period of the app's recent traffic, or the org is billing-exempt; turning it off always succeeds, and what was already recorded goes on billing until it ages out. Recording starts and stops within about 15 seconds. Omit to leave unchanged.
10698
10728
  """
10699
10729
  replayLoggingEnabled: Boolean
10700
10730
  """
@@ -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: 61f99f99fc80be9de388e7295faa247fe508cc0d2f7d2b832a2709ed76c464b2
3
+ schema.gql sha256: 4b19bc84aa340365f6a256dc10544ce9141d18437048867607c8a2d0e74a66de
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: 61f99f99fc80be9de388e7295faa247fe508cc0d2f7d2b832a2709ed76c464b2
7
+ schema.gql sha256: 4b19bc84aa340365f6a256dc10544ce9141d18437048867607c8a2d0e74a66de
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: 61f99f99fc80be9de388e7295faa247fe508cc0d2f7d2b832a2709ed76c464b2
4
- operations/ sha256: e9e0ad2ac5f585815d3f3b2b2f3b4443736f9ae602905fbe82b236b7cc4bfd66
3
+ schema.gql sha256: 4b19bc84aa340365f6a256dc10544ce9141d18437048867607c8a2d0e74a66de
4
+ operations/ sha256: 013595fe2109633245b5c39446e884fad0ecb7d2fda3c2849c6087a5e6336f6c
5
5
  """
6
6
 
7
7
  from crowdypy._operation import Operation
@@ -1132,7 +1132,7 @@ INPUT_LOG_SESSIONS = Operation(
1132
1132
  name='InputLogSessions',
1133
1133
  kind='query',
1134
1134
  root_fields=('inputLogSessions',),
1135
- document='query InputLogSessions($appId: BigInt!, $first: Int, $after: String, $filter: InputLogSessionFilter) {\n inputLogSessions(appId: $appId, first: $first, after: $after, filter: $filter) {\n edges {\n cursor\n node {\n appId\n gameTokenId\n userId\n datacenter\n startedAt\n lastSeenAt\n endedAt\n endReason\n messageCount\n byteCount\n messageTypes\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n}',
1135
+ document='query InputLogSessions($appId: BigInt!, $first: Int, $after: String, $filter: InputLogSessionFilter) {\n inputLogSessions(appId: $appId, first: $first, after: $after, filter: $filter) {\n edges {\n cursor\n node {\n appId\n gameTokenId\n userId\n datacenter\n startedAt\n lastSeenAt\n endedAt\n endReason\n messageCount\n byteCount\n missingRecords\n messageTypes\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n totalCount\n }\n}',
1136
1136
  )
1137
1137
 
1138
1138
  # organizations/InviteOrgMember.graphql
@@ -243,6 +243,9 @@ class AppsAPI(Domain):
243
243
  active grid keys, never a player-code key) are the grid permission keys a player's
244
244
  claim grants its owner on the claimed grid, for claims made from then on; for
245
245
  example ``update_voxel_data`` makes a claim buildable without a hub granting it.
246
+ ``replayLoggingEnabled`` true raises ``INPUT_LOG_FUNDS_NEEDED`` unless the org wallet
247
+ can spend the projected cost of keeping one retention period of the app's recent
248
+ traffic; ``extensions["requiredMicrousd"]`` and ``["spendableMicrousd"]`` say how much.
246
249
  """
247
250
  result: dict[str, Any] = self._request(
248
251
  ops.UPDATE_APP, {"appId": bigint(app_id), "input": input}