crowdypy 0.4.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 (487) hide show
  1. crowdypy-0.4.0.dev1/.gitattributes +8 -0
  2. crowdypy-0.4.0.dev1/.gitignore +26 -0
  3. crowdypy-0.4.0.dev1/.gitleaks.toml +27 -0
  4. crowdypy-0.4.0.dev1/AGENTS.md +145 -0
  5. crowdypy-0.4.0.dev1/CMakeLists.txt +78 -0
  6. crowdypy-0.4.0.dev1/LICENSE +21 -0
  7. crowdypy-0.4.0.dev1/MIGRATION.md +178 -0
  8. crowdypy-0.4.0.dev1/PKG-INFO +264 -0
  9. crowdypy-0.4.0.dev1/README.md +224 -0
  10. crowdypy-0.4.0.dev1/SECURITY.md +35 -0
  11. crowdypy-0.4.0.dev1/benchmarks/README.md +95 -0
  12. crowdypy-0.4.0.dev1/benchmarks/bench_replication.py +390 -0
  13. crowdypy-0.4.0.dev1/docs/compatibility.md +40 -0
  14. crowdypy-0.4.0.dev1/docs/e2e-coverage.md +64 -0
  15. crowdypy-0.4.0.dev1/docs/parity-matrix.md +1181 -0
  16. crowdypy-0.4.0.dev1/licenses/OpenSSL-LICENSE.txt +177 -0
  17. crowdypy-0.4.0.dev1/native/common.hpp +114 -0
  18. crowdypy-0.4.0.dev1/native/module.cpp +30 -0
  19. crowdypy-0.4.0.dev1/native/replication.hpp +796 -0
  20. crowdypy-0.4.0.dev1/native/replication_binding.cpp +346 -0
  21. crowdypy-0.4.0.dev1/native/session_binding.cpp +737 -0
  22. crowdypy-0.4.0.dev1/native/wire_binding.cpp +202 -0
  23. crowdypy-0.4.0.dev1/operations/actors/Actor.graphql +16 -0
  24. crowdypy-0.4.0.dev1/operations/actors/Actors.graphql +45 -0
  25. crowdypy-0.4.0.dev1/operations/actors/BatchLookupActors.graphql +16 -0
  26. crowdypy-0.4.0.dev1/operations/actors/CreateActor.graphql +17 -0
  27. crowdypy-0.4.0.dev1/operations/actors/DeleteActor.graphql +7 -0
  28. crowdypy-0.4.0.dev1/operations/actors/UpdateActor.graphql +16 -0
  29. crowdypy-0.4.0.dev1/operations/actors/UpdateActorState.graphql +9 -0
  30. crowdypy-0.4.0.dev1/operations/appAccess/AppAccessTiers.graphql +18 -0
  31. crowdypy-0.4.0.dev1/operations/appAccess/AppFeatures.graphql +7 -0
  32. crowdypy-0.4.0.dev1/operations/appAccess/AppGrantMemberCandidates.graphql +7 -0
  33. crowdypy-0.4.0.dev1/operations/appAccess/AppUserAccessByApp.graphql +61 -0
  34. crowdypy-0.4.0.dev1/operations/appAccess/ArchiveAccessTier.graphql +7 -0
  35. crowdypy-0.4.0.dev1/operations/appAccess/ClaimFreeAppAccess.graphql +14 -0
  36. crowdypy-0.4.0.dev1/operations/appAccess/CreateAccessTier.graphql +18 -0
  37. crowdypy-0.4.0.dev1/operations/appAccess/DefineAppFeature.graphql +7 -0
  38. crowdypy-0.4.0.dev1/operations/appAccess/GrantAppAccess.graphql +14 -0
  39. crowdypy-0.4.0.dev1/operations/appAccess/GrantMyAppAccess.graphql +14 -0
  40. crowdypy-0.4.0.dev1/operations/appAccess/GrantTierFeature.graphql +7 -0
  41. crowdypy-0.4.0.dev1/operations/appAccess/MyAppAccess.graphql +14 -0
  42. crowdypy-0.4.0.dev1/operations/appAccess/RevokeAppAccess.graphql +14 -0
  43. crowdypy-0.4.0.dev1/operations/appAccess/RevokeTierFeature.graphql +3 -0
  44. crowdypy-0.4.0.dev1/operations/appAccess/RuntimePermissions.graphql +3 -0
  45. crowdypy-0.4.0.dev1/operations/appAccess/TierFeatures.graphql +7 -0
  46. crowdypy-0.4.0.dev1/operations/appAccess/UpdateAccessTier.graphql +17 -0
  47. crowdypy-0.4.0.dev1/operations/apps/App.graphql +31 -0
  48. crowdypy-0.4.0.dev1/operations/apps/AppBySlug.graphql +22 -0
  49. crowdypy-0.4.0.dev1/operations/apps/AppDiscovery.graphql +8 -0
  50. crowdypy-0.4.0.dev1/operations/apps/AppsForOrg.graphql +17 -0
  51. crowdypy-0.4.0.dev1/operations/apps/ArchiveApp.graphql +7 -0
  52. crowdypy-0.4.0.dev1/operations/apps/CodeAdmissions.graphql +42 -0
  53. crowdypy-0.4.0.dev1/operations/apps/CreateApp.graphql +14 -0
  54. crowdypy-0.4.0.dev1/operations/apps/MarketplaceApps.graphql +70 -0
  55. crowdypy-0.4.0.dev1/operations/apps/MyApps.graphql +22 -0
  56. crowdypy-0.4.0.dev1/operations/apps/PlaceableDatacenters.graphql +14 -0
  57. crowdypy-0.4.0.dev1/operations/apps/UpdateApp.graphql +14 -0
  58. crowdypy-0.4.0.dev1/operations/auth/Logout.graphql +3 -0
  59. crowdypy-0.4.0.dev1/operations/auth/LogoutAllDevices.graphql +3 -0
  60. crowdypy-0.4.0.dev1/operations/avatars/Avatars.graphql +104 -0
  61. crowdypy-0.4.0.dev1/operations/billing/AppBudget.graphql +12 -0
  62. crowdypy-0.4.0.dev1/operations/billing/AppBudgets.graphql +12 -0
  63. crowdypy-0.4.0.dev1/operations/billing/SetAppBudget.graphql +12 -0
  64. crowdypy-0.4.0.dev1/operations/billing/WalletBalance.graphql +12 -0
  65. crowdypy-0.4.0.dev1/operations/billing/WalletTransactions.graphql +49 -0
  66. crowdypy-0.4.0.dev1/operations/channels/AddChannelMember.graphql +16 -0
  67. crowdypy-0.4.0.dev1/operations/channels/Channel.graphql +14 -0
  68. crowdypy-0.4.0.dev1/operations/channels/ChannelMembers.graphql +16 -0
  69. crowdypy-0.4.0.dev1/operations/channels/ChannelPolicy.graphql +10 -0
  70. crowdypy-0.4.0.dev1/operations/channels/ChannelRoles.graphql +11 -0
  71. crowdypy-0.4.0.dev1/operations/channels/Channels.graphql +14 -0
  72. crowdypy-0.4.0.dev1/operations/channels/CreateChannel.graphql +14 -0
  73. crowdypy-0.4.0.dev1/operations/channels/CreateChannelRole.graphql +11 -0
  74. crowdypy-0.4.0.dev1/operations/channels/DeleteChannel.graphql +3 -0
  75. crowdypy-0.4.0.dev1/operations/channels/DeleteChannelRole.graphql +3 -0
  76. crowdypy-0.4.0.dev1/operations/channels/JoinChannel.graphql +16 -0
  77. crowdypy-0.4.0.dev1/operations/channels/LeaveChannel.graphql +3 -0
  78. crowdypy-0.4.0.dev1/operations/channels/MyChannels.graphql +25 -0
  79. crowdypy-0.4.0.dev1/operations/channels/RemoveChannelMember.graphql +3 -0
  80. crowdypy-0.4.0.dev1/operations/channels/RequestToJoinChannel.graphql +16 -0
  81. crowdypy-0.4.0.dev1/operations/channels/SetChannelMemberRoles.graphql +16 -0
  82. crowdypy-0.4.0.dev1/operations/channels/SetChannelPolicy.graphql +10 -0
  83. crowdypy-0.4.0.dev1/operations/channels/UpdateChannel.graphql +14 -0
  84. crowdypy-0.4.0.dev1/operations/channels/UpdateChannelRole.graphql +11 -0
  85. crowdypy-0.4.0.dev1/operations/chunks/GetChunk.graphql +30 -0
  86. crowdypy-0.4.0.dev1/operations/chunks/GetChunkLods.graphql +16 -0
  87. crowdypy-0.4.0.dev1/operations/chunks/GetChunksByDistance.graphql +25 -0
  88. crowdypy-0.4.0.dev1/operations/chunks/GetVoxelList.graphql +27 -0
  89. crowdypy-0.4.0.dev1/operations/chunks/UpdateChunk.graphql +14 -0
  90. crowdypy-0.4.0.dev1/operations/chunks/UpdateChunkLods.graphql +16 -0
  91. crowdypy-0.4.0.dev1/operations/chunks/UpdateChunkState.graphql +13 -0
  92. crowdypy-0.4.0.dev1/operations/crowdyStudio/CrowdyStudio.graphql +168 -0
  93. crowdypy-0.4.0.dev1/operations/exec/Exec.graphql +458 -0
  94. crowdypy-0.4.0.dev1/operations/gameApps/GameApps.graphql +168 -0
  95. crowdypy-0.4.0.dev1/operations/grids/CreateGridChannel.graphql +15 -0
  96. crowdypy-0.4.0.dev1/operations/grids/GridChannels.graphql +15 -0
  97. crowdypy-0.4.0.dev1/operations/grids/MintGridToken.graphql +19 -0
  98. crowdypy-0.4.0.dev1/operations/host/Host.graphql +19 -0
  99. crowdypy-0.4.0.dev1/operations/marketplace/Marketplace.graphql +193 -0
  100. crowdypy-0.4.0.dev1/operations/organizations/CreateOrgRole.graphql +10 -0
  101. crowdypy-0.4.0.dev1/operations/organizations/CreateOrgToken.graphql +11 -0
  102. crowdypy-0.4.0.dev1/operations/organizations/CreateOrganization.graphql +11 -0
  103. crowdypy-0.4.0.dev1/operations/organizations/DeleteOrgRole.graphql +3 -0
  104. crowdypy-0.4.0.dev1/operations/organizations/InviteOrgMember.graphql +10 -0
  105. crowdypy-0.4.0.dev1/operations/organizations/MemberRoles.graphql +10 -0
  106. crowdypy-0.4.0.dev1/operations/organizations/MyOrganizations.graphql +22 -0
  107. crowdypy-0.4.0.dev1/operations/organizations/OrgMembers.graphql +10 -0
  108. crowdypy-0.4.0.dev1/operations/organizations/OrgPermissions.graphql +7 -0
  109. crowdypy-0.4.0.dev1/operations/organizations/OrgRoles.graphql +10 -0
  110. crowdypy-0.4.0.dev1/operations/organizations/OrgTokens.graphql +13 -0
  111. crowdypy-0.4.0.dev1/operations/organizations/Organization.graphql +11 -0
  112. crowdypy-0.4.0.dev1/operations/organizations/OrganizationBySlug.graphql +11 -0
  113. crowdypy-0.4.0.dev1/operations/organizations/RemoveOrgMember.graphql +3 -0
  114. crowdypy-0.4.0.dev1/operations/organizations/RevokeOrgToken.graphql +3 -0
  115. crowdypy-0.4.0.dev1/operations/organizations/UpdateOrgMemberRoles.graphql +12 -0
  116. crowdypy-0.4.0.dev1/operations/organizations/UpdateOrgRole.graphql +10 -0
  117. crowdypy-0.4.0.dev1/operations/organizations/UpdateOrgToken.graphql +10 -0
  118. crowdypy-0.4.0.dev1/operations/payments/CapturePaypalCheckout.graphql +20 -0
  119. crowdypy-0.4.0.dev1/operations/payments/CreateCheckout.graphql +20 -0
  120. crowdypy-0.4.0.dev1/operations/payments/MyCheckouts.graphql +60 -0
  121. crowdypy-0.4.0.dev1/operations/platform/PlatformConfig.graphql +7 -0
  122. crowdypy-0.4.0.dev1/operations/playerWallet/PlayerWallet.graphql +166 -0
  123. crowdypy-0.4.0.dev1/operations/quotas/DeleteQuota.graphql +3 -0
  124. crowdypy-0.4.0.dev1/operations/quotas/EffectiveQuota.graphql +22 -0
  125. crowdypy-0.4.0.dev1/operations/quotas/QuotasForApp.graphql +14 -0
  126. crowdypy-0.4.0.dev1/operations/quotas/QuotasForOrg.graphql +14 -0
  127. crowdypy-0.4.0.dev1/operations/quotas/SetQuota.graphql +14 -0
  128. crowdypy-0.4.0.dev1/operations/serverStatus/ActiveGraphQLServers.graphql +10 -0
  129. crowdypy-0.4.0.dev1/operations/serverStatus/GameClientBootstrap.graphql +48 -0
  130. crowdypy-0.4.0.dev1/operations/serverStatus/GraphqlServers.graphql +10 -0
  131. crowdypy-0.4.0.dev1/operations/serverStatus/ServerWithLeastClients.graphql +14 -0
  132. crowdypy-0.4.0.dev1/operations/serverStatus/VersionInfo.graphql +16 -0
  133. crowdypy-0.4.0.dev1/operations/sharedEnvironment/SharedEnvironment.graphql +196 -0
  134. crowdypy-0.4.0.dev1/operations/state/DeleteUserAppState.graphql +9 -0
  135. crowdypy-0.4.0.dev1/operations/state/UpdateUserAppState.graphql +9 -0
  136. crowdypy-0.4.0.dev1/operations/state/UserAppState.graphql +9 -0
  137. crowdypy-0.4.0.dev1/operations/state/UserAppStates.graphql +9 -0
  138. crowdypy-0.4.0.dev1/operations/teams/AddTeamMember.graphql +16 -0
  139. crowdypy-0.4.0.dev1/operations/teams/CreateTeam.graphql +14 -0
  140. crowdypy-0.4.0.dev1/operations/teams/CreateTeamRole.graphql +11 -0
  141. crowdypy-0.4.0.dev1/operations/teams/DeleteTeam.graphql +3 -0
  142. crowdypy-0.4.0.dev1/operations/teams/DeleteTeamRole.graphql +3 -0
  143. crowdypy-0.4.0.dev1/operations/teams/JoinTeam.graphql +16 -0
  144. crowdypy-0.4.0.dev1/operations/teams/LeaveTeam.graphql +3 -0
  145. crowdypy-0.4.0.dev1/operations/teams/MyTeams.graphql +25 -0
  146. crowdypy-0.4.0.dev1/operations/teams/RemoveTeamMember.graphql +3 -0
  147. crowdypy-0.4.0.dev1/operations/teams/RequestToJoinTeam.graphql +16 -0
  148. crowdypy-0.4.0.dev1/operations/teams/SetTeamMemberRoles.graphql +16 -0
  149. crowdypy-0.4.0.dev1/operations/teams/SetTeamPolicy.graphql +10 -0
  150. crowdypy-0.4.0.dev1/operations/teams/Team.graphql +14 -0
  151. crowdypy-0.4.0.dev1/operations/teams/TeamMembers.graphql +16 -0
  152. crowdypy-0.4.0.dev1/operations/teams/TeamPolicy.graphql +10 -0
  153. crowdypy-0.4.0.dev1/operations/teams/TeamRoles.graphql +11 -0
  154. crowdypy-0.4.0.dev1/operations/teams/Teams.graphql +14 -0
  155. crowdypy-0.4.0.dev1/operations/teams/UpdateTeam.graphql +14 -0
  156. crowdypy-0.4.0.dev1/operations/teams/UpdateTeamRole.graphql +11 -0
  157. crowdypy-0.4.0.dev1/operations/teleport/TeleportRequest.graphql +6 -0
  158. crowdypy-0.4.0.dev1/operations/usage/AppGraphqlOperations.graphql +18 -0
  159. crowdypy-0.4.0.dev1/operations/usage/AppUsageSummary.graphql +28 -0
  160. crowdypy-0.4.0.dev1/operations/usage/PlayerPulse.graphql +10 -0
  161. crowdypy-0.4.0.dev1/operations/users/DeleteMyAccount.graphql +3 -0
  162. crowdypy-0.4.0.dev1/operations/users/FreePlayWindow.graphql +7 -0
  163. crowdypy-0.4.0.dev1/operations/users/Me.graphql +17 -0
  164. crowdypy-0.4.0.dev1/operations/users/UpdateGamertag.graphql +8 -0
  165. crowdypy-0.4.0.dev1/operations/users/UpdateUserState.graphql +7 -0
  166. crowdypy-0.4.0.dev1/operations/users/User.graphql +17 -0
  167. crowdypy-0.4.0.dev1/operations/voxels/ListVoxelUpdatesByDistance.graphql +31 -0
  168. crowdypy-0.4.0.dev1/operations/voxels/ListVoxels.graphql +20 -0
  169. crowdypy-0.4.0.dev1/operations/voxels/RollbackVoxelUpdates.graphql +20 -0
  170. crowdypy-0.4.0.dev1/operations/voxels/UpdateVoxel.graphql +20 -0
  171. crowdypy-0.4.0.dev1/operations/voxels/VoxelUpdateHistory.graphql +81 -0
  172. crowdypy-0.4.0.dev1/pyproject.toml +170 -0
  173. crowdypy-0.4.0.dev1/schema.gql +11932 -0
  174. crowdypy-0.4.0.dev1/scripts/_pins.py +92 -0
  175. crowdypy-0.4.0.dev1/scripts/ci/assert_default_origin.py +162 -0
  176. crowdypy-0.4.0.dev1/scripts/ci/build_openssl.sh +70 -0
  177. crowdypy-0.4.0.dev1/scripts/ci/check_content_policy.py +140 -0
  178. crowdypy-0.4.0.dev1/scripts/ci/check_pin_tiers.py +124 -0
  179. crowdypy-0.4.0.dev1/scripts/ci/cibw_before_all_linux.sh +14 -0
  180. crowdypy-0.4.0.dev1/scripts/ci/resolve-release-tier.sh +98 -0
  181. crowdypy-0.4.0.dev1/scripts/ci/resolve-release-tier.test.sh +172 -0
  182. crowdypy-0.4.0.dev1/scripts/ci/resolve_pypi_version.py +98 -0
  183. crowdypy-0.4.0.dev1/scripts/ci/stamp_version.py +47 -0
  184. crowdypy-0.4.0.dev1/scripts/ci/verify_artifacts.py +58 -0
  185. crowdypy-0.4.0.dev1/scripts/codegen.py +333 -0
  186. crowdypy-0.4.0.dev1/scripts/schema_drift.py +131 -0
  187. crowdypy-0.4.0.dev1/scripts/schema_sync.py +169 -0
  188. crowdypy-0.4.0.dev1/scripts/unasync.py +245 -0
  189. crowdypy-0.4.0.dev1/scripts/vendor_crowdycpp.py +183 -0
  190. crowdypy-0.4.0.dev1/src/crowdypy/__init__.py +515 -0
  191. crowdypy-0.4.0.dev1/src/crowdypy/_concurrency.py +129 -0
  192. crowdypy-0.4.0.dev1/src/crowdypy/_default_origin.py +26 -0
  193. crowdypy-0.4.0.dev1/src/crowdypy/_generated/__init__.py +1 -0
  194. crowdypy-0.4.0.dev1/src/crowdypy/_generated/enums.py +465 -0
  195. crowdypy-0.4.0.dev1/src/crowdypy/_generated/inputs.py +1249 -0
  196. crowdypy-0.4.0.dev1/src/crowdypy/_generated/operations.py +2397 -0
  197. crowdypy-0.4.0.dev1/src/crowdypy/_grid.py +47 -0
  198. crowdypy-0.4.0.dev1/src/crowdypy/_native.pyi +10 -0
  199. crowdypy-0.4.0.dev1/src/crowdypy/_operation.py +31 -0
  200. crowdypy-0.4.0.dev1/src/crowdypy/_sync/__init__.py +1 -0
  201. crowdypy-0.4.0.dev1/src/crowdypy/_sync/client.py +320 -0
  202. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/__init__.py +2 -0
  203. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/_base.py +49 -0
  204. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/actors.py +129 -0
  205. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/admin.py +70 -0
  206. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/app_access.py +222 -0
  207. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/apps.py +290 -0
  208. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/auth.py +357 -0
  209. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/avatars.py +99 -0
  210. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/billing.py +93 -0
  211. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/channels.py +218 -0
  212. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/chunks.py +105 -0
  213. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/crowdy_studio.py +884 -0
  214. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/crowdy_studio_agent.py +177 -0
  215. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/crowdy_studio_github.py +275 -0
  216. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/discovery.py +65 -0
  217. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/exec.py +989 -0
  218. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/game_apps.py +176 -0
  219. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/grids.py +49 -0
  220. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/host.py +43 -0
  221. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/marketplace.py +234 -0
  222. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/organizations.py +174 -0
  223. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/payments.py +68 -0
  224. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/platform.py +47 -0
  225. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/player_wallet.py +211 -0
  226. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/portal.py +352 -0
  227. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/quotas.py +86 -0
  228. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/server_status.py +42 -0
  229. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/shared_environment.py +248 -0
  230. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/state.py +54 -0
  231. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/teams.py +213 -0
  232. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/teleport.py +33 -0
  233. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/udp.py +371 -0
  234. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/usage.py +122 -0
  235. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/users.py +45 -0
  236. crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/voxels.py +141 -0
  237. crowdypy-0.4.0.dev1/src/crowdypy/_sync/graphql.py +216 -0
  238. crowdypy-0.4.0.dev1/src/crowdypy/_sync/grid_scope.py +166 -0
  239. crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/__init__.py +102 -0
  240. crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/actions.py +76 -0
  241. crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/kit.py +36 -0
  242. crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/social.py +235 -0
  243. crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/wire.py +292 -0
  244. crowdypy-0.4.0.dev1/src/crowdypy/_sync/rediscover.py +132 -0
  245. crowdypy-0.4.0.dev1/src/crowdypy/_sync/stores.py +1283 -0
  246. crowdypy-0.4.0.dev1/src/crowdypy/_sync/world.py +161 -0
  247. crowdypy-0.4.0.dev1/src/crowdypy/_version.py +3 -0
  248. crowdypy-0.4.0.dev1/src/crowdypy/auth_state.py +21 -0
  249. crowdypy-0.4.0.dev1/src/crowdypy/client.py +319 -0
  250. crowdypy-0.4.0.dev1/src/crowdypy/codecs.py +186 -0
  251. crowdypy-0.4.0.dev1/src/crowdypy/datacenter_redirect.py +51 -0
  252. crowdypy-0.4.0.dev1/src/crowdypy/domains/__init__.py +1 -0
  253. crowdypy-0.4.0.dev1/src/crowdypy/domains/_base.py +48 -0
  254. crowdypy-0.4.0.dev1/src/crowdypy/domains/actors.py +128 -0
  255. crowdypy-0.4.0.dev1/src/crowdypy/domains/admin.py +69 -0
  256. crowdypy-0.4.0.dev1/src/crowdypy/domains/app_access.py +221 -0
  257. crowdypy-0.4.0.dev1/src/crowdypy/domains/apps.py +299 -0
  258. crowdypy-0.4.0.dev1/src/crowdypy/domains/auth.py +376 -0
  259. crowdypy-0.4.0.dev1/src/crowdypy/domains/avatars.py +98 -0
  260. crowdypy-0.4.0.dev1/src/crowdypy/domains/billing.py +92 -0
  261. crowdypy-0.4.0.dev1/src/crowdypy/domains/channels.py +217 -0
  262. crowdypy-0.4.0.dev1/src/crowdypy/domains/chunks.py +104 -0
  263. crowdypy-0.4.0.dev1/src/crowdypy/domains/crowdy_studio.py +996 -0
  264. crowdypy-0.4.0.dev1/src/crowdypy/domains/crowdy_studio_agent.py +176 -0
  265. crowdypy-0.4.0.dev1/src/crowdypy/domains/crowdy_studio_github.py +327 -0
  266. crowdypy-0.4.0.dev1/src/crowdypy/domains/discovery.py +74 -0
  267. crowdypy-0.4.0.dev1/src/crowdypy/domains/exec.py +1309 -0
  268. crowdypy-0.4.0.dev1/src/crowdypy/domains/game_apps.py +175 -0
  269. crowdypy-0.4.0.dev1/src/crowdypy/domains/grids.py +48 -0
  270. crowdypy-0.4.0.dev1/src/crowdypy/domains/host.py +42 -0
  271. crowdypy-0.4.0.dev1/src/crowdypy/domains/marketplace.py +233 -0
  272. crowdypy-0.4.0.dev1/src/crowdypy/domains/organizations.py +173 -0
  273. crowdypy-0.4.0.dev1/src/crowdypy/domains/payments.py +67 -0
  274. crowdypy-0.4.0.dev1/src/crowdypy/domains/platform.py +46 -0
  275. crowdypy-0.4.0.dev1/src/crowdypy/domains/player_wallet.py +210 -0
  276. crowdypy-0.4.0.dev1/src/crowdypy/domains/portal.py +414 -0
  277. crowdypy-0.4.0.dev1/src/crowdypy/domains/quotas.py +85 -0
  278. crowdypy-0.4.0.dev1/src/crowdypy/domains/server_status.py +41 -0
  279. crowdypy-0.4.0.dev1/src/crowdypy/domains/shared_environment.py +247 -0
  280. crowdypy-0.4.0.dev1/src/crowdypy/domains/state.py +53 -0
  281. crowdypy-0.4.0.dev1/src/crowdypy/domains/teams.py +212 -0
  282. crowdypy-0.4.0.dev1/src/crowdypy/domains/teleport.py +32 -0
  283. crowdypy-0.4.0.dev1/src/crowdypy/domains/udp.py +377 -0
  284. crowdypy-0.4.0.dev1/src/crowdypy/domains/usage.py +121 -0
  285. crowdypy-0.4.0.dev1/src/crowdypy/domains/users.py +44 -0
  286. crowdypy-0.4.0.dev1/src/crowdypy/domains/voxels.py +140 -0
  287. crowdypy-0.4.0.dev1/src/crowdypy/enums.py +4 -0
  288. crowdypy-0.4.0.dev1/src/crowdypy/errors.py +249 -0
  289. crowdypy-0.4.0.dev1/src/crowdypy/estate.py +41 -0
  290. crowdypy-0.4.0.dev1/src/crowdypy/exec_gateway.py +772 -0
  291. crowdypy-0.4.0.dev1/src/crowdypy/graphql.py +215 -0
  292. crowdypy-0.4.0.dev1/src/crowdypy/grid_scope.py +165 -0
  293. crowdypy-0.4.0.dev1/src/crowdypy/inputs.py +9 -0
  294. crowdypy-0.4.0.dev1/src/crowdypy/kit/__init__.py +101 -0
  295. crowdypy-0.4.0.dev1/src/crowdypy/kit/actions.py +81 -0
  296. crowdypy-0.4.0.dev1/src/crowdypy/kit/kit.py +35 -0
  297. crowdypy-0.4.0.dev1/src/crowdypy/kit/social.py +244 -0
  298. crowdypy-0.4.0.dev1/src/crowdypy/kit/wire.py +378 -0
  299. crowdypy-0.4.0.dev1/src/crowdypy/lb_cookie.py +34 -0
  300. crowdypy-0.4.0.dev1/src/crowdypy/media.py +140 -0
  301. crowdypy-0.4.0.dev1/src/crowdypy/pkce.py +34 -0
  302. crowdypy-0.4.0.dev1/src/crowdypy/player_host/__init__.py +95 -0
  303. crowdypy-0.4.0.dev1/src/crowdypy/player_host/agent_errors.py +247 -0
  304. crowdypy-0.4.0.dev1/src/crowdypy/player_host/agent_types.py +51 -0
  305. crowdypy-0.4.0.dev1/src/crowdypy/player_host/json_schema.py +514 -0
  306. crowdypy-0.4.0.dev1/src/crowdypy/player_host/schemas.py +39 -0
  307. crowdypy-0.4.0.dev1/src/crowdypy/player_host/schemas.v1.json +2199 -0
  308. crowdypy-0.4.0.dev1/src/crowdypy/player_host/types.py +226 -0
  309. crowdypy-0.4.0.dev1/src/crowdypy/py.typed +0 -0
  310. crowdypy-0.4.0.dev1/src/crowdypy/rediscover.py +136 -0
  311. crowdypy-0.4.0.dev1/src/crowdypy/replication.py +1020 -0
  312. crowdypy-0.4.0.dev1/src/crowdypy/session.py +154 -0
  313. crowdypy-0.4.0.dev1/src/crowdypy/stores.py +1411 -0
  314. crowdypy-0.4.0.dev1/src/crowdypy/studio/__init__.py +100 -0
  315. crowdypy-0.4.0.dev1/src/crowdypy/studio/client_tick_interval.py +30 -0
  316. crowdypy-0.4.0.dev1/src/crowdypy/studio/controller.py +2182 -0
  317. crowdypy-0.4.0.dev1/src/crowdypy/studio/diagnostics.py +206 -0
  318. crowdypy-0.4.0.dev1/src/crowdypy/studio/github_new_repo.py +59 -0
  319. crowdypy-0.4.0.dev1/src/crowdypy/studio/layout.py +162 -0
  320. crowdypy-0.4.0.dev1/src/crowdypy/studio/models.py +220 -0
  321. crowdypy-0.4.0.dev1/src/crowdypy/studio/starter_projects.py +170 -0
  322. crowdypy-0.4.0.dev1/src/crowdypy/subscriptions.py +204 -0
  323. crowdypy-0.4.0.dev1/src/crowdypy/sync.py +10 -0
  324. crowdypy-0.4.0.dev1/src/crowdypy/utils.py +75 -0
  325. crowdypy-0.4.0.dev1/src/crowdypy/wire.py +293 -0
  326. crowdypy-0.4.0.dev1/src/crowdypy/world.py +160 -0
  327. crowdypy-0.4.0.dev1/tests/conftest.py +93 -0
  328. crowdypy-0.4.0.dev1/tests/e2e/__init__.py +0 -0
  329. crowdypy-0.4.0.dev1/tests/e2e/conftest.py +239 -0
  330. crowdypy-0.4.0.dev1/tests/e2e/test_e2e_identity.py +43 -0
  331. crowdypy-0.4.0.dev1/tests/e2e/test_e2e_replication.py +77 -0
  332. crowdypy-0.4.0.dev1/tests/e2e/test_e2e_studio.py +49 -0
  333. crowdypy-0.4.0.dev1/tests/e2e/test_e2e_world.py +50 -0
  334. crowdypy-0.4.0.dev1/tests/e2e/test_e2e_world_data.py +27 -0
  335. crowdypy-0.4.0.dev1/tests/fixtures/README.md +16 -0
  336. crowdypy-0.4.0.dev1/tests/fixtures/binary-wire-fixtures.json +385 -0
  337. crowdypy-0.4.0.dev1/tests/fixtures/exec-client-frames.json +133 -0
  338. crowdypy-0.4.0.dev1/tests/fixtures/player-host.v1.json +9525 -0
  339. crowdypy-0.4.0.dev1/tests/unit/__init__.py +0 -0
  340. crowdypy-0.4.0.dev1/tests/unit/domains/__init__.py +0 -0
  341. crowdypy-0.4.0.dev1/tests/unit/domains/test_crowdycpp_roots.py +240 -0
  342. crowdypy-0.4.0.dev1/tests/unit/domains/test_org_domains.py +1096 -0
  343. crowdypy-0.4.0.dev1/tests/unit/domains/test_social_domains.py +584 -0
  344. crowdypy-0.4.0.dev1/tests/unit/domains/test_studio_exec_domains.py +1907 -0
  345. crowdypy-0.4.0.dev1/tests/unit/domains/test_world_domains.py +518 -0
  346. crowdypy-0.4.0.dev1/tests/unit/test_core.py +130 -0
  347. crowdypy-0.4.0.dev1/tests/unit/test_durable_stores.py +200 -0
  348. crowdypy-0.4.0.dev1/tests/unit/test_estate_moves.py +91 -0
  349. crowdypy-0.4.0.dev1/tests/unit/test_exec_gateway.py +233 -0
  350. crowdypy-0.4.0.dev1/tests/unit/test_fixture_provenance.py +61 -0
  351. crowdypy-0.4.0.dev1/tests/unit/test_grid_scope.py +112 -0
  352. crowdypy-0.4.0.dev1/tests/unit/test_kit.py +145 -0
  353. crowdypy-0.4.0.dev1/tests/unit/test_lazy_exports.py +71 -0
  354. crowdypy-0.4.0.dev1/tests/unit/test_player_host.py +120 -0
  355. crowdypy-0.4.0.dev1/tests/unit/test_release_versions.py +63 -0
  356. crowdypy-0.4.0.dev1/tests/unit/test_replication.py +372 -0
  357. crowdypy-0.4.0.dev1/tests/unit/test_sdk_audience.py +172 -0
  358. crowdypy-0.4.0.dev1/tests/unit/test_studio_controller.py +755 -0
  359. crowdypy-0.4.0.dev1/tests/unit/test_studio_diagnostics.py +42 -0
  360. crowdypy-0.4.0.dev1/tests/unit/test_studio_layout.py +82 -0
  361. crowdypy-0.4.0.dev1/tests/unit/test_subscriptions.py +93 -0
  362. crowdypy-0.4.0.dev1/tests/unit/test_transport.py +240 -0
  363. crowdypy-0.4.0.dev1/tests/unit/test_udp_api.py +275 -0
  364. crowdypy-0.4.0.dev1/tests/unit/test_wire.py +294 -0
  365. crowdypy-0.4.0.dev1/tests/unit/test_world_session.py +280 -0
  366. crowdypy-0.4.0.dev1/tools/e2e/provision.py +87 -0
  367. crowdypy-0.4.0.dev1/tools/fixtures/player_host.mjs +220 -0
  368. crowdypy-0.4.0.dev1/tools/parity/classifications.toml +175 -0
  369. crowdypy-0.4.0.dev1/tools/parity/parity.py +483 -0
  370. crowdypy-0.4.0.dev1/uv.lock +911 -0
  371. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/CMakeLists.txt +388 -0
  372. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/LICENSE +21 -0
  373. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/PROVENANCE.md +8 -0
  374. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/cmake/CheckPublicHeaders.cmake +34 -0
  375. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/cmake/CrowdyCPPConfig.cmake.in +15 -0
  376. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/cmake/studio_layout_fixture.hpp.in +10 -0
  377. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/client.hpp +399 -0
  378. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/base64.hpp +21 -0
  379. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/bytes.hpp +101 -0
  380. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/clock.hpp +25 -0
  381. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/crypto.hpp +86 -0
  382. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/logger.hpp +22 -0
  383. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/result.hpp +80 -0
  384. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/spsc.hpp +57 -0
  385. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/uuid.hpp +29 -0
  386. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/crowdy.hpp +33 -0
  387. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/default_origin.hpp +31 -0
  388. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/admin.hpp +1029 -0
  389. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/auth.hpp +518 -0
  390. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio.hpp +1154 -0
  391. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_agent.hpp +154 -0
  392. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_github.hpp +221 -0
  393. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/discovery.hpp +103 -0
  394. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/domain_base.hpp +106 -0
  395. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/exec.hpp +574 -0
  396. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/game_apps.hpp +207 -0
  397. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/grids.hpp +87 -0
  398. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/groups.hpp +502 -0
  399. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/marketplace.hpp +201 -0
  400. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/player_wallet.hpp +183 -0
  401. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/portal.hpp +434 -0
  402. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/realtime_control.hpp +98 -0
  403. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/server_status.hpp +81 -0
  404. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/types.hpp +173 -0
  405. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/users.hpp +83 -0
  406. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/world_data.hpp +599 -0
  407. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/generated/enums.hpp +1283 -0
  408. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/generated/operations.hpp +9629 -0
  409. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/async_scope.hpp +45 -0
  410. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/auth_state.hpp +133 -0
  411. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/datacenter_redirect.hpp +68 -0
  412. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/dispatcher.hpp +72 -0
  413. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/errors.hpp +162 -0
  414. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/estate.hpp +94 -0
  415. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/graphql_client.hpp +182 -0
  416. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/http.hpp +93 -0
  417. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/json.hpp +160 -0
  418. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/rediscover.hpp +94 -0
  419. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/subscription_client.hpp +205 -0
  420. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/websocket.hpp +117 -0
  421. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/actions.hpp +102 -0
  422. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +48 -0
  423. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/social.hpp +319 -0
  424. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/wire.hpp +376 -0
  425. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/media/video_frames.hpp +258 -0
  426. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/player_host/adapter.hpp +133 -0
  427. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/player_host/player_host.hpp +10 -0
  428. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/player_host/schemas.hpp +94 -0
  429. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/player_host/types.hpp +525 -0
  430. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/replication/connection.hpp +427 -0
  431. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/replication/session_provider.hpp +41 -0
  432. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/replication/types.hpp +201 -0
  433. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/replication/udp_socket.hpp +70 -0
  434. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/chunk_store.hpp +347 -0
  435. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/codec.hpp +73 -0
  436. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/durable.hpp +268 -0
  437. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/keys.hpp +71 -0
  438. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/stores.hpp +801 -0
  439. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/world_session.hpp +152 -0
  440. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/controller.hpp +2089 -0
  441. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/diagnostics.hpp +95 -0
  442. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/editor.hpp +115 -0
  443. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/github.hpp +105 -0
  444. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/github_layout.hpp +99 -0
  445. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/integration.hpp +144 -0
  446. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/layout.hpp +369 -0
  447. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/models.hpp +685 -0
  448. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/runtime.hpp +597 -0
  449. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/wire/codec.hpp +499 -0
  450. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/wire/protocol.hpp +216 -0
  451. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/world.hpp +93 -0
  452. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/package.json +36 -0
  453. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/client.cpp +841 -0
  454. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/base64.cpp +72 -0
  455. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/clock.cpp +70 -0
  456. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/crypto_default_unavailable.cpp +9 -0
  457. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/crypto_openssl.cpp +142 -0
  458. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/crypto_unavailable.cpp +32 -0
  459. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/logger.cpp +38 -0
  460. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/uuid.cpp +33 -0
  461. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/domains/exec.cpp +1702 -0
  462. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/async_transport.cpp +135 -0
  463. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/auth_state.cpp +59 -0
  464. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/error_extensions.hpp +57 -0
  465. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/errors.cpp +3 -0
  466. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/graphql_client.cpp +314 -0
  467. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/http_curl.cpp +127 -0
  468. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/http_none.cpp +7 -0
  469. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/json.cpp +535 -0
  470. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/subscription_client.cpp +1397 -0
  471. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/websocket_curl.cpp +606 -0
  472. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/websocket_none.cpp +11 -0
  473. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/player_host/schemas.cpp +477 -0
  474. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/player_host/types.cpp +148 -0
  475. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/replication/connection.cpp +870 -0
  476. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/replication/socket_errors.hpp +34 -0
  477. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/replication/udp_socket.cpp +288 -0
  478. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/session/world_session.cpp +377 -0
  479. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/studio/diagnostics.cpp +412 -0
  480. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/studio/editor.cpp +243 -0
  481. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/studio/integration.cpp +142 -0
  482. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/third_party/yyjson/LICENSE +21 -0
  483. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/third_party/yyjson/yyjson.c +9568 -0
  484. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/third_party/yyjson/yyjson.h +7942 -0
  485. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/tools/parity/fixtures/crowdy-studio-diagnostics.v1.json +83 -0
  486. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/tools/parity/fixtures/crowdyjs-studio-layout.v1.json +206 -0
  487. crowdypy-0.4.0.dev1/vendor/CrowdyCPP/tools/parity/fixtures/exec-client-frames.json +133 -0
@@ -0,0 +1,8 @@
1
+ # Normalise line endings to LF in the repository and in every working tree,
2
+ # including Windows checkouts where core.autocrlf defaults to true.
3
+ #
4
+ # Load-bearing, not cosmetic: scripts/codegen.py stamps the generated modules with
5
+ # a sha256 over the raw bytes of schema.gql and operations/**, and the vendored
6
+ # CrowdyCPP tree is checked against a hash of its bytes. A CRLF working tree
7
+ # produces fingerprints no other platform can reproduce.
8
+ * text=auto eol=lf
@@ -0,0 +1,26 @@
1
+ build/
2
+ build-*/
3
+ dist/
4
+ wheelhouse/
5
+ *.egg-info/
6
+ __pycache__/
7
+ *.py[cod]
8
+ .pytest_cache/
9
+ .mypy_cache/
10
+ .ruff_cache/
11
+ .hypothesis/
12
+ .venv/
13
+ .coverage
14
+ coverage.xml
15
+ htmlcov/
16
+ *.so
17
+ *.pyd
18
+ *.dylib
19
+ *.dll
20
+ node_modules/
21
+ .cache/
22
+ compile_commands.json
23
+ CMakeUserPresets.json
24
+ .vscode/
25
+ .idea/
26
+ .env
@@ -0,0 +1,27 @@
1
+ # gitleaks configuration: the default ruleset plus an allowlist for the classes
2
+ # of string that are not secrets in this codebase. Same shape as the other SDKs'
3
+ # (2026-09-08). A NEW allowlist entry is a reviewed decision -- say in the PR why
4
+ # the string cannot be a live credential.
5
+ [extend]
6
+ useDefault = true
7
+
8
+ [allowlist]
9
+ description = "Test fixtures, generated output, vendored sources, and benchmark tokens"
10
+ paths = [
11
+ # Specs and fixtures: fake tokens with the right shape are the point of them.
12
+ '''(^|/)test_[^/]*\.py$''',
13
+ '''\.(spec|test)\.(ts|tsx|mts|mjs|js|cpp|sh)$''',
14
+ '''(^|/)(test|tests|__tests__|fixtures)/''',
15
+ # Benchmarks sign with a fixed, obviously fake 64-octet token.
16
+ '''(^|/)benchmarks/''',
17
+ # Generated / vendored output that is never a place a credential is written.
18
+ '''(^|/)dist/''',
19
+ '''(^|/)wheelhouse/''',
20
+ '''(^|/)vendor/''',
21
+ # Documented placeholders.
22
+ '''(^|/)example\.env$''',
23
+ ]
24
+ regexes = [
25
+ # Tailscale addresses are not secrets.
26
+ '''\b100\.(6[4-9]|[7-9][0-9]|1[01][0-9]|12[0-7])\.[0-9]{1,3}\.[0-9]{1,3}\b''',
27
+ ]
@@ -0,0 +1,145 @@
1
+ # CrowdyPy agent guidance
2
+
3
+ CrowdyPy is the public Python SDK for Crowded Kingdoms. Its API surface follows CrowdyJS
4
+ (the flagship) the way CrowdyCPP does; its replication hot path is CrowdyCPP's native core,
5
+ vendored and bound with nanobind. Trust the code over this file when they disagree, then fix
6
+ this file.
7
+
8
+ ## Branches and tiers
9
+
10
+ GitHub default is **`prod`**. Work lands on `dev` through a pull request; `test` and `prod`
11
+ take merge-forward promotions (`dev` -> `test` -> `prod`) that an admin merges. Nobody can
12
+ push to the three branches directly, the admin included (`GH013: Repository rule violations
13
+ found` is the rule working). Dependabot targets `dev`.
14
+
15
+ **TIER ALIGNMENT (hard rule).** A CrowdyPy branch may only pin CrowdyJS and CrowdyCPP
16
+ commits that exist on the **same** tier branch of those repos (`dev`<->`dev`,
17
+ `test`<->`test`, `prod`<->`prod`). `scripts/ci/check_pin_tiers.py --from-ref` enforces it
18
+ in CI against the pull request's base. A promotion of CrowdyPy therefore waits for CrowdyJS
19
+ and then CrowdyCPP to reach that tier with the pinned commits.
20
+
21
+ **Identity surface.** A PR that touches the paths CODEOWNERS lists under `src/crowdypy/`
22
+ (auth, portal, pkce, session, auth_state, and their generated `_sync` twins) runs the Cursor
23
+ `security-review` subagent first, and the PR body carries its findings.
24
+
25
+ **Public repository.** Nothing internal goes in: no internal repository names, hostnames,
26
+ ports or environment variables. `scripts/ci/check_content_policy.py` scans the tree and the
27
+ built wheels and sdist against a denylist. Of the replication server, only the wire format
28
+ and the client authentication sequence are public.
29
+
30
+ ## Layout
31
+
32
+ | Path | What it is | Edit? |
33
+ |---|---|---|
34
+ | `src/crowdypy/` | the async source: client, transport, domains, replication, World Stores, kit, exec gateway, subscriptions | yes |
35
+ | `src/crowdypy/studio/` | headless Crowdy Studio; asyncio only, so `scripts/unasync.py` leaves it out | yes |
36
+ | `src/crowdypy/player_host/` | player-host observation; `schemas.v1.json` in it is CrowdyJS's, from `tools/fixtures/player_host.mjs` | yes, not the JSON |
37
+ | `src/crowdypy/_sync/` | the blocking client, generated by `scripts/unasync.py` | never |
38
+ | `src/crowdypy/_generated/` | operations, enums and input structs, from `scripts/codegen.py` | never |
39
+ | `src/crowdypy/_default_origin.py` | the tier's default API origin (below) | never |
40
+ | `native/` | the nanobind extension `crowdypy._native` | yes |
41
+ | `vendor/CrowdyCPP/` | the pinned CrowdyCPP subset, `scripts/vendor_crowdycpp.py` | never |
42
+ | `schema.gql`, `operations/` | CrowdyJS's, at the pin, `scripts/schema_sync.py` | never |
43
+ | `tools/parity/` | the parity gate and its reviewed classifications | classifications |
44
+ | `tests/fixtures/` | shared fixtures copied from CrowdyJS at the pin, and `player-host.v1.json` (CrowdyJS's verdicts, from `tools/fixtures/player_host.mjs`) | never |
45
+
46
+ ## Pins
47
+
48
+ `pyproject.toml` records everything this tree was made against: `[tool.crowdypy.crowdyjs]`
49
+ (version and commit), `[tool.crowdypy.crowdycpp]` (version, tag, commit and the sha256 of
50
+ the vendored tree), `[tool.crowdypy.graphql]` (hashes of `schema.gql` and `operations/`) and
51
+ `[tool.crowdypy.published-sdl]`. CI re-derives each from the pinned commit, so a hand edit
52
+ anywhere downstream of a pin fails.
53
+
54
+ Moving the CrowdyJS pin (it must be on the same tier branch):
55
+
56
+ ```bash
57
+ python scripts/schema_sync.py --crowdyjs ../CrowdyJS --ref <commit> # schema, operations, pin
58
+ python scripts/codegen.py && python scripts/unasync.py
59
+ python tools/parity/parity.py --crowdyjs ../CrowdyJS --write docs/parity-matrix.md --strict
60
+ ```
61
+
62
+ then port what changed, refresh `tests/fixtures/` from the same commit, and classify or
63
+ cover every new difference. Build CrowdyJS at the new pin (`npm ci && npm run build`) and run
64
+ `node tools/fixtures/player_host.mjs ../CrowdyJS`: it rewrites the player-host schemas and
65
+ their fixture, and `tests/unit/test_player_host.py` refuses either one from another commit. Moving the CrowdyCPP pin:
66
+
67
+ ```bash
68
+ python scripts/vendor_crowdycpp.py --crowdycpp ../CrowdyCPP --ref <tier>/vX.Y.Z
69
+ ```
70
+
71
+ CrowdyCPP's own CrowdyJS pin must equal CrowdyPy's (`--check` refuses otherwise).
72
+
73
+ ## The default origin
74
+
75
+ `src/crowdypy/_default_origin.py` is generated per tier by the operator tooling and never
76
+ hand-edited: `dev` declares `dev`, `test` declares `test`, `prod` declares `prod`, so a
77
+ client built with no origin dials the tier its wheel was released for. **A promotion can
78
+ rewrite this file with no conflict and no mention**: git resolves a one-sided change
79
+ silently, so a clean `dev` -> `test` merge can carry `dev` onto `test`. Regenerate it for
80
+ the destination tier after every promotion. CI's `scripts/ci/assert_default_origin.py
81
+ --from-ref` judges the pull request base, the release guard judges the tag's tier, and the
82
+ release re-reads the published wheel.
83
+
84
+ ## Gates
85
+
86
+ CI (`.github/workflows/ci.yml`) runs all of these; run them before pushing:
87
+
88
+ ```bash
89
+ ruff check . && ruff format --check . && mypy
90
+ pytest tests/unit
91
+ python scripts/vendor_crowdycpp.py --check
92
+ python scripts/schema_sync.py --check
93
+ python scripts/codegen.py --check
94
+ python scripts/unasync.py --check
95
+ python tools/parity/parity.py --crowdyjs ../CrowdyJS --check docs/parity-matrix.md --strict
96
+ python scripts/ci/check_content_policy.py
97
+ python scripts/ci/check_pin_tiers.py --crowdyjs ../CrowdyJS --crowdycpp ../CrowdyCPP --tier dev
98
+ ```
99
+
100
+ The parity gate is **strict** (since 0.4.0): every difference from CrowdyJS carries a
101
+ reviewed classification (`native-equivalent` or `browser-exclusion`), a stale or missing one
102
+ fails, and a `portable-gap` fails the build. Something new in CrowdyJS that CrowdyPy lacks is
103
+ ported in the same change that moves the pin; it is not parked as a gap.
104
+
105
+ ## Live e2e
106
+
107
+ `tests/e2e/` holds black-box suites over the `CROWDY_E2E_*` variables CrowdyCPP's suites read;
108
+ unconfigured they skip. Run them against the local stack and then the dev tier before a
109
+ release moves on, and record the run in `docs/e2e-coverage.md` (configuration, the
110
+ `tools/e2e/provision.py` helper and where each tier's org admin credentials live are there).
111
+
112
+ ## Releasing
113
+
114
+ The version lives in six places that `tests/unit/test_release_versions.py` holds together:
115
+ `[project].version`, `src/crowdypy/_version.py`, `uv.lock` (run `uv lock`), the README's
116
+ first `**vX.Y.Z` line, the first `## X.Y.Z` heading of `MIGRATION.md`, and
117
+ `docs/compatibility.md`. The branch always carries the bare `X.Y.Z`.
118
+
119
+ Merge to the tier branch, then tag the merge commit: `git tag -a dev/vX.Y.Z -m "CrowdyPy dev
120
+ vX.Y.Z" && git push origin dev/vX.Y.Z`. `release.yml` refuses a tag outside the branch it
121
+ names, a tag that is not the tree's version, and a default origin for another tier; then it
122
+ builds every wheel and the sdist, scans them, publishes `X.Y.Z.devN` (dev), `X.Y.ZrcN` (test)
123
+ or `X.Y.Z` (prod) to PyPI by trusted publishing, downloads the published wheel back to read
124
+ its origin again, and creates the GitHub release with the same files. PyPI publishing runs
125
+ only when the repository variable `PYPI_PUBLISHING` is `enabled`, which the operator sets
126
+ once the PyPI trusted publisher (workflow `release.yml`, environment `pypi`) is registered.
127
+
128
+ Merging a PR from the command line: `gh pr merge` fails its preflight on this org, so use
129
+ `gh api -X PUT repos/CrowdedKingdoms/CrowdyPy/pulls/<n>/merge -f merge_method=merge`.
130
+
131
+ ## Performance rules for the native binding
132
+
133
+ The replication system saturates the local network stack, so the binding
134
+ (`native/replication_binding.cpp`, `src/crowdypy/replication.py`) is held to these:
135
+
136
+ - No Python runs per datagram: receive, HMAC verify, decode and queueing stay in CrowdyCPP's
137
+ thread, and Python receives batches.
138
+ - The network thread never takes the GIL. Anything it needs from Python (assignment, token
139
+ refresh) is requested through a queue another thread serves, and it waits on a native
140
+ condition, not on the interpreter.
141
+ - Sends are batched, and the GIL is released while a batch is encoded and sent.
142
+ - An asyncio loop is woken through `Config::onEventsReady` and a socket pair, never by a
143
+ sleep-poll.
144
+ - Every change to the hot path reruns `benchmarks/bench_replication.py` and CrowdyCPP's
145
+ `bench_send` on the same machine, and updates `benchmarks/README.md`.
@@ -0,0 +1,78 @@
1
+ cmake_minimum_required(VERSION 3.22...4.2)
2
+ project(crowdypy LANGUAGES C CXX)
3
+
4
+ if(NOT SKBUILD)
5
+ message(WARNING
6
+ "CrowdyPy's extension is built by scikit-build-core: run `pip install .` or "
7
+ "`uv sync` rather than configuring this directory by hand.")
8
+ endif()
9
+
10
+ set(CMAKE_CXX_STANDARD 20)
11
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
12
+ set(CMAKE_CXX_EXTENSIONS OFF)
13
+ # CrowdyCPP's static libraries are linked into a shared Python module.
14
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
15
+ set(CMAKE_CXX_VISIBILITY_PRESET hidden)
16
+ set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
17
+
18
+ find_package(Python 3.12 REQUIRED
19
+ COMPONENTS Interpreter Development.Module ${SKBUILD_SABI_COMPONENT})
20
+ find_package(nanobind CONFIG REQUIRED)
21
+
22
+ # A release wheel carries its own libcrypto: a user's system or Python may ship any OpenSSL
23
+ # (or none), and the replication core signs every datagram with it. Release builds point
24
+ # OPENSSL_ROOT_DIR at scripts/ci/build_openssl.sh's prefix (vcpkg on Windows); a source
25
+ # build without one links the system's shared libcrypto, because a distribution's static
26
+ # libcrypto drags in whatever that distribution compiled into it.
27
+ if(DEFINED OPENSSL_ROOT_DIR OR DEFINED ENV{OPENSSL_ROOT_DIR})
28
+ set(_crowdypy_static_default ON)
29
+ else()
30
+ set(_crowdypy_static_default OFF)
31
+ endif()
32
+ option(CROWDYPY_STATIC_OPENSSL "Link libcrypto statically" ${_crowdypy_static_default})
33
+ if(CROWDYPY_STATIC_OPENSSL)
34
+ set(OPENSSL_USE_STATIC_LIBS TRUE)
35
+ if(MSVC)
36
+ set(OPENSSL_MSVC_STATIC_RT FALSE)
37
+ endif()
38
+ # FindOpenSSL asks pkg-config for a static libcrypto's private dependencies; make it ask
39
+ # the chosen prefix rather than the system's openssl.pc.
40
+ if(DEFINED ENV{OPENSSL_ROOT_DIR})
41
+ set(ENV{PKG_CONFIG_PATH} "$ENV{OPENSSL_ROOT_DIR}/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}")
42
+ elseif(DEFINED OPENSSL_ROOT_DIR)
43
+ set(ENV{PKG_CONFIG_PATH} "${OPENSSL_ROOT_DIR}/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}")
44
+ endif()
45
+ endif()
46
+ message(STATUS "CrowdyPy: static libcrypto: ${CROWDYPY_STATIC_OPENSSL}")
47
+ # Found here rather than only inside the vendored tree: imported targets are scoped to the
48
+ # directory that created them, and the module below links OpenSSL::Crypto directly.
49
+ find_package(OpenSSL REQUIRED COMPONENTS Crypto)
50
+
51
+ add_subdirectory(vendor/CrowdyCPP EXCLUDE_FROM_ALL)
52
+ get_directory_property(CROWDYCPP_VERSION DIRECTORY vendor/CrowdyCPP DEFINITION CrowdyCPP_VERSION)
53
+
54
+ nanobind_add_module(_native
55
+ STABLE_ABI
56
+ FREE_THREADED
57
+ NB_STATIC
58
+ LTO
59
+ native/module.cpp
60
+ native/replication_binding.cpp
61
+ native/session_binding.cpp
62
+ native/wire_binding.cpp
63
+ )
64
+ target_include_directories(_native PRIVATE native)
65
+ target_link_libraries(_native PRIVATE crowdy crowdy_replication crowdy_crypto_openssl OpenSSL::Crypto)
66
+ if(WIN32)
67
+ target_link_libraries(_native PRIVATE ws2_32)
68
+ endif()
69
+ target_compile_definitions(_native PRIVATE
70
+ CROWDYPY_CROWDYCPP_VERSION="${CROWDYCPP_VERSION}")
71
+
72
+ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
73
+ # A statically linked libcrypto must not export its symbols from the module: CPython's
74
+ # own _ssl/_hashlib load a shared libcrypto, and an exported copy here could interpose.
75
+ target_link_options(_native PRIVATE "LINKER:--exclude-libs,ALL")
76
+ endif()
77
+
78
+ install(TARGETS _native LIBRARY DESTINATION crowdypy COMPONENT python)
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Crowded Kingdoms
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,178 @@
1
+ # Migration notes
2
+
3
+ CrowdyPy is pre-1.0. Within a minor line, patch releases keep source compatibility; each
4
+ new minor may change the API. Read the section for every minor you skip.
5
+
6
+ ## 0.4.0
7
+
8
+ Headless Crowdy Studio and full CrowdyJS parity. Additive; still CrowdyJS 18.0.4 and
9
+ CrowdyCPP 0.54.0.
10
+
11
+ - **`crowdypy.studio`.**
12
+ - `CrowdyStudioController` is CrowdyJS's controller on asyncio, and
13
+ `CrowdyStudioController.for_client(client, app_id=, grid_id=)` builds one over a
14
+ client.
15
+ - Its state is an immutable `CrowdyStudioState`, replaced on every change; `subscribe`
16
+ to follow it. Autosave, retries and the polled surfaces are timers on the running
17
+ loop.
18
+ - A CLIENT target runs in the `broker_factory` you pass: a host for the attached CLIENT
19
+ half. Without one, a CLIENT run fails with a message saying so.
20
+ - A cancelled agent operation raises `CrowdyStudioError`, the module's error class.
21
+ - **Studio helpers.**
22
+ - `StudioLayoutController` persists CrowdyJS's layout JSON.
23
+ - `parse_rustc_diagnostics` parses build logs.
24
+ - `create_crowdy_studio_starter_project`, `github_new_repository_url` and
25
+ `parse_client_tick_interval_ms` port their CrowdyJS namesakes.
26
+ - `canonical_json`, `digest_canonical_json` and `project_content_hash` compute the
27
+ approval digests CrowdyJS computes.
28
+ - **The roots CrowdyCPP sends and CrowdyJS does not:**
29
+ - `AuthAPI.confirm_email` and `resend_confirmation_email`;
30
+ - `UsageAPI.org_summary`, `app_projection` and `org_projection`;
31
+ - `AppsAPI.compute_budget`, `set_compute_budget` and `clear_compute_budget`;
32
+ - `MarketplaceAPI.app_listing_versions`;
33
+ - CrowdyCPP's narrow `CrowdyStudioAPI` mutations: `save_project_metadata` (fields
34
+ left `UNCHANGED` keep their value), `save_project_files`, `set_project_archived`,
35
+ `set_personal_library_file_archived` and `publish_common_file`;
36
+ - the new `client.crowdy_studio_agent` (`CrowdyStudioAgentAPI`): provider consent,
37
+ model usage and the agent policy.
38
+ - **`crowdypy.player_host`.** The typed observation contract a game implements so tooling
39
+ can read the player it controls:
40
+ - `PlayerHostAdapterV1` and the observation, capability and command types;
41
+ - CrowdyJS's schemas for them, generated verbatim from CrowdyJS;
42
+ - `validate_json_schema_value` and `assert_bounded_json_schema`, which give CrowdyJS's
43
+ verdict on every value;
44
+ - the agent error vocabulary (`CrowdyAgentError`, with CrowdyJS's message redaction).
45
+ - **The parity gate is strict.** A portable gap fails the build.
46
+
47
+ ## 0.3.0
48
+
49
+ The World Stores, the Game Kit, the ck-exec gateway and GraphQL subscriptions. Additive,
50
+ except for one fix to the blocking client (the last item). Still CrowdyJS 18.0.4 and
51
+ CrowdyCPP 0.54.0.
52
+
53
+ - **World Stores** (`crowdypy.stores`, `create_world_session(game, app_id)` over a
54
+ connected `game.udp`) bind CrowdyCPP's `WorldSession`. `session.tick()` applies every
55
+ notification since the last tick to the stores natively, runs your actor's send loop and
56
+ reaping, and then fires your callbacks. The stores are:
57
+ - `self` (`LocalActorStore`: join, set and patch state, send-on-change with keyframes and
58
+ heartbeats, `last_ack` / `last_error` / `status`);
59
+ - `actors` (`RemoteActorStore`: staleness, sample history, `on_join` / `on_leave` /
60
+ `on_update`, native lanes filtered by `state[offset] & mask == value`, and
61
+ `snapshot()` columns);
62
+ - `chunks` (`ChunkStore`: real-time voxel merge, optimistic `set_voxel`, `ensure_around`
63
+ / `hydrate` from the Game API, write-back with CrowdyJS's refuse-or-retry rules, and an
64
+ `on_missing` worldgen hook);
65
+ - `errors`, `direct_inbox`, `channel_inbox` and `events`.
66
+
67
+ `HostTracker`, `SaveStateStore` and `AvatarStateStore` make their GraphQL calls from the
68
+ session's timers. Nothing a tick does waits on the network.
69
+ - **Codecs** (`crowdypy.codecs`): `json_codec`, `raw_codec`, `text_codec`, and
70
+ `struct_codec`, which declares a fixed layout and decodes a whole lane's states at once
71
+ into a numpy structured array (`codec.decode_many(snapshot.state_offsets,
72
+ snapshot.state_data)`).
73
+ - **`client.world(app_id).actor()`** (`WorldClient` / `ActorClient`): an actor that
74
+ remembers its chunk after `join`, over `client.udp`.
75
+ - **The Game Kit** (`crowdypy.kit`, `client.kit(app_id)`):
76
+ - parties, guilds and chat rooms (`kit.social`);
77
+ - the 48-byte engine pose (`encode_engine_pose`, `engine_pose_codec`), and
78
+ `engine_lanes()` as native lane filters;
79
+ - the engine event parsers;
80
+ - `run_optimistic_action`.
81
+ - **The ck-exec gateway** (`crowdypy.exec_gateway`): `client.exec.connect(app_id)` and
82
+ `connect_as_developer` return a connection with `call` (msgpack), `call_raw`,
83
+ `subscribe`, `ping` and `on_reconnect`.
84
+ - It redials with backoff and renews its subscriptions, and follows a `Moved` reply to
85
+ the new host. The frames match the platform's shared fixture.
86
+ - `AsyncExecConnection` runs in asyncio; `ExecConnection` is the blocking form.
87
+ - **`GraphQLSubscriptions.for_client(client)`**: `graphql-transport-ws` subscriptions
88
+ authenticated as CrowdyJS's are.
89
+ - **Fix: the blocking client raises and returns the async client's classes.** Before,
90
+ every class in a generated module was a copy, so `except
91
+ crowdypy.PortalConsentRequiredError` did not catch what `crowdypy.sync.CrowdyClient`
92
+ raised. A class with no async code (errors, result structs, records) is now one class in
93
+ both clients.
94
+
95
+ ## 0.2.0
96
+
97
+ Native UDP replication: CrowdyCPP's connection, now at CrowdyCPP 0.54.0, bound for Python.
98
+ Additive; still CrowdyJS 18.0.4.
99
+
100
+ - **`client.udp`** has CrowdyJS's UdpAPI methods (`connect`, `disconnect`,
101
+ `connection_status`, every `send_*` and `send_*_and_wait`, `send_video_frame`,
102
+ `flush_sends`, `subscribe`), sent as signed datagrams straight to the replication
103
+ server the Game API assigns rather than through the GraphQL UDP proxy. Defaults per
104
+ message type are CrowdyJS's (actor updates: 8 chunks, exponential decay; audio and video:
105
+ 1 chunk). Payloads are `bytes`, not base64, and sends return the sequence number.
106
+ - **`connect(app_token)`** takes the `AppTokenResponse` from `portal.mint_app_token`; the
107
+ native client needs its token id and expiry as well as the token. `client.set_app_token(
108
+ minted)` installs one on a game client (the bearer and `client.app_token`), so
109
+ `connect()` can then be called without it.
110
+ - **`*_and_wait`** resolves on the send's echo (only actor and voxel updates echo) and, as in
111
+ CrowdyJS, raises `CrowdyRealtimeError` with `code` set to the server's error name
112
+ (`UNAUTHORIZED`, ...) or to `UDP_SEQUENCE_TIMEOUT`.
113
+ - **The connection lifecycle runs natively.** Assignment and token refresh are GraphQL
114
+ calls the native side asks Python to make. A proactive refresh names the current server,
115
+ so the socket is kept when the Game API installs the new token there. A failed
116
+ assignment tries endpoint re-discovery once. `move_to_datacenter` re-assigns the UDP
117
+ session, and `refresh_gameplay_token()` with a live connection quiesces it and resumes it
118
+ under the new token. `aclose()` also closes the connection.
119
+ - **`crowdypy.replication`** is the layer underneath, for games that drive it themselves:
120
+ - `AsyncReplicationConnection`, and `ReplicationConnection` for code without an event
121
+ loop (`poll()` / `wait()`), both with a `SessionProvider` of your own.
122
+ - `NotificationBatch`: the events one poll drained, as zero-copy columns (numpy arrays
123
+ when numpy is installed, `memoryview` otherwise), or `Notification` objects one at a
124
+ time.
125
+ - `send_actor_updates` / `send_spatial_batch`: many entities in one call, with the GIL
126
+ released once.
127
+ - `stats()`, and `manual_pump=True` with `pump()`.
128
+ - **`crowdypy.media`**: `fragment_frame`, `VideoFrameAssembler` (including `ingest_batch`
129
+ for a whole batch at once), `parse_video_fragment_header`, `is_newer_frame_id`.
130
+ - **`GridScope.send.*` and `GridScope.channels.send`** check the grid box and send on
131
+ `client.udp`.
132
+ - `benchmarks/` measures it against CrowdyCPP on the same machine. A batch of 200 entity
133
+ updates costs 1.06x CrowdyCPP's `sendActorUpdate` per entity, and Python receives two
134
+ million verified notifications a second in batches. See `benchmarks/README.md`.
135
+
136
+ ## 0.1.0
137
+
138
+ The first release. CrowdyPy follows CrowdyJS 18.0.4 (the pinned commit in
139
+ `pyproject.toml`) the way CrowdyCPP does, and runs its native core on CrowdyCPP 0.53.0.
140
+
141
+ - **The client.** `AsyncCrowdyClient` (asyncio) and its generated blocking twin
142
+ `CrowdyClient`, one origin, the two-token model, the full CrowdyJS error hierarchy
143
+ (`CrowdyGraphQLError.code`, `CrowdyAppUnavailableError`, `CrowdyUserCodeFaultError`
144
+ with `player_fault_of`), the `WRONG_DATACENTER` move with one retry, the sticky
145
+ load-balancer cookie and endpoint re-discovery (`discovery_url`).
146
+ - **Names.** Every CrowdyJS method is the snake_case of its name (`mintAppToken` ->
147
+ `mint_app_token`, `listConnection` -> `list_connection`); domains likewise
148
+ (`client.appAccess` -> `client.app_access`). `register` and `delete` keep their names.
149
+ - **Big integers** are decimal strings on the wire, as everywhere on the platform; methods
150
+ accept `int` or `str` for a `BigInt` argument and send the string.
151
+ - **Typed results where they carry credentials.** `auth.login` returns `AuthResponse` and
152
+ `portal.mint_app_token` / `refresh` / `exchange_code` return `AppTokenResponse`; their
153
+ reprs never show the token. Other results are plain `dict`s, decoded with msgspec.
154
+ - **Inputs** are generated msgspec structs (`crowdypy.inputs`); a plain mapping keyed by the
155
+ GraphQL field names works too.
156
+ - **The wire codec** (`crowdypy.wire`) is CrowdyCPP's, byte-identical to CrowdyJS's
157
+ serializer on the shared fixtures.
158
+ - **Grid scope.** `client.grid(app_id, grid_id)` returns a `GridScope`: `mint_token()` (which
159
+ learns the grid box), `contains()` / `assert_contains()` (raising `GridScopeError`) and the
160
+ grid's channels. Its replication sends (`send.*`, `channels.send`) arrive with the
161
+ connection in 0.2.0.
162
+ - **A response without its root field** raises `CrowdyProtocolError`, where CrowdyJS hands
163
+ back `undefined`.
164
+ - **Moves stay in the estate.** A `WRONG_DATACENTER` move or a re-discovery answer is
165
+ followed only to a host in the current endpoint's estate (`crowdypy.estate`), since the
166
+ bearer token follows the move; anything else is refused and the error surfaces. CrowdyCPP
167
+ bounds moves the same way; CrowdyJS bounds only its relay reconnects.
168
+ - **Licenses.** The wheels link OpenSSL statically, so the distribution is
169
+ `MIT AND Apache-2.0`; every license ships in the wheel's metadata.
170
+ - **Not in a non-browser SDK** (as in CrowdyCPP): hosted browser sign-in navigation
171
+ (`portal.signIn`, `handleSignInCallback`, `handleAuthorizeRequest`), the Crowdy Games
172
+ shell bridge and bundle hosting, the Studio browser UI, the in-browser agent pane and the
173
+ Web Worker player runtime. `docs/parity-matrix.md` lists every exclusion with its reason.
174
+
175
+ Not in 0.1.0, and listed as portable gaps in `docs/parity-matrix.md` until they landed:
176
+ the native replication connection, video frames and traffic metrics (0.2.0); the World
177
+ Stores, the ck-exec gateway connection, the Game Kit and the subscriptions client (0.3.0);
178
+ the headless Studio, and the roots CrowdyCPP covers beyond CrowdyJS (0.4.0).