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.
- crowdypy-0.4.0.dev1/.gitattributes +8 -0
- crowdypy-0.4.0.dev1/.gitignore +26 -0
- crowdypy-0.4.0.dev1/.gitleaks.toml +27 -0
- crowdypy-0.4.0.dev1/AGENTS.md +145 -0
- crowdypy-0.4.0.dev1/CMakeLists.txt +78 -0
- crowdypy-0.4.0.dev1/LICENSE +21 -0
- crowdypy-0.4.0.dev1/MIGRATION.md +178 -0
- crowdypy-0.4.0.dev1/PKG-INFO +264 -0
- crowdypy-0.4.0.dev1/README.md +224 -0
- crowdypy-0.4.0.dev1/SECURITY.md +35 -0
- crowdypy-0.4.0.dev1/benchmarks/README.md +95 -0
- crowdypy-0.4.0.dev1/benchmarks/bench_replication.py +390 -0
- crowdypy-0.4.0.dev1/docs/compatibility.md +40 -0
- crowdypy-0.4.0.dev1/docs/e2e-coverage.md +64 -0
- crowdypy-0.4.0.dev1/docs/parity-matrix.md +1181 -0
- crowdypy-0.4.0.dev1/licenses/OpenSSL-LICENSE.txt +177 -0
- crowdypy-0.4.0.dev1/native/common.hpp +114 -0
- crowdypy-0.4.0.dev1/native/module.cpp +30 -0
- crowdypy-0.4.0.dev1/native/replication.hpp +796 -0
- crowdypy-0.4.0.dev1/native/replication_binding.cpp +346 -0
- crowdypy-0.4.0.dev1/native/session_binding.cpp +737 -0
- crowdypy-0.4.0.dev1/native/wire_binding.cpp +202 -0
- crowdypy-0.4.0.dev1/operations/actors/Actor.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/actors/Actors.graphql +45 -0
- crowdypy-0.4.0.dev1/operations/actors/BatchLookupActors.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/actors/CreateActor.graphql +17 -0
- crowdypy-0.4.0.dev1/operations/actors/DeleteActor.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/actors/UpdateActor.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/actors/UpdateActorState.graphql +9 -0
- crowdypy-0.4.0.dev1/operations/appAccess/AppAccessTiers.graphql +18 -0
- crowdypy-0.4.0.dev1/operations/appAccess/AppFeatures.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/appAccess/AppGrantMemberCandidates.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/appAccess/AppUserAccessByApp.graphql +61 -0
- crowdypy-0.4.0.dev1/operations/appAccess/ArchiveAccessTier.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/appAccess/ClaimFreeAppAccess.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/appAccess/CreateAccessTier.graphql +18 -0
- crowdypy-0.4.0.dev1/operations/appAccess/DefineAppFeature.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/appAccess/GrantAppAccess.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/appAccess/GrantMyAppAccess.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/appAccess/GrantTierFeature.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/appAccess/MyAppAccess.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/appAccess/RevokeAppAccess.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/appAccess/RevokeTierFeature.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/appAccess/RuntimePermissions.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/appAccess/TierFeatures.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/appAccess/UpdateAccessTier.graphql +17 -0
- crowdypy-0.4.0.dev1/operations/apps/App.graphql +31 -0
- crowdypy-0.4.0.dev1/operations/apps/AppBySlug.graphql +22 -0
- crowdypy-0.4.0.dev1/operations/apps/AppDiscovery.graphql +8 -0
- crowdypy-0.4.0.dev1/operations/apps/AppsForOrg.graphql +17 -0
- crowdypy-0.4.0.dev1/operations/apps/ArchiveApp.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/apps/CodeAdmissions.graphql +42 -0
- crowdypy-0.4.0.dev1/operations/apps/CreateApp.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/apps/MarketplaceApps.graphql +70 -0
- crowdypy-0.4.0.dev1/operations/apps/MyApps.graphql +22 -0
- crowdypy-0.4.0.dev1/operations/apps/PlaceableDatacenters.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/apps/UpdateApp.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/auth/Logout.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/auth/LogoutAllDevices.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/avatars/Avatars.graphql +104 -0
- crowdypy-0.4.0.dev1/operations/billing/AppBudget.graphql +12 -0
- crowdypy-0.4.0.dev1/operations/billing/AppBudgets.graphql +12 -0
- crowdypy-0.4.0.dev1/operations/billing/SetAppBudget.graphql +12 -0
- crowdypy-0.4.0.dev1/operations/billing/WalletBalance.graphql +12 -0
- crowdypy-0.4.0.dev1/operations/billing/WalletTransactions.graphql +49 -0
- crowdypy-0.4.0.dev1/operations/channels/AddChannelMember.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/channels/Channel.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/channels/ChannelMembers.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/channels/ChannelPolicy.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/channels/ChannelRoles.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/channels/Channels.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/channels/CreateChannel.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/channels/CreateChannelRole.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/channels/DeleteChannel.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/channels/DeleteChannelRole.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/channels/JoinChannel.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/channels/LeaveChannel.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/channels/MyChannels.graphql +25 -0
- crowdypy-0.4.0.dev1/operations/channels/RemoveChannelMember.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/channels/RequestToJoinChannel.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/channels/SetChannelMemberRoles.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/channels/SetChannelPolicy.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/channels/UpdateChannel.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/channels/UpdateChannelRole.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/chunks/GetChunk.graphql +30 -0
- crowdypy-0.4.0.dev1/operations/chunks/GetChunkLods.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/chunks/GetChunksByDistance.graphql +25 -0
- crowdypy-0.4.0.dev1/operations/chunks/GetVoxelList.graphql +27 -0
- crowdypy-0.4.0.dev1/operations/chunks/UpdateChunk.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/chunks/UpdateChunkLods.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/chunks/UpdateChunkState.graphql +13 -0
- crowdypy-0.4.0.dev1/operations/crowdyStudio/CrowdyStudio.graphql +168 -0
- crowdypy-0.4.0.dev1/operations/exec/Exec.graphql +458 -0
- crowdypy-0.4.0.dev1/operations/gameApps/GameApps.graphql +168 -0
- crowdypy-0.4.0.dev1/operations/grids/CreateGridChannel.graphql +15 -0
- crowdypy-0.4.0.dev1/operations/grids/GridChannels.graphql +15 -0
- crowdypy-0.4.0.dev1/operations/grids/MintGridToken.graphql +19 -0
- crowdypy-0.4.0.dev1/operations/host/Host.graphql +19 -0
- crowdypy-0.4.0.dev1/operations/marketplace/Marketplace.graphql +193 -0
- crowdypy-0.4.0.dev1/operations/organizations/CreateOrgRole.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/organizations/CreateOrgToken.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/organizations/CreateOrganization.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/organizations/DeleteOrgRole.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/organizations/InviteOrgMember.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/organizations/MemberRoles.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/organizations/MyOrganizations.graphql +22 -0
- crowdypy-0.4.0.dev1/operations/organizations/OrgMembers.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/organizations/OrgPermissions.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/organizations/OrgRoles.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/organizations/OrgTokens.graphql +13 -0
- crowdypy-0.4.0.dev1/operations/organizations/Organization.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/organizations/OrganizationBySlug.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/organizations/RemoveOrgMember.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/organizations/RevokeOrgToken.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/organizations/UpdateOrgMemberRoles.graphql +12 -0
- crowdypy-0.4.0.dev1/operations/organizations/UpdateOrgRole.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/organizations/UpdateOrgToken.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/payments/CapturePaypalCheckout.graphql +20 -0
- crowdypy-0.4.0.dev1/operations/payments/CreateCheckout.graphql +20 -0
- crowdypy-0.4.0.dev1/operations/payments/MyCheckouts.graphql +60 -0
- crowdypy-0.4.0.dev1/operations/platform/PlatformConfig.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/playerWallet/PlayerWallet.graphql +166 -0
- crowdypy-0.4.0.dev1/operations/quotas/DeleteQuota.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/quotas/EffectiveQuota.graphql +22 -0
- crowdypy-0.4.0.dev1/operations/quotas/QuotasForApp.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/quotas/QuotasForOrg.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/quotas/SetQuota.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/serverStatus/ActiveGraphQLServers.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/serverStatus/GameClientBootstrap.graphql +48 -0
- crowdypy-0.4.0.dev1/operations/serverStatus/GraphqlServers.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/serverStatus/ServerWithLeastClients.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/serverStatus/VersionInfo.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/sharedEnvironment/SharedEnvironment.graphql +196 -0
- crowdypy-0.4.0.dev1/operations/state/DeleteUserAppState.graphql +9 -0
- crowdypy-0.4.0.dev1/operations/state/UpdateUserAppState.graphql +9 -0
- crowdypy-0.4.0.dev1/operations/state/UserAppState.graphql +9 -0
- crowdypy-0.4.0.dev1/operations/state/UserAppStates.graphql +9 -0
- crowdypy-0.4.0.dev1/operations/teams/AddTeamMember.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/teams/CreateTeam.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/teams/CreateTeamRole.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/teams/DeleteTeam.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/teams/DeleteTeamRole.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/teams/JoinTeam.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/teams/LeaveTeam.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/teams/MyTeams.graphql +25 -0
- crowdypy-0.4.0.dev1/operations/teams/RemoveTeamMember.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/teams/RequestToJoinTeam.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/teams/SetTeamMemberRoles.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/teams/SetTeamPolicy.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/teams/Team.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/teams/TeamMembers.graphql +16 -0
- crowdypy-0.4.0.dev1/operations/teams/TeamPolicy.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/teams/TeamRoles.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/teams/Teams.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/teams/UpdateTeam.graphql +14 -0
- crowdypy-0.4.0.dev1/operations/teams/UpdateTeamRole.graphql +11 -0
- crowdypy-0.4.0.dev1/operations/teleport/TeleportRequest.graphql +6 -0
- crowdypy-0.4.0.dev1/operations/usage/AppGraphqlOperations.graphql +18 -0
- crowdypy-0.4.0.dev1/operations/usage/AppUsageSummary.graphql +28 -0
- crowdypy-0.4.0.dev1/operations/usage/PlayerPulse.graphql +10 -0
- crowdypy-0.4.0.dev1/operations/users/DeleteMyAccount.graphql +3 -0
- crowdypy-0.4.0.dev1/operations/users/FreePlayWindow.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/users/Me.graphql +17 -0
- crowdypy-0.4.0.dev1/operations/users/UpdateGamertag.graphql +8 -0
- crowdypy-0.4.0.dev1/operations/users/UpdateUserState.graphql +7 -0
- crowdypy-0.4.0.dev1/operations/users/User.graphql +17 -0
- crowdypy-0.4.0.dev1/operations/voxels/ListVoxelUpdatesByDistance.graphql +31 -0
- crowdypy-0.4.0.dev1/operations/voxels/ListVoxels.graphql +20 -0
- crowdypy-0.4.0.dev1/operations/voxels/RollbackVoxelUpdates.graphql +20 -0
- crowdypy-0.4.0.dev1/operations/voxels/UpdateVoxel.graphql +20 -0
- crowdypy-0.4.0.dev1/operations/voxels/VoxelUpdateHistory.graphql +81 -0
- crowdypy-0.4.0.dev1/pyproject.toml +170 -0
- crowdypy-0.4.0.dev1/schema.gql +11932 -0
- crowdypy-0.4.0.dev1/scripts/_pins.py +92 -0
- crowdypy-0.4.0.dev1/scripts/ci/assert_default_origin.py +162 -0
- crowdypy-0.4.0.dev1/scripts/ci/build_openssl.sh +70 -0
- crowdypy-0.4.0.dev1/scripts/ci/check_content_policy.py +140 -0
- crowdypy-0.4.0.dev1/scripts/ci/check_pin_tiers.py +124 -0
- crowdypy-0.4.0.dev1/scripts/ci/cibw_before_all_linux.sh +14 -0
- crowdypy-0.4.0.dev1/scripts/ci/resolve-release-tier.sh +98 -0
- crowdypy-0.4.0.dev1/scripts/ci/resolve-release-tier.test.sh +172 -0
- crowdypy-0.4.0.dev1/scripts/ci/resolve_pypi_version.py +98 -0
- crowdypy-0.4.0.dev1/scripts/ci/stamp_version.py +47 -0
- crowdypy-0.4.0.dev1/scripts/ci/verify_artifacts.py +58 -0
- crowdypy-0.4.0.dev1/scripts/codegen.py +333 -0
- crowdypy-0.4.0.dev1/scripts/schema_drift.py +131 -0
- crowdypy-0.4.0.dev1/scripts/schema_sync.py +169 -0
- crowdypy-0.4.0.dev1/scripts/unasync.py +245 -0
- crowdypy-0.4.0.dev1/scripts/vendor_crowdycpp.py +183 -0
- crowdypy-0.4.0.dev1/src/crowdypy/__init__.py +515 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_concurrency.py +129 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_default_origin.py +26 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_generated/__init__.py +1 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_generated/enums.py +465 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_generated/inputs.py +1249 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_generated/operations.py +2397 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_grid.py +47 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_native.pyi +10 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_operation.py +31 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/__init__.py +1 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/client.py +320 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/__init__.py +2 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/_base.py +49 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/actors.py +129 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/admin.py +70 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/app_access.py +222 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/apps.py +290 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/auth.py +357 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/avatars.py +99 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/billing.py +93 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/channels.py +218 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/chunks.py +105 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/crowdy_studio.py +884 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/crowdy_studio_agent.py +177 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/crowdy_studio_github.py +275 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/discovery.py +65 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/exec.py +989 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/game_apps.py +176 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/grids.py +49 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/host.py +43 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/marketplace.py +234 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/organizations.py +174 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/payments.py +68 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/platform.py +47 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/player_wallet.py +211 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/portal.py +352 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/quotas.py +86 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/server_status.py +42 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/shared_environment.py +248 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/state.py +54 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/teams.py +213 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/teleport.py +33 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/udp.py +371 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/usage.py +122 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/users.py +45 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/domains/voxels.py +141 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/graphql.py +216 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/grid_scope.py +166 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/__init__.py +102 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/actions.py +76 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/kit.py +36 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/social.py +235 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/kit/wire.py +292 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/rediscover.py +132 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/stores.py +1283 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_sync/world.py +161 -0
- crowdypy-0.4.0.dev1/src/crowdypy/_version.py +3 -0
- crowdypy-0.4.0.dev1/src/crowdypy/auth_state.py +21 -0
- crowdypy-0.4.0.dev1/src/crowdypy/client.py +319 -0
- crowdypy-0.4.0.dev1/src/crowdypy/codecs.py +186 -0
- crowdypy-0.4.0.dev1/src/crowdypy/datacenter_redirect.py +51 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/__init__.py +1 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/_base.py +48 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/actors.py +128 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/admin.py +69 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/app_access.py +221 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/apps.py +299 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/auth.py +376 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/avatars.py +98 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/billing.py +92 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/channels.py +217 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/chunks.py +104 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/crowdy_studio.py +996 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/crowdy_studio_agent.py +176 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/crowdy_studio_github.py +327 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/discovery.py +74 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/exec.py +1309 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/game_apps.py +175 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/grids.py +48 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/host.py +42 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/marketplace.py +233 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/organizations.py +173 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/payments.py +67 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/platform.py +46 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/player_wallet.py +210 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/portal.py +414 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/quotas.py +85 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/server_status.py +41 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/shared_environment.py +247 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/state.py +53 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/teams.py +212 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/teleport.py +32 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/udp.py +377 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/usage.py +121 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/users.py +44 -0
- crowdypy-0.4.0.dev1/src/crowdypy/domains/voxels.py +140 -0
- crowdypy-0.4.0.dev1/src/crowdypy/enums.py +4 -0
- crowdypy-0.4.0.dev1/src/crowdypy/errors.py +249 -0
- crowdypy-0.4.0.dev1/src/crowdypy/estate.py +41 -0
- crowdypy-0.4.0.dev1/src/crowdypy/exec_gateway.py +772 -0
- crowdypy-0.4.0.dev1/src/crowdypy/graphql.py +215 -0
- crowdypy-0.4.0.dev1/src/crowdypy/grid_scope.py +165 -0
- crowdypy-0.4.0.dev1/src/crowdypy/inputs.py +9 -0
- crowdypy-0.4.0.dev1/src/crowdypy/kit/__init__.py +101 -0
- crowdypy-0.4.0.dev1/src/crowdypy/kit/actions.py +81 -0
- crowdypy-0.4.0.dev1/src/crowdypy/kit/kit.py +35 -0
- crowdypy-0.4.0.dev1/src/crowdypy/kit/social.py +244 -0
- crowdypy-0.4.0.dev1/src/crowdypy/kit/wire.py +378 -0
- crowdypy-0.4.0.dev1/src/crowdypy/lb_cookie.py +34 -0
- crowdypy-0.4.0.dev1/src/crowdypy/media.py +140 -0
- crowdypy-0.4.0.dev1/src/crowdypy/pkce.py +34 -0
- crowdypy-0.4.0.dev1/src/crowdypy/player_host/__init__.py +95 -0
- crowdypy-0.4.0.dev1/src/crowdypy/player_host/agent_errors.py +247 -0
- crowdypy-0.4.0.dev1/src/crowdypy/player_host/agent_types.py +51 -0
- crowdypy-0.4.0.dev1/src/crowdypy/player_host/json_schema.py +514 -0
- crowdypy-0.4.0.dev1/src/crowdypy/player_host/schemas.py +39 -0
- crowdypy-0.4.0.dev1/src/crowdypy/player_host/schemas.v1.json +2199 -0
- crowdypy-0.4.0.dev1/src/crowdypy/player_host/types.py +226 -0
- crowdypy-0.4.0.dev1/src/crowdypy/py.typed +0 -0
- crowdypy-0.4.0.dev1/src/crowdypy/rediscover.py +136 -0
- crowdypy-0.4.0.dev1/src/crowdypy/replication.py +1020 -0
- crowdypy-0.4.0.dev1/src/crowdypy/session.py +154 -0
- crowdypy-0.4.0.dev1/src/crowdypy/stores.py +1411 -0
- crowdypy-0.4.0.dev1/src/crowdypy/studio/__init__.py +100 -0
- crowdypy-0.4.0.dev1/src/crowdypy/studio/client_tick_interval.py +30 -0
- crowdypy-0.4.0.dev1/src/crowdypy/studio/controller.py +2182 -0
- crowdypy-0.4.0.dev1/src/crowdypy/studio/diagnostics.py +206 -0
- crowdypy-0.4.0.dev1/src/crowdypy/studio/github_new_repo.py +59 -0
- crowdypy-0.4.0.dev1/src/crowdypy/studio/layout.py +162 -0
- crowdypy-0.4.0.dev1/src/crowdypy/studio/models.py +220 -0
- crowdypy-0.4.0.dev1/src/crowdypy/studio/starter_projects.py +170 -0
- crowdypy-0.4.0.dev1/src/crowdypy/subscriptions.py +204 -0
- crowdypy-0.4.0.dev1/src/crowdypy/sync.py +10 -0
- crowdypy-0.4.0.dev1/src/crowdypy/utils.py +75 -0
- crowdypy-0.4.0.dev1/src/crowdypy/wire.py +293 -0
- crowdypy-0.4.0.dev1/src/crowdypy/world.py +160 -0
- crowdypy-0.4.0.dev1/tests/conftest.py +93 -0
- crowdypy-0.4.0.dev1/tests/e2e/__init__.py +0 -0
- crowdypy-0.4.0.dev1/tests/e2e/conftest.py +239 -0
- crowdypy-0.4.0.dev1/tests/e2e/test_e2e_identity.py +43 -0
- crowdypy-0.4.0.dev1/tests/e2e/test_e2e_replication.py +77 -0
- crowdypy-0.4.0.dev1/tests/e2e/test_e2e_studio.py +49 -0
- crowdypy-0.4.0.dev1/tests/e2e/test_e2e_world.py +50 -0
- crowdypy-0.4.0.dev1/tests/e2e/test_e2e_world_data.py +27 -0
- crowdypy-0.4.0.dev1/tests/fixtures/README.md +16 -0
- crowdypy-0.4.0.dev1/tests/fixtures/binary-wire-fixtures.json +385 -0
- crowdypy-0.4.0.dev1/tests/fixtures/exec-client-frames.json +133 -0
- crowdypy-0.4.0.dev1/tests/fixtures/player-host.v1.json +9525 -0
- crowdypy-0.4.0.dev1/tests/unit/__init__.py +0 -0
- crowdypy-0.4.0.dev1/tests/unit/domains/__init__.py +0 -0
- crowdypy-0.4.0.dev1/tests/unit/domains/test_crowdycpp_roots.py +240 -0
- crowdypy-0.4.0.dev1/tests/unit/domains/test_org_domains.py +1096 -0
- crowdypy-0.4.0.dev1/tests/unit/domains/test_social_domains.py +584 -0
- crowdypy-0.4.0.dev1/tests/unit/domains/test_studio_exec_domains.py +1907 -0
- crowdypy-0.4.0.dev1/tests/unit/domains/test_world_domains.py +518 -0
- crowdypy-0.4.0.dev1/tests/unit/test_core.py +130 -0
- crowdypy-0.4.0.dev1/tests/unit/test_durable_stores.py +200 -0
- crowdypy-0.4.0.dev1/tests/unit/test_estate_moves.py +91 -0
- crowdypy-0.4.0.dev1/tests/unit/test_exec_gateway.py +233 -0
- crowdypy-0.4.0.dev1/tests/unit/test_fixture_provenance.py +61 -0
- crowdypy-0.4.0.dev1/tests/unit/test_grid_scope.py +112 -0
- crowdypy-0.4.0.dev1/tests/unit/test_kit.py +145 -0
- crowdypy-0.4.0.dev1/tests/unit/test_lazy_exports.py +71 -0
- crowdypy-0.4.0.dev1/tests/unit/test_player_host.py +120 -0
- crowdypy-0.4.0.dev1/tests/unit/test_release_versions.py +63 -0
- crowdypy-0.4.0.dev1/tests/unit/test_replication.py +372 -0
- crowdypy-0.4.0.dev1/tests/unit/test_sdk_audience.py +172 -0
- crowdypy-0.4.0.dev1/tests/unit/test_studio_controller.py +755 -0
- crowdypy-0.4.0.dev1/tests/unit/test_studio_diagnostics.py +42 -0
- crowdypy-0.4.0.dev1/tests/unit/test_studio_layout.py +82 -0
- crowdypy-0.4.0.dev1/tests/unit/test_subscriptions.py +93 -0
- crowdypy-0.4.0.dev1/tests/unit/test_transport.py +240 -0
- crowdypy-0.4.0.dev1/tests/unit/test_udp_api.py +275 -0
- crowdypy-0.4.0.dev1/tests/unit/test_wire.py +294 -0
- crowdypy-0.4.0.dev1/tests/unit/test_world_session.py +280 -0
- crowdypy-0.4.0.dev1/tools/e2e/provision.py +87 -0
- crowdypy-0.4.0.dev1/tools/fixtures/player_host.mjs +220 -0
- crowdypy-0.4.0.dev1/tools/parity/classifications.toml +175 -0
- crowdypy-0.4.0.dev1/tools/parity/parity.py +483 -0
- crowdypy-0.4.0.dev1/uv.lock +911 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/CMakeLists.txt +388 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/LICENSE +21 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/PROVENANCE.md +8 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/cmake/CheckPublicHeaders.cmake +34 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/cmake/CrowdyCPPConfig.cmake.in +15 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/cmake/studio_layout_fixture.hpp.in +10 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/client.hpp +399 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/base64.hpp +21 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/bytes.hpp +101 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/clock.hpp +25 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/crypto.hpp +86 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/logger.hpp +22 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/result.hpp +80 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/spsc.hpp +57 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/core/uuid.hpp +29 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/crowdy.hpp +33 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/default_origin.hpp +31 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/admin.hpp +1029 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/auth.hpp +518 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio.hpp +1154 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_agent.hpp +154 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_github.hpp +221 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/discovery.hpp +103 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/domain_base.hpp +106 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/exec.hpp +574 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/game_apps.hpp +207 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/grids.hpp +87 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/groups.hpp +502 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/marketplace.hpp +201 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/player_wallet.hpp +183 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/portal.hpp +434 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/realtime_control.hpp +98 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/server_status.hpp +81 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/types.hpp +173 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/users.hpp +83 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/domains/world_data.hpp +599 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/generated/enums.hpp +1283 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/generated/operations.hpp +9629 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/async_scope.hpp +45 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/auth_state.hpp +133 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/datacenter_redirect.hpp +68 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/dispatcher.hpp +72 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/errors.hpp +162 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/estate.hpp +94 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/graphql_client.hpp +182 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/http.hpp +93 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/json.hpp +160 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/rediscover.hpp +94 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/subscription_client.hpp +205 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/graphql/websocket.hpp +117 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/actions.hpp +102 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +48 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/social.hpp +319 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/wire.hpp +376 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/media/video_frames.hpp +258 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/player_host/adapter.hpp +133 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/player_host/player_host.hpp +10 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/player_host/schemas.hpp +94 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/player_host/types.hpp +525 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/replication/connection.hpp +427 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/replication/session_provider.hpp +41 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/replication/types.hpp +201 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/replication/udp_socket.hpp +70 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/chunk_store.hpp +347 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/codec.hpp +73 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/durable.hpp +268 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/keys.hpp +71 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/stores.hpp +801 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/session/world_session.hpp +152 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/controller.hpp +2089 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/diagnostics.hpp +95 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/editor.hpp +115 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/github.hpp +105 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/github_layout.hpp +99 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/integration.hpp +144 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/layout.hpp +369 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/models.hpp +685 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/studio/runtime.hpp +597 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/wire/codec.hpp +499 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/wire/protocol.hpp +216 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/include/crowdy/world.hpp +93 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/package.json +36 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/client.cpp +841 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/base64.cpp +72 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/clock.cpp +70 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/crypto_default_unavailable.cpp +9 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/crypto_openssl.cpp +142 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/crypto_unavailable.cpp +32 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/logger.cpp +38 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/core/uuid.cpp +33 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/domains/exec.cpp +1702 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/async_transport.cpp +135 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/auth_state.cpp +59 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/error_extensions.hpp +57 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/errors.cpp +3 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/graphql_client.cpp +314 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/http_curl.cpp +127 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/http_none.cpp +7 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/json.cpp +535 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/subscription_client.cpp +1397 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/websocket_curl.cpp +606 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/graphql/websocket_none.cpp +11 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/player_host/schemas.cpp +477 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/player_host/types.cpp +148 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/replication/connection.cpp +870 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/replication/socket_errors.hpp +34 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/replication/udp_socket.cpp +288 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/session/world_session.cpp +377 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/studio/diagnostics.cpp +412 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/studio/editor.cpp +243 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/src/studio/integration.cpp +142 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/third_party/yyjson/LICENSE +21 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/third_party/yyjson/yyjson.c +9568 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/third_party/yyjson/yyjson.h +7942 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/tools/parity/fixtures/crowdy-studio-diagnostics.v1.json +83 -0
- crowdypy-0.4.0.dev1/vendor/CrowdyCPP/tools/parity/fixtures/crowdyjs-studio-layout.v1.json +206 -0
- 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).
|