crowdypy 0.11.0.dev1__tar.gz → 0.12.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.11.0.dev1 → crowdypy-0.12.0.dev1}/AGENTS.md +21 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/MIGRATION.md +42 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/PKG-INFO +39 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/README.md +38 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/docs/compatibility.md +1 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/docs/e2e-coverage.md +2 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/docs/parity-matrix.md +105 -37
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/pyproject.toml +7 -7
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/unasync.py +11 -2
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_concurrency.py +25 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/client.py +12 -1
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/__init__.py +214 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/kit/actions.py +1 -1
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/kit.py +175 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/mirror.py +340 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/__init__.py +3 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/matchmaking.py +140 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/npcs.py +121 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/presence.py +133 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/sessions.py +102 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/modules/world.py +60 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/protocol.py +212 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/realtime.py +135 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/runtime.py +233 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/store.py +17 -0
- crowdypy-0.12.0.dev1/src/crowdypy/_sync/kit/topology.py +187 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/kit/wire.py +66 -3
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_version.py +1 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/client.py +12 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/exec_gateway.py +9 -2
- crowdypy-0.12.0.dev1/src/crowdypy/kit/__init__.py +213 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/kit.py +174 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/mirror.py +358 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/__init__.py +2 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/matchmaking.py +139 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/npcs.py +120 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/presence.py +132 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/sessions.py +101 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/modules/world.py +59 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/protocol.py +218 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/realtime.py +152 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/runtime.py +263 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/store.py +49 -0
- crowdypy-0.12.0.dev1/src/crowdypy/kit/topology.py +197 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/kit/wire.py +86 -2
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/schemas.v1.json +2 -2
- crowdypy-0.12.0.dev1/tests/fixtures/kit-protocol.json +2360 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/player-host.v1.json +2 -2
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_fixture_provenance.py +4 -1
- crowdypy-0.12.0.dev1/tests/unit/test_kit_protocol.py +736 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tools/parity/classifications.toml +2 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tools/parity/parity.py +1 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/uv.lock +1 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/CMakeLists.txt +1 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/PROVENANCE.md +1 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/crowdy.hpp +1 -1
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/exec.hpp +12 -6
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/actions.hpp +4 -4
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +142 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/mirror.hpp +149 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/modules.hpp +339 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/protocol.hpp +159 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/realtime.hpp +82 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/runtime.hpp +103 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/topology.hpp +84 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/wire.hpp +94 -17
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/package.json +3 -3
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/domains/exec.cpp +21 -9
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/mirror.cpp +541 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/modules.cpp +389 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/protocol.cpp +167 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/runtime.cpp +482 -0
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/src/kit/topology.cpp +237 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdy-studio-diagnostics.v1.json +2 -2
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/crowdyjs-studio-layout.v1.json +2 -2
- crowdypy-0.12.0.dev1/vendor/CrowdyCPP/tools/parity/fixtures/kit-protocol.json +2360 -0
- crowdypy-0.11.0.dev1/src/crowdypy/_sync/kit/__init__.py +0 -102
- crowdypy-0.11.0.dev1/src/crowdypy/_sync/kit/kit.py +0 -36
- crowdypy-0.11.0.dev1/src/crowdypy/kit/__init__.py +0 -101
- crowdypy-0.11.0.dev1/src/crowdypy/kit/kit.py +0 -35
- crowdypy-0.11.0.dev1/vendor/CrowdyCPP/include/crowdy/kit/kit.hpp +0 -48
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/.gitattributes +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/.gitignore +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/.gitleaks.toml +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/CMakeLists.txt +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/LICENSE +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/SECURITY.md +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/benchmarks/README.md +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/benchmarks/bench_replication.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/licenses/OpenSSL-LICENSE.txt +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/common.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/module.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/replication.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/replication_binding.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/session_binding.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/voice_binding.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/native/wire_binding.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/Actor.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/Actors.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/BatchLookupActors.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/CreateActor.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/DeleteActor.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/UpdateActor.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/actors/UpdateActorState.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/AppAccessTiers.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/AppFeatures.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/AppGrantMemberCandidates.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/AppUserAccessByApp.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/ArchiveAccessTier.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/ClaimFreeAppAccess.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/CreateAccessTier.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/DefineAppFeature.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/GrantAppAccess.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/GrantMyAppAccess.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/GrantTierFeature.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/MyAppAccess.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/RevokeAppAccess.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/RevokeTierFeature.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/RuntimePermissions.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/SuspendAppAccess.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/TierFeatures.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/appAccess/UpdateAccessTier.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/App.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/AppBySlug.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/AppDiscovery.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/AppsForOrg.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/ArchiveApp.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/CodeAdmissions.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/CreateApp.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/MarketplaceApps.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/MyApps.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/PlaceableDatacenters.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/apps/UpdateApp.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/auth/Logout.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/auth/LogoutAllDevices.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/avatars/Avatars.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/AppBudget.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/AppBudgets.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/SetAppBudget.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/WalletBalance.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/billing/WalletTransactions.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/AddChannelMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/BanChannelMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/Channel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/ChannelMembers.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/ChannelPolicy.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/ChannelRoles.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/Channels.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/CreateChannel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/CreateChannelRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/DeleteChannel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/DeleteChannelRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/JoinChannel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/LeaveChannel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/MyChannels.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/RemoveChannelMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/RequestToJoinChannel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/SetChannelMemberRoles.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/SetChannelPolicy.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/UnbanChannelMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/UpdateChannel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/channels/UpdateChannelRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/GetChunk.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/GetChunkLods.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/GetChunksByDistance.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/GetVoxelList.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/UpdateChunk.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/UpdateChunkLods.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/chunks/UpdateChunkState.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/crowdyStudio/CrowdyStudio.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/exec/Exec.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/gameApps/GameApps.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/grids/CreateGridChannel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/grids/GridChannels.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/grids/MintGridToken.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/host/Host.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/inputLog/InputLogMessages.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/inputLog/InputLogSessions.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/marketplace/Marketplace.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/CreateOrgRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/CreateOrgToken.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/CreateOrganization.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/DeleteOrgRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/InviteOrgMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/MemberRoles.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/MyOrganizations.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrgMembers.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrgPermissions.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrgRoles.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrgTokens.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/Organization.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/OrganizationBySlug.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/RemoveOrgMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/RevokeOrgToken.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/UpdateOrgMemberRoles.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/UpdateOrgRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/organizations/UpdateOrgToken.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/payments/CapturePaypalCheckout.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/payments/CreateCheckout.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/payments/MyCheckouts.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/platform/PlatformConfig.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/playerWallet/PlayerWallet.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/DeleteQuota.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/EffectiveQuota.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/QuotasForApp.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/QuotasForOrg.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/quotas/SetQuota.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/ActiveGraphQLServers.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/GameClientBootstrap.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/GraphqlServers.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/ServerWithLeastClients.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/serverStatus/VersionInfo.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/sharedEnvironment/SharedEnvironment.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/state/DeleteUserAppState.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/state/UpdateUserAppState.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/state/UserAppState.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/state/UserAppStates.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/AddTeamMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/BanTeamMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/CreateTeam.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/CreateTeamRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/DeleteTeam.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/DeleteTeamRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/JoinTeam.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/LeaveTeam.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/MyTeams.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/RemoveTeamMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/RequestToJoinTeam.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/SetTeamMemberRoles.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/SetTeamPolicy.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/Team.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/TeamMembers.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/TeamPolicy.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/TeamRoles.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/Teams.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/UnbanTeamMember.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/UpdateTeam.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teams/UpdateTeamRole.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/teleport/TeleportRequest.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/usage/AppGraphqlOperations.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/usage/AppUsageSummary.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/usage/PlayerPulse.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/DeleteMyAccount.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/FreePlayWindow.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/Me.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/PlayerProfile.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/UpdateGamertag.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/UpdateUserState.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/users/User.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/ListVoxelUpdatesByDistance.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/ListVoxels.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/RollbackVoxelUpdates.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/UpdateVoxel.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/operations/voxels/VoxelUpdateHistory.graphql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/schema.gql +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/_pins.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/assert_default_origin.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/build_openssl.sh +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/check_content_policy.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/check_pin_tiers.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/cibw_before_all_linux.sh +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/resolve-release-tier.sh +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/resolve-release-tier.test.sh +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/resolve_pypi_version.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/stamp_version.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/ci/verify_artifacts.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/codegen.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/schema_drift.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/schema_sync.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/scripts/vendor_crowdycpp.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_default_origin.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_generated/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_generated/enums.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_generated/inputs.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_generated/operations.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_grid.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_native.pyi +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_operation.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/_base.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/actors.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/admin.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/app_access.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/apps.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/auth.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/avatars.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/billing.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/channels.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/chunks.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio_agent.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/crowdy_studio_github.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/discovery.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/exec.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/game_apps.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/grids.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/host.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/input_log.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/marketplace.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/organizations.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/payments.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/platform.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/player_wallet.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/portal.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/quotas.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/server_status.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/shared_environment.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/state.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/teams.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/teleport.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/udp.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/usage.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/users.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/domains/voxels.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/graphql.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/grid_scope.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/kit/social.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/rediscover.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/stores.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/_sync/world.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/auth_state.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/codecs.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/datacenter_redirect.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/_base.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/actors.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/admin.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/app_access.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/apps.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/auth.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/avatars.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/billing.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/channels.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/chunks.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/crowdy_studio.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/crowdy_studio_agent.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/crowdy_studio_github.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/discovery.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/exec.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/game_apps.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/grids.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/host.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/input_log.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/marketplace.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/organizations.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/payments.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/platform.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/player_wallet.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/portal.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/quotas.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/server_status.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/shared_environment.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/state.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/teams.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/teleport.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/udp.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/usage.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/users.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/domains/voxels.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/enums.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/errors.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/estate.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/graphql.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/grid_scope.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/inputs.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/kit/actions.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/kit/social.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/lb_cookie.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/media.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/pkce.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/agent_errors.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/agent_types.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/json_schema.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/schemas.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/player_host/types.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/py.typed +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/rediscover.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/replication.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/session.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/stores.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/client_tick_interval.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/controller.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/diagnostics.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/github_new_repo.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/layout.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/models.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/studio/starter_projects.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/subscriptions.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/sync.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/utils.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/wire.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/src/crowdypy/world.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/conftest.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/conftest.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_identity.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_input_log.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_open_grid_exec_gateway.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_ranged_channel.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_replication.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_studio.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_world.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/e2e/test_e2e_world_data.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/README.md +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/binary-wire-fixtures.json +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/exec-client-frames.json +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/fixtures/voice-frames.json +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/__init__.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_crowdycpp_roots.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_input_log_reads.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_org_domains.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_social_domains.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_studio_exec_domains.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/domains/test_world_domains.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_check_pin_tiers.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_core.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_durable_stores.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_estate_moves.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_exec_gateway.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_grid_scope.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_kit.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_lazy_exports.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_player_host.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_refusals.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_release_versions.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_replication.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_sdk_audience.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_studio_controller.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_studio_diagnostics.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_studio_layout.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_subscriptions.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_transport.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_udp_api.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_voice_frames.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_wire.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tests/unit/test_world_session.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tools/e2e/provision.py +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/tools/fixtures/player_host.mjs +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/LICENSE +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/cmake/CheckPublicHeaders.cmake +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/cmake/CrowdyCPPConfig.cmake.in +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/cmake/CrowdyFindOpus.cmake +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/cmake/studio_layout_fixture.hpp.in +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/client.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/base64.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/bytes.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/clock.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/crypto.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/logger.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/result.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/spsc.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/core/uuid.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/default_origin.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/admin.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/auth.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_agent.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/crowdy_studio_github.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/discovery.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/domain_base.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/game_apps.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/grids.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/groups.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/marketplace.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/player_wallet.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/portal.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/realtime_control.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/server_status.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/types.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/users.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/domains/world_data.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/generated/enums.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/generated/operations.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/async_scope.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/auth_state.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/cancel.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/datacenter_redirect.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/dispatcher.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/errors.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/estate.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/graphql_client.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/http.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/json.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/rediscover.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/subscription_client.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/graphql/websocket.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/kit/social.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/opus.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/video_frames.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/media/voice_frames.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/adapter.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/player_host.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/schemas.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/player_host/types.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/connection.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/session_provider.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/types.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/replication/udp_socket.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/chunk_store.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/codec.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/durable.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/keys.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/stores.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/session/world_session.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/controller.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/diagnostics.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/editor.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/github_layout.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/integration.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/layout.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/models.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/studio/runtime.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/wire/codec.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/wire/protocol.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/include/crowdy/world.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/client.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/base64.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/clock.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/crypto_default_unavailable.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/crypto_openssl.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/crypto_unavailable.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/logger.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/core/uuid.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/async_transport.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/auth_state.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/error_extensions.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/errors.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/graphql_client.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/http_curl.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/http_none.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/json.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/subscription_client.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/websocket_curl.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/graphql/websocket_none.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/media/opus.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/player_host/schemas.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/player_host/types.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/replication/connection.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/replication/socket_errors.hpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/replication/udp_socket.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/session/world_session.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/studio/diagnostics.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/studio/editor.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/src/studio/integration.cpp +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/LICENSE +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.c +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/third_party/yyjson/yyjson.h +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-client-frames.json +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/exec-gateway-cases.json +0 -0
- {crowdypy-0.11.0.dev1 → crowdypy-0.12.0.dev1}/vendor/CrowdyCPP/tools/parity/fixtures/voice-frames.json +0 -0
|
@@ -85,7 +85,11 @@ release re-reads the published wheel.
|
|
|
85
85
|
|
|
86
86
|
## Gates
|
|
87
87
|
|
|
88
|
-
CI (`.github/workflows/ci.yml`) runs all of these; run them before pushing
|
|
88
|
+
CI (`.github/workflows/ci.yml`) runs all of these; run them before pushing. CI's `mypy` runs
|
|
89
|
+
without the project installed (`uv sync --group dev --no-install-project`), so it follows
|
|
90
|
+
imports into the generated `_sync/` and checks it too; an editable install hides that, so
|
|
91
|
+
reproduce CI's run in a venv of its own (`UV_PROJECT_ENVIRONMENT=/tmp/lint uv sync --frozen
|
|
92
|
+
--group dev --no-install-project`, then `uv run --no-sync mypy` with the same variable).
|
|
89
93
|
|
|
90
94
|
```bash
|
|
91
95
|
ruff check . && ruff format --check . && mypy
|
|
@@ -134,6 +138,22 @@ re-run takes the next N (`scripts/ci/resolve_pypi_version.py` reads what PyPI al
|
|
|
134
138
|
Merging a PR from the command line: `gh pr merge` fails its preflight on this org, so use
|
|
135
139
|
`gh api -X PUT repos/CrowdedKingdoms/CrowdyPy/pulls/<n>/merge -f merge_method=merge`.
|
|
136
140
|
|
|
141
|
+
## The Game Kit
|
|
142
|
+
|
|
143
|
+
`src/crowdypy/kit/` is the client half of `ckx_sdk::kit`, ported from CrowdyJS `src/kit/` (the
|
|
144
|
+
parity gate reads `src/kit/modules/` too since 0.12.0): one `KitRuntime` per kit, mirrors
|
|
145
|
+
(`mirror.py`), the typed modules (`modules/`), `topology.py` and `realtime.py`. It is async source
|
|
146
|
+
like the rest of the client, so `scripts/unasync.py` generates the blocking kit, and it may use no
|
|
147
|
+
asyncio beyond `asyncio.sleep`. **A push or reconnect handler never waits on a call.** The
|
|
148
|
+
blocking `ExecConnection` runs them on its reader thread, so a call made there would wait on a
|
|
149
|
+
reply only that thread can read: a mirror starts its resync with `run_detached`, which unasync
|
|
150
|
+
maps to `run_in_thread` (`run_soon` would become `run_now`, inline). Periodic work (a queue's
|
|
151
|
+
`watch`, a spectator's `run`) is a loop the game starts beside itself. The protocol is held to
|
|
152
|
+
ck-exec's golden record, `tests/fixtures/kit-protocol.json`, copied from CrowdyJS at the pin
|
|
153
|
+
(`test_fixture_provenance.py` and the vendored CrowdyCPP copy hold it):
|
|
154
|
+
`tests/unit/test_kit_protocol.py` replays each starter's script through a gateway that answers
|
|
155
|
+
only the next recorded step, with both clients.
|
|
156
|
+
|
|
137
157
|
## Performance rules for the native binding
|
|
138
158
|
|
|
139
159
|
The replication system saturates the local network stack, so the binding
|
|
@@ -3,6 +3,48 @@
|
|
|
3
3
|
CrowdyPy is pre-1.0. Within a minor line, patch releases keep source compatibility; each
|
|
4
4
|
new minor may change the API. Read the section for every minor you skip.
|
|
5
5
|
|
|
6
|
+
## 0.12.0
|
|
7
|
+
|
|
8
|
+
CrowdyJS 18.11.0 and CrowdyCPP 0.64.0. Additive. The kit's typed clients drive the ck-exec
|
|
9
|
+
starter hubs, whose server half is `ckx_sdk::kit` (ckx-sdk 0.10.0): the tier's compute toolchain
|
|
10
|
+
must carry it (dev's v1.12.0 does) and the app must run the starters (`kit.topology.deploy`).
|
|
11
|
+
|
|
12
|
+
- **The modules.** `kit.world` (`conditions` and `nodes` mirrored; `state`, `harvest`, and
|
|
13
|
+
`schedule` / `cancel` for developers), `kit.matchmaking.queue(name)` (`join(rating, party=...,
|
|
14
|
+
leader=...)`, `leave`, `accept`, `decline`, `status`, `configure`, `place`, `watch` / `unwatch`,
|
|
15
|
+
`on_matched`), `kit.sessions.open(key)` (`watch`, `join`, `ready`, `start_game`, `act`,
|
|
16
|
+
`configure`, `current_turn`, `is_my_turn`, `state` mirrored), `kit.npcs.area(key)` /
|
|
17
|
+
`area_at(x, z)` (`mobs`, `npcs`, `pets`, `attack`, `talk`, `adopt`, `rename`, `summon`,
|
|
18
|
+
`dismiss`, `release`, `my_pets`), `kit.topology` (`pack`, `types`, `plan(select,
|
|
19
|
+
overrides=...)`, `deploy`; `kit_manifest_problems`), `kit.spectate.observe(uuid, chunk)` (a
|
|
20
|
+
heartbeat to `run()` beside the game), `kit.emotes` (`send`, `parse`: client event 101 with
|
|
21
|
+
`{"emote", "targetUuid"}`) and `kit.shards`. Replies are the hub's msgpack as Python values:
|
|
22
|
+
snake_case keys as the hub sends them, and a hub's integer-keyed maps (a session's `scores`) keep
|
|
23
|
+
integer keys.
|
|
24
|
+
- **Refusals.** A hub's `kit:<code>:` refusal raises `KitError` (a `CrowdyExecError` with status
|
|
25
|
+
`AppError`): branch on `code`, show `text`. `KitError.from_error` and `kit_error_code` read one
|
|
26
|
+
out of any exec error.
|
|
27
|
+
- **The runtime.** `kit.runtime` (`KitRuntime`) is one exec connection for every module, opened
|
|
28
|
+
on first use: as the player with an app token, or as a developer with `developer=True`. It paces
|
|
29
|
+
what it sends to `call_budget` (100) a `budget_window_ms` (10 s), holds as long as a `Busy` "rate
|
|
30
|
+
limited" refusal says, sends a call again when it did not run (`Busy`, `RateLimited`) or when it
|
|
31
|
+
carries an action id and its outcome is unknown (`DeadlineExceeded`, `Unavailable`, `Moved`), at
|
|
32
|
+
most `retries` (2) times, and refuses a 257th subscription with code `limit`. `call(...,
|
|
33
|
+
action=True)` sends a fresh `action_id` the hub answers once.
|
|
34
|
+
- **Mirrors.** `HubState`, `CollectionMirror` (`list`, `member`), `PrivateState` (read with a
|
|
35
|
+
caller-scoped call, again on a `changed` that names the player) and `WritableKitStore`. A mirror
|
|
36
|
+
takes a new snapshot on another epoch, a gap in a collection's `seq`, and a reconnect. In the
|
|
37
|
+
blocking client the resync a push or a reconnect starts runs on a thread of its own
|
|
38
|
+
(`run_detached`), because those handlers run on the connection's reader thread.
|
|
39
|
+
- **Realtime.** `decode_kit_actor_state` and `kit_actor_lanes` for the actors hubs show,
|
|
40
|
+
`KIT_EVENT_TYPES`, `parse_kit_server_event`; `crowdypy.kit.wire` adds events 99 (encounter), 100
|
|
41
|
+
(possession) and 101 (emote) with their parsers and `EVENT_APP_FIRST` (1000).
|
|
42
|
+
- **Exec reconnects** wait half their backoff plus up to as much again at random, in both
|
|
43
|
+
connections, so the players of a host that went away do not all dial at once.
|
|
44
|
+
- `tests/fixtures/kit-protocol.json` is ck-exec's golden record of the starters (by way of
|
|
45
|
+
CrowdyJS); `tests/unit/test_kit_protocol.py` replays it through a gateway that answers only the
|
|
46
|
+
next recorded step, with both clients. The parity gate reads CrowdyJS `src/kit/modules/` too.
|
|
47
|
+
|
|
6
48
|
## 0.11.0
|
|
7
49
|
|
|
8
50
|
CrowdyJS 18.10.0 and CrowdyCPP 0.63.0. Additive.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: crowdypy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.0.dev1
|
|
4
4
|
Summary: Official Python SDK for Crowded Kingdoms: typed GraphQL clients and a native UDP replication core
|
|
5
5
|
Keywords: crowded-kingdoms,multiplayer,replication,graphql,sdk,udp
|
|
6
6
|
Author: Crowded Kingdoms
|
|
@@ -51,6 +51,17 @@ CrowdyPy follows the [CrowdyJS](https://github.com/CrowdedKingdoms/CrowdyJS) API
|
|
|
51
51
|
client, bound with [nanobind](https://github.com/wjakob/nanobind) and shipped inside the
|
|
52
52
|
wheel. Python never touches a datagram.
|
|
53
53
|
|
|
54
|
+
**v0.12.0: the Game Kit on ck-exec (CrowdyJS 18.11.0, CrowdyCPP 0.64.0).** `client.kit(app_id)`
|
|
55
|
+
gains typed clients for the ck-exec starter hubs, the client half of the game kit whose server
|
|
56
|
+
half is `ckx_sdk::kit`: `kit.world` (conditions and resource nodes mirrored, harvests, liveops for
|
|
57
|
+
developers), `kit.matchmaking.queue(name)` (parties matched whole), `kit.sessions.open(key)` (lobby
|
|
58
|
+
to result), `kit.npcs.area(key)` (mobs, NPCs, players' pets), `kit.topology` (compose, check, build
|
|
59
|
+
and deploy the starters), and `kit.spectate`, `kit.emotes` and `kit.shards`. They share one exec
|
|
60
|
+
connection (`kit.runtime`) that paces calls under the gateway's limit, resends only what is safe
|
|
61
|
+
and mirrors topics with resync on gaps, epochs and reconnects; a hub's refusal is a `KitError`
|
|
62
|
+
with its `code`. Both clients have it: the blocking one runs a mirror's resync beside the
|
|
63
|
+
connection's reader thread. Exec reconnects wait with jitter. See [MIGRATION.md](MIGRATION.md).
|
|
64
|
+
|
|
54
65
|
**v0.11.0: access that ends ends for good, and channel and team bans (CrowdyJS 18.10.0, CrowdyCPP
|
|
55
66
|
0.63.0).** A host's `4403` close (ck-exec 0.16: the player was suspended, revoked, signed out or
|
|
56
67
|
blocked) is final: `ExecConnection.on_access_ended` hears the reason, the call in flight fails
|
|
@@ -300,6 +311,33 @@ cannot hold (a type outside 0-255, a position outside 0-15) is kept in the chunk
|
|
|
300
311
|
applied a second time. A game with other addressing reads every edit from
|
|
301
312
|
`session.on("voxel_update", ...)`, which includes those echoes.
|
|
302
313
|
|
|
314
|
+
## Game Kit
|
|
315
|
+
|
|
316
|
+
`client.kit(app_id)` drives the ck-exec starter hubs (the server half is `ckx_sdk::kit`), with
|
|
317
|
+
the same modules as CrowdyJS's `client.kit(appId)`:
|
|
318
|
+
|
|
319
|
+
```python
|
|
320
|
+
kit = game.kit(app_id)
|
|
321
|
+
await kit.world.conditions.start() # mirrored: time of day, weather, liveops modifiers
|
|
322
|
+
queue = kit.matchmaking.queue("ranked")
|
|
323
|
+
queue.on_matched(lambda session: print("matched into", session))
|
|
324
|
+
await queue.join(1200)
|
|
325
|
+
watching = asyncio.create_task(queue.watch()) # asks while the player waits
|
|
326
|
+
try:
|
|
327
|
+
await kit.npcs.area_at(12, -3).attack(4)
|
|
328
|
+
except KitError as e:
|
|
329
|
+
if e.code == "cooldown":
|
|
330
|
+
...
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
`kit.world`, `kit.matchmaking`, `kit.sessions`, `kit.npcs` and `kit.topology` (compose, check,
|
|
334
|
+
build and deploy the starters) share one exec connection (`kit.runtime`): it paces calls under the
|
|
335
|
+
gateway's 120 per 10 s, sends a call again only when that is safe (it did not run, or it carries
|
|
336
|
+
an `action_id` the hub answers once), and its mirrors (`HubState`, `CollectionMirror`,
|
|
337
|
+
`PrivateState`) take a new snapshot after a gap, another epoch or a reconnect. `kit.spectate`,
|
|
338
|
+
`kit.emotes` and `kit.shards` are the client conventions, and `kit.social` the parties, guilds and
|
|
339
|
+
chat rooms. The blocking client's kit is the same, with blocking calls.
|
|
340
|
+
|
|
303
341
|
## Crowdy Studio
|
|
304
342
|
|
|
305
343
|
```python
|
|
@@ -11,6 +11,17 @@ CrowdyPy follows the [CrowdyJS](https://github.com/CrowdedKingdoms/CrowdyJS) API
|
|
|
11
11
|
client, bound with [nanobind](https://github.com/wjakob/nanobind) and shipped inside the
|
|
12
12
|
wheel. Python never touches a datagram.
|
|
13
13
|
|
|
14
|
+
**v0.12.0: the Game Kit on ck-exec (CrowdyJS 18.11.0, CrowdyCPP 0.64.0).** `client.kit(app_id)`
|
|
15
|
+
gains typed clients for the ck-exec starter hubs, the client half of the game kit whose server
|
|
16
|
+
half is `ckx_sdk::kit`: `kit.world` (conditions and resource nodes mirrored, harvests, liveops for
|
|
17
|
+
developers), `kit.matchmaking.queue(name)` (parties matched whole), `kit.sessions.open(key)` (lobby
|
|
18
|
+
to result), `kit.npcs.area(key)` (mobs, NPCs, players' pets), `kit.topology` (compose, check, build
|
|
19
|
+
and deploy the starters), and `kit.spectate`, `kit.emotes` and `kit.shards`. They share one exec
|
|
20
|
+
connection (`kit.runtime`) that paces calls under the gateway's limit, resends only what is safe
|
|
21
|
+
and mirrors topics with resync on gaps, epochs and reconnects; a hub's refusal is a `KitError`
|
|
22
|
+
with its `code`. Both clients have it: the blocking one runs a mirror's resync beside the
|
|
23
|
+
connection's reader thread. Exec reconnects wait with jitter. See [MIGRATION.md](MIGRATION.md).
|
|
24
|
+
|
|
14
25
|
**v0.11.0: access that ends ends for good, and channel and team bans (CrowdyJS 18.10.0, CrowdyCPP
|
|
15
26
|
0.63.0).** A host's `4403` close (ck-exec 0.16: the player was suspended, revoked, signed out or
|
|
16
27
|
blocked) is final: `ExecConnection.on_access_ended` hears the reason, the call in flight fails
|
|
@@ -260,6 +271,33 @@ cannot hold (a type outside 0-255, a position outside 0-15) is kept in the chunk
|
|
|
260
271
|
applied a second time. A game with other addressing reads every edit from
|
|
261
272
|
`session.on("voxel_update", ...)`, which includes those echoes.
|
|
262
273
|
|
|
274
|
+
## Game Kit
|
|
275
|
+
|
|
276
|
+
`client.kit(app_id)` drives the ck-exec starter hubs (the server half is `ckx_sdk::kit`), with
|
|
277
|
+
the same modules as CrowdyJS's `client.kit(appId)`:
|
|
278
|
+
|
|
279
|
+
```python
|
|
280
|
+
kit = game.kit(app_id)
|
|
281
|
+
await kit.world.conditions.start() # mirrored: time of day, weather, liveops modifiers
|
|
282
|
+
queue = kit.matchmaking.queue("ranked")
|
|
283
|
+
queue.on_matched(lambda session: print("matched into", session))
|
|
284
|
+
await queue.join(1200)
|
|
285
|
+
watching = asyncio.create_task(queue.watch()) # asks while the player waits
|
|
286
|
+
try:
|
|
287
|
+
await kit.npcs.area_at(12, -3).attack(4)
|
|
288
|
+
except KitError as e:
|
|
289
|
+
if e.code == "cooldown":
|
|
290
|
+
...
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
`kit.world`, `kit.matchmaking`, `kit.sessions`, `kit.npcs` and `kit.topology` (compose, check,
|
|
294
|
+
build and deploy the starters) share one exec connection (`kit.runtime`): it paces calls under the
|
|
295
|
+
gateway's 120 per 10 s, sends a call again only when that is safe (it did not run, or it carries
|
|
296
|
+
an `action_id` the hub answers once), and its mirrors (`HubState`, `CollectionMirror`,
|
|
297
|
+
`PrivateState`) take a new snapshot after a gap, another epoch or a reconnect. `kit.spectate`,
|
|
298
|
+
`kit.emotes` and `kit.shards` are the client conventions, and `kit.social` the parties, guilds and
|
|
299
|
+
chat rooms. The blocking client's kit is the same, with blocking calls.
|
|
300
|
+
|
|
263
301
|
## Crowdy Studio
|
|
264
302
|
|
|
265
303
|
```python
|
|
@@ -5,7 +5,7 @@ are in `pyproject.toml` (`[project].version`, `[tool.crowdypy.crowdyjs]`,
|
|
|
5
5
|
`[tool.crowdypy.crowdycpp]`); `tests/unit/test_release_versions.py` refuses this page when
|
|
6
6
|
its version disagrees.
|
|
7
7
|
|
|
8
|
-
- CrowdyPy `0.
|
|
8
|
+
- CrowdyPy `0.12.0`
|
|
9
9
|
- API surface: CrowdyJS (the pinned version and commit in `pyproject.toml`); the generated
|
|
10
10
|
`docs/parity-matrix.md` lists every covered method, every native equivalent and every
|
|
11
11
|
browser exclusion with its reason. The gate is strict: there are no portable gaps, and a
|
|
@@ -58,6 +58,7 @@ player once and signs it in for the later suites.
|
|
|
58
58
|
| 2026-10-08 | local stack: ck-api at the distance-limited channel branch (off `dev`), two replication servers serving message type 32, the 3-node Citus lab | 0.6.0 (branch) | identity, ranged channel, replication, world and world data suites: 10 passed |
|
|
59
59
|
| 2026-10-09 | dev tier, app `96701660793088`, after replication server v0.35.0 and ck-api v2.38.0 reached dev | `crowdypy 0.6.0.dev1` from PyPI (installed into a clean Python 3.12 with uv) | identity (incl. the terms gate), ranged channel, replication, world and world data suites: 10 passed |
|
|
60
60
|
| 2026-10-13 | dev tier (ck-api v2.42.0), app `96701660793088`, the `harness` provisioning token with `CROWDY_E2E_EMAIL=crowdy-e2e-py@test.invalid` | 0.10.0 (branch, vendoring CrowdyCPP `dev/v0.62.0`) | identity (the terms-gate case now registers with the token and no consents), input log, ranged channel, replication, world and world data suites: 12 passed; open grid (needs `CROWDY_E2E_THROWAWAY_OWNER=1`) and Studio skipped |
|
|
61
|
+
| 2026-10-14 | dev tier (ck-api v2.44.1, replication server v0.39.0), app `96701660793088`, the `harness` provisioning token | 0.11.0 (`dev` at `586fc40`, vendoring CrowdyCPP 0.63.0) | identity, input log, ranged channel, replication, world and world data suites: 12 passed; open grid (needs `CROWDY_E2E_THROWAWAY_OWNER=1`) and Studio skipped |
|
|
61
62
|
|
|
62
63
|
## Not covered here
|
|
63
64
|
|
|
@@ -73,6 +74,7 @@ These CrowdyCPP suites have no CrowdyPy counterpart yet; the reason is in each r
|
|
|
73
74
|
| `e2e_soak_two_clients`, `e2e_permission_refresh` | long-running; slated for `CROWDY_E2E_SLOW=1` suites |
|
|
74
75
|
| `e2e_host_election`, `e2e_durable_stores`, `e2e_chunk_store_live` | the World Stores' host, save and chunk persistence run over GraphQL timers covered by unit suites against fakes; live coverage needs a dedicated app (chunk write-back closes the wilderness) |
|
|
75
76
|
| `e2e_cross_app`, `e2e_cross_tenant`, `e2e_malicious_input` | platform isolation properties the CrowdyCPP suites already exercise against the same API |
|
|
77
|
+
| `e2e_bans_blocks` | 0.11.0's `channels.ban` / `teams.ban`, `account_blocked_of` and `group_member_banned_of` send the documents CrowdyCPP's suite exercises live, and the unit suites check them against a mocked API; an account block needs the tier operator's credentials. The tier round trip and the nightly identity probe run the same bans and blocks on each tier |
|
|
76
78
|
|
|
77
79
|
0.8.0's additions (channel audio, the echo of your own voxel edit, `APP_PAUSED`, access
|
|
78
80
|
suspension, player profiles, `exec.restart_type`) have no live suite yet, in CrowdyPy or in
|
|
@@ -4,16 +4,16 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
4
4
|
|
|
5
5
|
## Target
|
|
6
6
|
|
|
7
|
-
- CrowdyJS: `18.
|
|
8
|
-
- CrowdyCPP (native core): `0.
|
|
7
|
+
- CrowdyJS: `18.11.0` at `5167437788a8ea683d2fde6d3bafa2639feaa45e`
|
|
8
|
+
- CrowdyCPP (native core): `0.64.0` at `78ac8396d4bd0b3bfdd271c867f480e471488095`
|
|
9
9
|
- schema.gql identical to CrowdyJS's: yes
|
|
10
10
|
- Gate mode: strict portable parity (every portable gap is release-blocking)
|
|
11
11
|
|
|
12
12
|
## Summary
|
|
13
13
|
|
|
14
|
-
- Covered:
|
|
14
|
+
- Covered: 1146
|
|
15
15
|
- Portable gap: 0
|
|
16
|
-
- Native equivalent:
|
|
16
|
+
- Native equivalent: 44
|
|
17
17
|
- Browser exclusion: 113
|
|
18
18
|
- Deprecated roots: 2
|
|
19
19
|
- Unclassified: 0
|
|
@@ -462,6 +462,7 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
462
462
|
| `ChannelsAPI -> ChannelsAPI` | covered |
|
|
463
463
|
| `ChunkStore -> ChunkStore` | covered |
|
|
464
464
|
| `ChunksAPI -> ChunksAPI` | covered |
|
|
465
|
+
| `CollectionMirror -> CollectionMirror` | covered |
|
|
465
466
|
| `CrowdyClient -> AsyncCrowdyClient` | covered |
|
|
466
467
|
| `CrowdyStudioAPI -> CrowdyStudioAPI` | covered |
|
|
467
468
|
| `CrowdyStudioController -> CrowdyStudioController` | covered |
|
|
@@ -472,11 +473,14 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
472
473
|
| `CrowdyStudioTextHud -> (none)` | browser exclusion — HUD layer renders text-only player presentation into game-owned DOM |
|
|
473
474
|
| `DiscoveryDomain -> DiscoveryDomain` | covered |
|
|
474
475
|
| `EmbeddedHost -> (none)` | browser exclusion — iframe/postMessage bridge to the first-party shell page; there is no frame around a Python client |
|
|
476
|
+
| `EmotesKit -> EmotesKit` | covered |
|
|
475
477
|
| `ErrorStore -> ErrorStore` | covered |
|
|
476
478
|
| `EventRouter -> EventRouter` | covered |
|
|
477
479
|
| `ExecAPI -> ExecAPI` | covered |
|
|
478
480
|
| `ExecConnection -> ExecConnection` | covered |
|
|
479
481
|
| `GameAppsAPI -> GameAppsAPI` | covered |
|
|
482
|
+
| `GameKitClient -> GameKitClient` | covered |
|
|
483
|
+
| `GameSessionHandle -> GameSessionHandle` | covered |
|
|
480
484
|
| `GraphQLClient -> AsyncGraphQLClient` | covered |
|
|
481
485
|
| `GridScope -> GridScope` | covered |
|
|
482
486
|
| `GridsAPI -> GridsAPI` | covered |
|
|
@@ -484,20 +488,32 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
484
488
|
| `HostTracker -> HostTracker` | covered |
|
|
485
489
|
| `HostingAPI -> (none)` | browser exclusion — wrapper over the Crowdy Games hosting roots, which publish browser bundles; no Python client publishes one (CrowdyCPP classifies it the same way) |
|
|
486
490
|
| `InputLogAPI -> InputLogAPI` | covered |
|
|
491
|
+
| `KitError -> KitError` | covered |
|
|
492
|
+
| `KitRuntime -> KitRuntime` | covered |
|
|
493
|
+
| `KitTopology -> KitTopology` | covered |
|
|
487
494
|
| `LocalActorStore -> LocalActorStore` | covered |
|
|
488
495
|
| `MarketplaceAPI -> MarketplaceAPI` | covered |
|
|
496
|
+
| `MatchQueue -> MatchQueue` | covered |
|
|
497
|
+
| `MatchmakingKit -> MatchmakingKit` | covered |
|
|
498
|
+
| `NpcArea -> NpcArea` | covered |
|
|
499
|
+
| `NpcsKit -> NpcsKit` | covered |
|
|
489
500
|
| `OrganizationsAPI -> OrganizationsAPI` | covered |
|
|
490
501
|
| `PaymentsAPI -> PaymentsAPI` | covered |
|
|
491
502
|
| `PlatformAPI -> PlatformAPI` | covered |
|
|
492
503
|
| `PlayerWalletAPI -> PlayerWalletAPI` | covered |
|
|
493
504
|
| `PortalAPI -> PortalAPI` | covered |
|
|
505
|
+
| `PrivateState -> PrivateState` | covered |
|
|
494
506
|
| `QuotasAPI -> QuotasAPI` | covered |
|
|
495
507
|
| `RemoteActorLane -> RemoteActorLane` | covered |
|
|
496
508
|
| `RemoteActorStore -> RemoteActorStore` | covered |
|
|
497
509
|
| `SaveStateStore -> SaveStateStore` | covered |
|
|
498
510
|
| `ServerStatusAPI -> ServerStatusAPI` | covered |
|
|
511
|
+
| `SessionsKit -> SessionsKit` | covered |
|
|
512
|
+
| `ShardKit -> ShardKit` | covered |
|
|
499
513
|
| `SharedEnvironmentAPI -> SharedEnvironmentAPI` | covered |
|
|
500
514
|
| `SocialKit -> SocialKit` | covered |
|
|
515
|
+
| `SpectateKit -> SpectateKit` | covered |
|
|
516
|
+
| `SpectatorHeartbeat -> SpectatorHeartbeat` | covered |
|
|
501
517
|
| `StateAPI -> StateAPI` | covered |
|
|
502
518
|
| `StudioLayoutController -> StudioLayoutController` | covered |
|
|
503
519
|
| `TeamsAPI -> TeamsAPI` | covered |
|
|
@@ -512,7 +528,9 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
512
528
|
| `WorkerMessageReader -> (none)` | browser exclusion — binds vscode-jsonrpc to browser Web Worker messaging |
|
|
513
529
|
| `WorkerMessageWriter -> (none)` | browser exclusion — binds vscode-jsonrpc to browser Web Worker messaging |
|
|
514
530
|
| `WorldClient -> WorldClient` | covered |
|
|
531
|
+
| `WorldKit -> WorldKit` | covered |
|
|
515
532
|
| `WorldSessionCore -> WorldSessionCore` | covered |
|
|
533
|
+
| `WritableKitStore -> WritableKitStore` | covered |
|
|
516
534
|
|
|
517
535
|
## Methods
|
|
518
536
|
|
|
@@ -667,6 +685,8 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
667
685
|
| `ChunksAPI.updateLods` | covered |
|
|
668
686
|
| `ChunksAPI.updateState` | covered |
|
|
669
687
|
| `ChunksAPI.voxelList` | covered |
|
|
688
|
+
| `CollectionMirror.list` | covered |
|
|
689
|
+
| `CollectionMirror.member` | covered |
|
|
670
690
|
| `CrowdyClient.close` | native equivalent — AsyncCrowdyClient.aclose(), the asyncio spelling; the blocking CrowdyClient has close() |
|
|
671
691
|
| `CrowdyClient.getToken` | covered |
|
|
672
692
|
| `CrowdyClient.graphqlEndpoint` | covered |
|
|
@@ -745,6 +765,8 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
745
765
|
| `CrowdyStudioGitHubTransport.unbind` | covered |
|
|
746
766
|
| `DiscoveryDomain.app` | covered |
|
|
747
767
|
| `DiscoveryDomain.apps` | covered |
|
|
768
|
+
| `EmotesKit.parse` | covered |
|
|
769
|
+
| `EmotesKit.send` | covered |
|
|
748
770
|
| `ErrorStore.clear` | covered |
|
|
749
771
|
| `ErrorStore.last` | covered |
|
|
750
772
|
| `ErrorStore.lastFor` | covered |
|
|
@@ -826,6 +848,25 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
826
848
|
| `GameAppsAPI.setPermissionLimits` | covered |
|
|
827
849
|
| `GameAppsAPI.transferOwnership` | covered |
|
|
828
850
|
| `GameAppsAPI.userPermissions` | covered |
|
|
851
|
+
| `GameKitClient.close` | covered |
|
|
852
|
+
| `GameKitClient.emotes` | covered |
|
|
853
|
+
| `GameKitClient.matchmaking` | covered |
|
|
854
|
+
| `GameKitClient.npcs` | covered |
|
|
855
|
+
| `GameKitClient.sessions` | covered |
|
|
856
|
+
| `GameKitClient.shards` | covered |
|
|
857
|
+
| `GameKitClient.spectate` | covered |
|
|
858
|
+
| `GameKitClient.topology` | covered |
|
|
859
|
+
| `GameKitClient.world` | covered |
|
|
860
|
+
| `GameSessionHandle.act` | covered |
|
|
861
|
+
| `GameSessionHandle.configure` | covered |
|
|
862
|
+
| `GameSessionHandle.currentTurn` | covered |
|
|
863
|
+
| `GameSessionHandle.isMyTurn` | covered |
|
|
864
|
+
| `GameSessionHandle.join` | covered |
|
|
865
|
+
| `GameSessionHandle.leave` | covered |
|
|
866
|
+
| `GameSessionHandle.ready` | covered |
|
|
867
|
+
| `GameSessionHandle.startGame` | covered |
|
|
868
|
+
| `GameSessionHandle.unwatch` | covered |
|
|
869
|
+
| `GameSessionHandle.watch` | covered |
|
|
829
870
|
| `GraphQLClient.endpoint` | covered |
|
|
830
871
|
| `GraphQLClient.getEndpoint` | covered |
|
|
831
872
|
| `GraphQLClient.query` | covered |
|
|
@@ -858,6 +899,19 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
858
899
|
| `HostTracker.onHostChanged` | covered |
|
|
859
900
|
| `InputLogAPI.messages` | covered |
|
|
860
901
|
| `InputLogAPI.sessions` | covered |
|
|
902
|
+
| `KitError.from` | native equivalent — KitError.from_error(error): `from` is a Python keyword |
|
|
903
|
+
| `KitRuntime.call` | covered |
|
|
904
|
+
| `KitRuntime.close` | covered |
|
|
905
|
+
| `KitRuntime.connection` | covered |
|
|
906
|
+
| `KitRuntime.onAccessEnded` | covered |
|
|
907
|
+
| `KitRuntime.onReconnect` | covered |
|
|
908
|
+
| `KitRuntime.playerId` | covered |
|
|
909
|
+
| `KitRuntime.subscribe` | covered |
|
|
910
|
+
| `KitRuntime.subscriptions` | covered |
|
|
911
|
+
| `KitTopology.deploy` | covered |
|
|
912
|
+
| `KitTopology.pack` | covered |
|
|
913
|
+
| `KitTopology.plan` | covered |
|
|
914
|
+
| `KitTopology.types` | covered |
|
|
861
915
|
| `LocalActorStore.chunk` | covered |
|
|
862
916
|
| `LocalActorStore.join` | covered |
|
|
863
917
|
| `LocalActorStore.lastAck` | covered |
|
|
@@ -883,6 +937,33 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
883
937
|
| `MarketplaceAPI.setGridClaimPolicy` | covered |
|
|
884
938
|
| `MarketplaceAPI.setListingStatus` | covered |
|
|
885
939
|
| `MarketplaceAPI.transferListing` | covered |
|
|
940
|
+
| `MatchQueue.accept` | covered |
|
|
941
|
+
| `MatchQueue.configure` | covered |
|
|
942
|
+
| `MatchQueue.decline` | covered |
|
|
943
|
+
| `MatchQueue.join` | covered |
|
|
944
|
+
| `MatchQueue.leave` | covered |
|
|
945
|
+
| `MatchQueue.onMatched` | covered |
|
|
946
|
+
| `MatchQueue.place` | covered |
|
|
947
|
+
| `MatchQueue.status` | covered |
|
|
948
|
+
| `MatchQueue.unwatch` | covered |
|
|
949
|
+
| `MatchQueue.watch` | covered |
|
|
950
|
+
| `MatchmakingKit.queue` | covered |
|
|
951
|
+
| `NpcArea.adopt` | covered |
|
|
952
|
+
| `NpcArea.attack` | covered |
|
|
953
|
+
| `NpcArea.dismiss` | covered |
|
|
954
|
+
| `NpcArea.mobs` | covered |
|
|
955
|
+
| `NpcArea.myPets` | covered |
|
|
956
|
+
| `NpcArea.npcs` | covered |
|
|
957
|
+
| `NpcArea.pets` | covered |
|
|
958
|
+
| `NpcArea.release` | covered |
|
|
959
|
+
| `NpcArea.rename` | covered |
|
|
960
|
+
| `NpcArea.summon` | covered |
|
|
961
|
+
| `NpcArea.talk` | covered |
|
|
962
|
+
| `NpcArea.unwatch` | covered |
|
|
963
|
+
| `NpcArea.watch` | covered |
|
|
964
|
+
| `NpcsKit.area` | covered |
|
|
965
|
+
| `NpcsKit.areaAt` | covered |
|
|
966
|
+
| `NpcsKit.keyAt` | covered |
|
|
886
967
|
| `OrganizationsAPI.bySlug` | covered |
|
|
887
968
|
| `OrganizationsAPI.create` | covered |
|
|
888
969
|
| `OrganizationsAPI.createRole` | covered |
|
|
@@ -935,6 +1016,11 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
935
1016
|
| `PortalAPI.revokeAppAuthorization` | covered |
|
|
936
1017
|
| `PortalAPI.setAppClientSettings` | covered |
|
|
937
1018
|
| `PortalAPI.signIn` | browser exclusion — hosted sign-in navigates the browser to Studio /authorize (ck-api v1.88.0); a a Python client client sends no Origin header, signs in with auth().login and mints directly |
|
|
1019
|
+
| `PrivateState.get` | covered |
|
|
1020
|
+
| `PrivateState.refresh` | covered |
|
|
1021
|
+
| `PrivateState.start` | covered |
|
|
1022
|
+
| `PrivateState.stop` | covered |
|
|
1023
|
+
| `PrivateState.subscribe` | covered |
|
|
938
1024
|
| `QuotasAPI.effective` | covered |
|
|
939
1025
|
| `QuotasAPI.forApp` | covered |
|
|
940
1026
|
| `QuotasAPI.forOrg` | covered |
|
|
@@ -975,6 +1061,9 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
975
1061
|
| `ServerStatusAPI.listAll` | covered |
|
|
976
1062
|
| `ServerStatusAPI.serverWithLeastClients` | covered |
|
|
977
1063
|
| `ServerStatusAPI.versionInfo` | covered |
|
|
1064
|
+
| `SessionsKit.open` | covered |
|
|
1065
|
+
| `ShardKit.around` | covered |
|
|
1066
|
+
| `ShardKit.key` | covered |
|
|
978
1067
|
| `SharedEnvironmentAPI.appRuntimeState` | covered |
|
|
979
1068
|
| `SharedEnvironmentAPI.appSubscription` | covered |
|
|
980
1069
|
| `SharedEnvironmentAPI.autoBilling` | covered |
|
|
@@ -1005,6 +1094,10 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
1005
1094
|
| `SocialKit.party.join` | covered |
|
|
1006
1095
|
| `SocialKit.party.leave` | covered |
|
|
1007
1096
|
| `SocialKit.party.members` | covered |
|
|
1097
|
+
| `SpectateKit.observe` | covered |
|
|
1098
|
+
| `SpectatorHeartbeat.error` | covered |
|
|
1099
|
+
| `SpectatorHeartbeat.moveTo` | covered |
|
|
1100
|
+
| `SpectatorHeartbeat.stop` | covered |
|
|
1008
1101
|
| `StateAPI.delete` | covered |
|
|
1009
1102
|
| `StateAPI.getAll` | covered |
|
|
1010
1103
|
| `StateAPI.getOne` | covered |
|
|
@@ -1079,11 +1172,18 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
1079
1172
|
| `VoxelsAPI.update` | covered |
|
|
1080
1173
|
| `WorldClient.actor` | covered |
|
|
1081
1174
|
| `WorldClient.subscribe` | covered |
|
|
1175
|
+
| `WorldKit.cancel` | covered |
|
|
1176
|
+
| `WorldKit.harvest` | covered |
|
|
1177
|
+
| `WorldKit.schedule` | covered |
|
|
1178
|
+
| `WorldKit.state` | covered |
|
|
1082
1179
|
| `WorldSessionCore.dispose` | covered |
|
|
1083
1180
|
| `WorldSessionCore.on` | covered |
|
|
1084
1181
|
| `WorldSessionCore.onDispose` | covered |
|
|
1085
1182
|
| `WorldSessionCore.setSendTracker` | covered |
|
|
1086
1183
|
| `WorldSessionCore.trackSend` | covered |
|
|
1184
|
+
| `WritableKitStore.get` | covered |
|
|
1185
|
+
| `WritableKitStore.set` | covered |
|
|
1186
|
+
| `WritableKitStore.subscribe` | covered |
|
|
1087
1187
|
|
|
1088
1188
|
## Package exports
|
|
1089
1189
|
|
|
@@ -1119,33 +1219,18 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
1119
1219
|
| `CrowdyTimeoutError` | covered |
|
|
1120
1220
|
| `CrowdyUserCodeFaultError` | covered |
|
|
1121
1221
|
| `EMBEDDED_HOST_PROTOCOL_VERSION` | browser exclusion — iframe/postMessage bridge to the first-party shell page; there is no frame around a Python client |
|
|
1122
|
-
| `EVENT_ABILITY` | covered |
|
|
1123
|
-
| `EVENT_CONTACT_DAMAGE` | covered |
|
|
1124
|
-
| `EVENT_CONTROL_POINT` | covered |
|
|
1125
|
-
| `EVENT_MOVEMENT_VIOLATION` | covered |
|
|
1126
|
-
| `EVENT_PROPOSAL` | covered |
|
|
1127
|
-
| `EVENT_RACE_TIMING` | covered |
|
|
1128
|
-
| `EVENT_SCORE` | covered |
|
|
1129
|
-
| `EVENT_TURN` | covered |
|
|
1130
|
-
| `EVENT_WEATHER` | covered |
|
|
1131
|
-
| `EVENT_ZONE_CHANGE` | covered |
|
|
1132
1222
|
| `EXEC_CLIENT_ABI_IMPORTS` | covered |
|
|
1133
1223
|
| `EXEC_CLIENT_ABI_VERSION` | covered |
|
|
1134
1224
|
| `EXEC_CLIENT_HOST_CALLS` | browser exclusion — page-side broker for player WASM in the browser glue Web Worker (worker lifecycle, host-call allowlists, rate caps, watchdogs) |
|
|
1135
1225
|
| `EXEC_CLOSE_ACCESS_ENDED` | covered |
|
|
1136
1226
|
| `EXEC_STATUSES` | covered |
|
|
1137
1227
|
| `ExecModScope` | covered |
|
|
1138
|
-
| `FLAG_GROUNDED` | covered |
|
|
1139
|
-
| `FLAG_MOB` | covered |
|
|
1140
|
-
| `FLAG_NPC` | covered |
|
|
1141
|
-
| `FLAG_RESERVED3` | covered |
|
|
1142
1228
|
| `GLUE_HOST_CALL_REQUEST_MAX_BYTES` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
|
|
1143
1229
|
| `GLUE_HOST_FUNCTIONS` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
|
|
1144
1230
|
| `GLUE_INVOKE_REPLY_MAX_BYTES` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
|
|
1145
1231
|
| `GLUE_LOG_MAX_BYTES` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
|
|
1146
1232
|
| `GLUE_STATE_MAX_BYTES` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
|
|
1147
1233
|
| `GROUP_MEMBER_BANNED_CODE` | covered |
|
|
1148
|
-
| `GameKitClient` | covered |
|
|
1149
1234
|
| `GlueRuntime` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
|
|
1150
1235
|
| `GraphQLTransport` | native equivalent — pass an httpx.AsyncClient / httpx.Client as http_client= (transport, proxies, HTTP/2, timeouts) |
|
|
1151
1236
|
| `GridScopeError` | covered |
|
|
@@ -1157,7 +1242,6 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
1157
1242
|
| `PLAYER_CODE_LOG_LINES_PER_SECOND` | browser exclusion — page-side broker for player WASM in the browser glue Web Worker (worker lifecycle, host-call allowlists, rate caps, watchdogs) |
|
|
1158
1243
|
| `PLAYER_CODE_LOG_MAX_CHARS` | browser exclusion — page-side broker for player WASM in the browser glue Web Worker (worker lifecycle, host-call allowlists, rate caps, watchdogs) |
|
|
1159
1244
|
| `PLAYER_PROFILES_MAX` | covered |
|
|
1160
|
-
| `POSE_BYTES` | covered |
|
|
1161
1245
|
| `PlayerCodeBroker` | browser exclusion — page-side broker for player WASM in the browser glue Web Worker (worker lifecycle, host-call allowlists, rate caps, watchdogs) |
|
|
1162
1246
|
| `PortalConsentRequiredError` | covered |
|
|
1163
1247
|
| `RELAY_MAX_BUNDLE_MEMBERS` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.MAX_BUNDLE_MEMBERS |
|
|
@@ -1200,21 +1284,18 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
1200
1284
|
| `createMintRediscover` | covered |
|
|
1201
1285
|
| `createSignContext` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.encode_long_spatial / spatial_hmac take the token directly |
|
|
1202
1286
|
| `decodeBase64` | covered |
|
|
1203
|
-
| `decodeEnginePose` | covered |
|
|
1204
1287
|
| `decodeExecFrame` | covered |
|
|
1205
1288
|
| `decodeVoicePacket` | covered |
|
|
1206
1289
|
| `defaultClientGridEventBus` | browser exclusion — page-local event bus between CLIENT mods running in this browser's glue workers |
|
|
1207
1290
|
| `defaultHostedSignInUrl` | covered |
|
|
1208
1291
|
| `encodeBase64` | covered |
|
|
1209
|
-
| `encodeEnginePose` | covered |
|
|
1210
1292
|
| `encodeExecFrame` | covered |
|
|
1211
1293
|
| `encodeVoiceHeader` | covered |
|
|
1212
1294
|
| `encodeVoicePacket` | covered |
|
|
1213
|
-
| `engineLanes` | covered |
|
|
1214
|
-
| `enginePoseCodec` | covered |
|
|
1215
1295
|
| `execGatewayRefusal` | covered |
|
|
1216
1296
|
| `execModType` | covered |
|
|
1217
1297
|
| `execStatus` | covered |
|
|
1298
|
+
| `execWireIntegers` | native equivalent — msgspec writes a Python int as a msgpack integer of its width, so there is no float for a hub's integer field to refuse; @msgpack/msgpack writes a JS number of 2^32 or more as a float without it |
|
|
1218
1299
|
| `fragmentFrame` | covered |
|
|
1219
1300
|
| `generateCrowdyUuid` | covered |
|
|
1220
1301
|
| `generatePkcePair` | covered |
|
|
@@ -1234,24 +1315,11 @@ Generated by `tools/parity/parity.py`; do not edit by hand. Classifications live
|
|
|
1234
1315
|
| `moveFromError` | covered |
|
|
1235
1316
|
| `moveFromErrors` | covered |
|
|
1236
1317
|
| `packMessageBundle` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.bundle |
|
|
1237
|
-
| `parseAbilityEvent` | covered |
|
|
1238
|
-
| `parseContactDamage` | covered |
|
|
1239
|
-
| `parseControlPointEvent` | covered |
|
|
1240
|
-
| `parseEngineEvent` | covered |
|
|
1241
1318
|
| `parseFuelBudget` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
|
|
1242
|
-
| `parseMovementViolation` | covered |
|
|
1243
|
-
| `parseProposalEvent` | covered |
|
|
1244
|
-
| `parseRaceTimingEvent` | covered |
|
|
1245
1319
|
| `parseRelayFrame` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.parse_datagram (a relay frame is one datagram) |
|
|
1246
|
-
| `parseScoreEvent` | covered |
|
|
1247
|
-
| `parseTurnEvent` | covered |
|
|
1248
1320
|
| `parseVideoFragmentHeader` | covered |
|
|
1249
|
-
| `parseWeatherEvent` | covered |
|
|
1250
|
-
| `parseZoneChangeEvent` | covered |
|
|
1251
1321
|
| `payloadBytesOf` | native equivalent — connection.stats(): CrowdyCPP's counters (datagrams, messages and bytes, by message type) |
|
|
1252
1322
|
| `playerFaultOf` | covered |
|
|
1253
|
-
| `poseSuffix` | covered |
|
|
1254
|
-
| `runOptimisticAction` | covered |
|
|
1255
1323
|
| `runWithWatchdog` | browser exclusion — glue that instantiates player WASM inside the browser Web Worker (CLIENT ABI imports, ck_fuel, watchdog) |
|
|
1256
1324
|
| `serializeActorUpdate` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.encode_long_spatial with the message type |
|
|
1257
1325
|
| `serializeAudioPacket` | native equivalent — the same codec, CrowdyCPP's, through crowdypy.wire: crowdypy.wire.encode_long_spatial with the message type |
|
|
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "crowdypy"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.12.0.dev1"
|
|
8
8
|
description = "Official Python SDK for Crowded Kingdoms: typed GraphQL clients and a native UDP replication core"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT AND Apache-2.0"
|
|
@@ -119,14 +119,14 @@ environment = { OPENSSL_ROOT_DIR = "C:/vcpkg/installed/x64-windows-static-md" }
|
|
|
119
119
|
# --------------------------------------------------------------------------------------
|
|
120
120
|
|
|
121
121
|
[tool.crowdypy.crowdyjs]
|
|
122
|
-
version = "18.
|
|
123
|
-
commit = "
|
|
122
|
+
version = "18.11.0"
|
|
123
|
+
commit = "5167437788a8ea683d2fde6d3bafa2639feaa45e"
|
|
124
124
|
|
|
125
125
|
[tool.crowdypy.crowdycpp]
|
|
126
|
-
version = "0.
|
|
127
|
-
tag = "dev/v0.
|
|
128
|
-
commit = "
|
|
129
|
-
tree-sha256 = "
|
|
126
|
+
version = "0.64.0"
|
|
127
|
+
tag = "dev/v0.64.0"
|
|
128
|
+
commit = "78ac8396d4bd0b3bfdd271c867f480e471488095"
|
|
129
|
+
tree-sha256 = "db5facc1d3ad24f049623916e71a1020d9f6cdb79bc8fa9df091f926f67aa053"
|
|
130
130
|
|
|
131
131
|
# schema.gql and operations/ are CrowdyJS's, copied from the commit pinned above by
|
|
132
132
|
# scripts/schema_sync.py, which records these hashes and re-derives them in CI.
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
The async modules are the source of truth: ``graphql.py``, ``client.py``,
|
|
8
8
|
``rediscover.py``, ``grid_scope.py``, ``world.py``, ``stores.py``, ``domains/`` and
|
|
9
9
|
``kit/``. A token-level rewrite (formatting is preserved) drops ``async``/``await``, maps
|
|
10
|
-
the async names to their blocking twins
|
|
11
|
-
``crowdypy._sync``. ``asyncio.sleep`` becomes ``time.sleep``; any other use of asyncio in a
|
|
10
|
+
the async names to their blocking twins, unwraps ``Awaitable[X]`` to ``X`` and points imports
|
|
11
|
+
of those modules at ``crowdypy._sync``. ``asyncio.sleep`` becomes ``time.sleep``; any other use of asyncio in a
|
|
12
12
|
source module is refused, because it would have no blocking equivalent.
|
|
13
13
|
"""
|
|
14
14
|
|
|
@@ -54,6 +54,7 @@ NAMES = {
|
|
|
54
54
|
"AsyncReplicationConnection": "ReplicationConnection",
|
|
55
55
|
"AsyncExecConnection": "ExecConnection",
|
|
56
56
|
"run_soon": "run_now",
|
|
57
|
+
"run_detached": "run_in_thread",
|
|
57
58
|
"AsyncClient": "Client",
|
|
58
59
|
"aclose": "close",
|
|
59
60
|
"__aenter__": "__enter__",
|
|
@@ -105,6 +106,14 @@ def transform(source: str, rel: str) -> str:
|
|
|
105
106
|
):
|
|
106
107
|
raise SystemExit(f"unasync: {rel}:{tok.start[0]} uses asyncio beyond asyncio.sleep")
|
|
107
108
|
edits.append((pos(tok.start), pos(tok.end), "time"))
|
|
109
|
+
elif tok.type == tokenize.NAME and tok.string == "Awaitable" and nxt and nxt.string == "[":
|
|
110
|
+
depth = 0
|
|
111
|
+
for close in tokens[i + 1 :]:
|
|
112
|
+
depth += {"[": 1, "]": -1}.get(close.string, 0) if close.type == tokenize.OP else 0
|
|
113
|
+
if depth == 0:
|
|
114
|
+
break
|
|
115
|
+
edits.append((pos(tok.start), pos(nxt.end), ""))
|
|
116
|
+
edits.append((pos(close.start), pos(close.end), ""))
|
|
108
117
|
elif tok.type == tokenize.NAME and tok.string in NAMES:
|
|
109
118
|
edits.append((pos(tok.start), pos(tok.end), NAMES[tok.string]))
|
|
110
119
|
elif (
|
|
@@ -14,7 +14,14 @@ import threading
|
|
|
14
14
|
from collections.abc import Awaitable, Callable
|
|
15
15
|
from typing import Any
|
|
16
16
|
|
|
17
|
-
__all__ = [
|
|
17
|
+
__all__ = [
|
|
18
|
+
"AsyncSingleFlight",
|
|
19
|
+
"SingleFlight",
|
|
20
|
+
"run_detached",
|
|
21
|
+
"run_in_thread",
|
|
22
|
+
"run_now",
|
|
23
|
+
"run_soon",
|
|
24
|
+
]
|
|
18
25
|
|
|
19
26
|
|
|
20
27
|
class AsyncSingleFlight[T]:
|
|
@@ -127,3 +134,20 @@ def run_now(job: Callable[[], Any]) -> None:
|
|
|
127
134
|
job()
|
|
128
135
|
except Exception:
|
|
129
136
|
_logger.exception("background job failed")
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def run_detached(job: Callable[[], Awaitable[Any]]) -> None:
|
|
140
|
+
"""Start ``job`` without waiting for it, from a callback that must not wait: a push or a
|
|
141
|
+
reconnect handler. A failure is logged.
|
|
142
|
+
|
|
143
|
+
In the async client this is :func:`run_soon`. scripts/unasync.py maps it to
|
|
144
|
+
:func:`run_in_thread`, because the blocking client runs those handlers on a connection's
|
|
145
|
+
reader thread, and a call made there would wait on a reply only that thread can read.
|
|
146
|
+
"""
|
|
147
|
+
run_soon(job)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def run_in_thread(job: Callable[[], Any]) -> None:
|
|
151
|
+
"""Run ``job`` on a daemon thread; a failure is logged (the blocking twin of
|
|
152
|
+
:func:`run_detached`)."""
|
|
153
|
+
threading.Thread(target=run_now, args=(job,), name="crowdypy-kit", daemon=True).start()
|