msgctl 0.2.1__tar.gz → 0.2.2__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.
- {msgctl-0.2.1 → msgctl-0.2.2}/CHANGELOG.md +6 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/PKG-INFO +1 -1
- {msgctl-0.2.1 → msgctl-0.2.2}/pyproject.toml +1 -1
- {msgctl-0.2.1 → msgctl-0.2.2}/pyproject.toml.orig +1 -1
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/__init__.py +1 -1
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/discovery.py +35 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/http_routes.py +16 -0
- msgctl-0.2.2/tests/test_home_channels.py +83 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/uv.lock +1 -1
- {msgctl-0.2.1 → msgctl-0.2.2}/.python-version +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/CONTRIBUTING.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/README.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/SECURITY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/conformance/test_token_budget.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/conformance/test_transports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/conftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/README.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/hosting-role.sql +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/hosting.example.toml +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/mail.example.toml +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/msgd-hosting.service +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/msgd-worker.service +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/msgd.service +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/nginx-shared-http-logging.conf +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/nginx.conf +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/prepare-hosting-content.sh +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/prepare-service.sh +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/deploy/sshd_config +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/ARCHITECTURE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/ARCHITECTURE_PROGRESS_20260929.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/ARCHITECTURE_REUSE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/AUTHORIZATION_SOURCES.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/BOUNTY_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/CLIENT_BOUNDARY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/CLIENT_CONNECTIONS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/CLIENT_INSTALLATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/CLIENT_PART_BYTES_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/CLI_FIELD_SELECTION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/COMPLETE_RECOVERY_PROOF.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/CREDENTIAL_DELIVERY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/CUSTODIAL_HISTORY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/C_READ_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/DEPLOYMENT.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/DESIGN_CHANGE_REQUESTS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/DESIGN_CONTRACT_INVENTORY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/FILESYSTEM_LAYOUT.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/GIT_BOUNDARY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/HOSTING_AUTHORITY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/HOSTING_RUNTIME.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/HOSTING_RUNTIME_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/IMPLEMENTATION_STATUS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/INTEGRATION_PROGRESS_20260929.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/INTEGRATION_REGRESSION_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/ISSUES_68_70_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/ISSUES_78_80_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/ISSUE_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/ISSUE_RESOLUTION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/ITERATION_PLAN.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/LEDGER_MIGRATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/LEGACY_GIT_MIGRATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/LEGACY_IDENTITY_ARCHIVE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/LEGACY_SQLITE_PRESERVATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/LOCAL_VERIFICATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/MANAGED_CHECKOUT.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/MARKET_BOUNDARY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/MARKET_CLEARING.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/MARKET_CONTRACTS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/METADATA_SESSION_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/NATIVE_PACKAGES.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/NEW_ROOT_LEGACY_IMPORT_RUNBOOK.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/OAUTH.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/OFFER_ORDER_COMPATIBILITY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/OFFER_RESOURCE_MIGRATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/PROTOCOLS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/QUALITY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/READ_ENTRY_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/RELEASE_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/SAVED_QUERIES.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/SEARCH_QUERY_V5.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/SSH_GIT_LOCAL_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TASK_A_RECOVERY_20260928.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TASK_A_VERIFICATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TASK_C_EVIDENCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TEMPORARY_UPGRADE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TERMINAL_DEMO.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TOKEN_DELIVERY_BOUNDARY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TOOL_RUNNER_BOUNDARY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TRANSFER_STATUS_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/TRUST_PATHS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/VERIFICATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/issue-75-77-local-verification.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/docs/registry-template-tool-contracts.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/packaging/build-native.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/audit_filesystem_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/check_client_install.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/check_installed_server.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/check_isolated_sshd.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/check_package_artifacts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/check_tool_sandbox.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/ci_shards.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/render_terminal_demo.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/scripts/verify_local.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/accounts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/backup_retirement.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/backups.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/config_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/content_edit_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/custodial_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/diagnostics.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/dm_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/git_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/honor_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/legacy_approval.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/market.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/market_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/money.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/offer_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/preflight.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/recovery_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/recovery_proof.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/recovery_replay.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/recovery_state.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/restore_database.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/root.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/rotation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/token_delivery_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/tool_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/transfer_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/admin/upgrade_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/application.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/atomic_file.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/bootstrap.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/cli.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_api_keys.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_certificates.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_collaboration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_connection.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_content.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_custodial.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_market.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_oauth.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_output.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_secrets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_tokens.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/client_upgrade.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/config.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/config_contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/constants.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/batching.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/codec.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/cursors.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/email_address.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/errors.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/events.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/execution_ports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/executor.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/handles.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/models.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/packet.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/permissions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/read_query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/registry.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/requests.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/schema_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/schemas.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/search_query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/tags.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/template_dsl.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/text_patch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/tool_execution.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/core/transfer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/daemon.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/bootstrap.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/favicon.png +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/install.sh +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/legacy/sqlite-0221.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/logo-dark.svg +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/logo.svg +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/recovery-checkpoint.example.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/recovery-checkpoint.schema.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/recovery-policy-checkpoint.schema.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/recovery-state-schema.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/root-web-font-LICENSE.txt +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/root-web-sans-bold.woff2 +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/root-web-sans.woff2 +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/root-web.html +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/shortcodes.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/AGENTS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/_index.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/auth.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/files.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/identity.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/protocol.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/read-write.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/recovery.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/security.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/data/system/rules/topics.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/git_publication.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/hosting.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/keystore.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/repositories.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/rss.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/ssh.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/ssh_git.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/extensions/tools.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/hosting_runtime.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/arbitration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/catalog.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/compatibility.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/delivery_notifications.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/delivery_targets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/email.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/entitlement_orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/escrow.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/ledger.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/managed_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/offer_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/order_records.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/order_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/rationale.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/references.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/market/targets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/oauth_config.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/achievements.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/batch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/bounty.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/collaboration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/collaboration_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/common.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/communication.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/content.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/custodial_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/discussion.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/extensions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/features.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/files.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/following.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/hosting_capacity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/money.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/oauth_identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/offers.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/proposals.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/read_predicates.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/receipts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/saved_queries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/schemas.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/sharing.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/store.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/system.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/transfer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/plugins/watches.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/py.typed +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/age_keys.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/authentication.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/authorization.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/backup_retirement.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/capabilities.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/certificates.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/crypto.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/custodial_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/custodial_protocol.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/custody_history.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/network.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/oauth.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/quarantine.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/root_files.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/rotation_journal.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/sealed_box.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/sharing_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/token_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/trust_files.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/security/vault.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/service_origin.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/capacity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/custodial_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/git.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/ledger_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/legacy_git_capture.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/legacy_git_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/legacy_git_rehearsal.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/legacy_identity_plan.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/legacy_rehearsal.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/legacy_resource_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/legacy_sqlite.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/market_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/postgres.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/read_only.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/session.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/sqlite.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/topic_event_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/storage/valkey_bus.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/client.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/dictionary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/git_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/graphql.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/http_common.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/legacy_content_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/mcp.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/mcp_protocol.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/oauth_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/packet.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/read_tree_path.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/stdio.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/subject_views.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/transports/url_safety.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/tui.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/tui_i18n.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/workers/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/workers/effects.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/workers/leases.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/workers/mail.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/workers/maintenance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/workers/sandbox.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/workers/sandbox_child.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/src/msg/workers/webhook.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/conftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/fixtures/create_legacy_market.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/fixtures/legacy_market_source.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/fixtures/legacy_sqlite_0221.sql +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/http_read_cache_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/conftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/test_content_patch_contract.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/test_lfs_integrity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/test_lfs_migration_contract.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/test_read_query_tree.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/test_read_tree_transports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/test_revision_signature_fields.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/test_text_patch_formats.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/issue_78_80/test_tree_query_ref.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/read_only_evidence.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_access_log_secret_redaction.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_account_archive.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_achievement_concurrency.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_achievement_context_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_achievement_pins.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_achievements.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_agent_entry.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_architecture_ports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_attachment_http_cache.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_authority_snapshot_drift.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_authorization.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_authorization_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_authorization_recovery_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_authorization_sources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_backup_daemon.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_backup_drill.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_backup_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_backup_retirement_attestation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_backup_retirement_cli.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_batch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_batch_secret_release.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_bounty.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_bounty_commit_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_bounty_escrow_binding.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_bounty_public_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_bounty_snapshot_integrity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_branding.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ca_depth.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_canonical_post_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_capability_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_capacity_bounds.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_checkout_decision_integrity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ci_shards.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_cli_cursor_output.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_cli_dm.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_cli_hosting.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_cli_json_fields.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_cli_legacy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_cli_recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_cli_search_grep.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_connection.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_installer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_output_formats.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_part_bytes.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_response_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_secrets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_client_token_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_collaboration_current_visibility.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_collaboration_list_bounds.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_collaboration_list_deadline.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_collaboration_resource_surfaces.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_collaboration_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_collaboration_surfaces.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_complete_recovery_proof.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_config_safety.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_configuration_field_contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_content_edit_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_credential_delivery_contract.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_credential_delivery_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_credential_recovery_window.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_credential_upgrade_interleave.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custodial_client_upgrade.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custodial_historical_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custodial_inventory_ack.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custodial_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custodial_rewrap.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custodial_schema_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custodial_upgrade.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custodial_vault.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_custody_exit_evidence.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_delivery_target_regression.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_dictionary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_dictionary_route.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_dm.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_dm_selftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_effect_completion_fencing.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_effect_lease_deadlines.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_effect_retry_state.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_entitlement_orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_error_messages.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_escrow_decision_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_escrow_decisions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_execution_composition.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_extensions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_feature_manifest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_file_copy_integrity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_file_operations.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_fixture_collection.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_following.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_foundation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_get_only_write.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_git_http_push.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_git_lfs.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_git_selftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_git_transport_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_graceful_shutdown.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_handoff_lease.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_honor_diagnostics.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_hosting_addressable_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_hosting_read_permissions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_hosting_runtime.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_hosting_runtime_authority.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_hosting_runtime_isolation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_hosting_same_origin.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_http_effect_order.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_http_range_bounds.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_identity_handle_rename.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_identity_keys.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_independent_share_after_move.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_lease_list_bounds.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_lease_list_deadline.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ledger_account_isolation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ledger_accounts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ledger_migration_json.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ledger_migration_references.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_approval.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_content_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_directive.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_git_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_identity_plan.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_ledger_snapshot.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_resource_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_routes_removed.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_secret_entrypoints.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_share_source_isolation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_sqlite_preservation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_legacy_token_release.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_lexical_search_grep.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_lfs_shared_gc_quota.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_linkset_diff.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_local_postgres_fixtures.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_local_verification.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_managed_checkout.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_manifest_feature_linkage.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_markdown_redirect.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_71.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_72.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_account_scope.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_arbitration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_cli_bindings.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_compatibility_reads.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_explicit_acceptance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_integration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_lease_deadlines.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_manual_flow.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_notification_reuse.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_rationale.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_market_redemption.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_metadata_session_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_money_admin.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_money_config.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_money_core.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_money_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_money_public.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_native_git_read_only.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_nested_read_query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_network_url_ports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_nginx_secret_logs.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_notes_todos.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_oauth.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_oauth_authority.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_oauth_custodial_ceiling.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_offer_compatibility_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_offer_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_offer_resource_writer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_offers.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_online_ca_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_online_issuer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_operations_admin.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_order_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_order_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_organization_governance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_pagination.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_passive_get_guard.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_passive_ingress_priority.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_patch_rebase_identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_path_read_query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_personal_content_signatures.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_personal_documents.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_personal_signed_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_personal_text_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_pg_config.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_pg_sql_translation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_plugin_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_post_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_postgres.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_presence_claim.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_proposals.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_protocol_routes.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_query_ref.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_query_ref_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_read_cursor.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_read_entry_contract_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_read_namespace.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_read_only_evidence.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_read_projection_cache_transports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_read_projection_cache_unit.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_read_query_cursor.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_read_query_keyset_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_receipt_effect_order.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_recovery_authority_reconcile.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_recovery_current_authority.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_recovery_envelope.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_recovery_metadata.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_recovery_policy_v2.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_recovery_runtime_generation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_recovery_safety_units.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_registry_contract_references.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_registry_operation_rules.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_registry_references.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_registry_schema_ownership.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_registry_template_tools.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_release_artifacts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_release_version.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_request_target_safety.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_resource_path_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_restore_physical_failure.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_revision_sources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_root_rotation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_root_rotation_resume.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_root_storage_layout.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_root_web_release.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_route_effect_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_rss_query_validation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_saved_queries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_saved_query_typed_scopes.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_saved_query_watch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_search_engine_discovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_search_phrase_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_search_source_relation_filters.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_search_spelling.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_search_suggestions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_security.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_security_patch_regressions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_security_rollback_fences.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_security_storage_rollback.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_security_topic_events.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_security_transfer_rollback.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_service.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_session_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_share_grants.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_share_grants_v2.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_share_links.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_share_source_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_share_transport_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_single_mailbox_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_smtp_socket_acceptance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_sqlite_connection_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ssh_bank_grant.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ssh_process_identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ssh_root_provisioning.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_ssh_rss.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_stable_resource_views.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_stdio_cli.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_storage_commit_faults.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_storage_layout.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_store_foundation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_subject_read_aliases.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_subject_receipts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_subject_view_effect_order.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_sync_checkpoint.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_sync_cursor.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_system_rule_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_system_rule_retirement.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_system_rules.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tags_index.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_task_a_custodial_binding.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_task_a_preflight.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_task_a_recovery_checkpoint.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_task_a_root_files.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_temporary_dual_keys.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_temporary_legacy_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_temporary_signed_business.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_text_patch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_text_patch_eof_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_text_patch_line_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_text_patch_rebase_batch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_todo_due_inbox.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_token_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_token_delivery_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tool_feature_selftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tool_runner_contract.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tool_sandbox_acceptance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tools.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tools_directory.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_topic_governance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_transfer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_transfer_endpoint.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_transfer_selftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_transfer_status_cursors.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_trust_path_compatibility.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tui.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tui_i18n.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tui_mailbox_selection.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tui_recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_tui_transport_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_upgrade_journal.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_upgrade_journal_file_types.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_url_secrets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_valkey_bus.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_watch_contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_watch_corruption.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_watch_surfaces.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_webhook_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_webhook_domain_events.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_webhook_identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_webhook_overlap.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.2}/tests/test_webhook_overlap_collation.py +0 -0
|
@@ -584,6 +584,7 @@ def install(app):
|
|
|
584
584
|
today = ctx.now.astimezone(timezone).date()
|
|
585
585
|
posts = posts_today = users = 0
|
|
586
586
|
latest = []
|
|
587
|
+
channels = []
|
|
587
588
|
position = None
|
|
588
589
|
while True:
|
|
589
590
|
require(time.monotonic() < ctx.deadline_monotonic, 'query_cost_exceeded')
|
|
@@ -617,8 +618,42 @@ def install(app):
|
|
|
617
618
|
if len(rows) < 128:
|
|
618
619
|
break
|
|
619
620
|
require(time.monotonic() < ctx.deadline_monotonic, 'query_cost_exceeded')
|
|
621
|
+
# Only root-level, non-system topics are discussion channels. Use the
|
|
622
|
+
# same current authorization as a public resource read, never raw ACLs.
|
|
623
|
+
for (raw,) in tx.rows(
|
|
624
|
+
"SELECT body FROM resources WHERE type='topic' AND state='active' "
|
|
625
|
+
"AND parent=? AND created_at<=? ORDER BY name,id",
|
|
626
|
+
(ROOT_SPACE, wire(ctx.now)),
|
|
627
|
+
):
|
|
628
|
+
require(time.monotonic() < ctx.deadline_monotonic, 'query_cost_exceeded')
|
|
629
|
+
resource = decode(Resource, loads(raw))
|
|
630
|
+
if resource.name.startswith(('.', '_')) or not await visible(
|
|
631
|
+
app, ctx, request, tx, resource.id
|
|
632
|
+
):
|
|
633
|
+
continue
|
|
634
|
+
chain = (*await tx.ancestors(resource.id), resource)
|
|
635
|
+
mode = resource.mode
|
|
636
|
+
if resource.id == 't_last_will':
|
|
637
|
+
posting = 'Use the signed legacy directive operation; ordinary posts are disabled.'
|
|
638
|
+
elif not tx.setting('policy:' + resource.id, {}).get('editable', True):
|
|
639
|
+
posting = 'Posting is frozen.'
|
|
640
|
+
elif mode & 0o003 == 0o003:
|
|
641
|
+
posting = 'Authenticated identity and authorization to create posts.'
|
|
642
|
+
elif mode & 0o030 == 0o030 or mode & 0o300 == 0o300:
|
|
643
|
+
posting = 'Owner or authorized group; authorization to create posts is required.'
|
|
644
|
+
else:
|
|
645
|
+
posting = 'Read-only; ordinary posting is disabled.'
|
|
646
|
+
if any(item.mode & 0o4000 for item in chain):
|
|
647
|
+
posting += ' A scoped certified-write certificate is also required.'
|
|
648
|
+
channels.append({
|
|
649
|
+
'name': resource.name,
|
|
650
|
+
'path': short_subject_path(await tx.path(resource.id)),
|
|
651
|
+
'read': 'Public; no login required.',
|
|
652
|
+
'posting': posting,
|
|
653
|
+
})
|
|
620
654
|
return HandlerOutput(
|
|
621
655
|
data={
|
|
656
|
+
'channels': channels,
|
|
622
657
|
'posts': posts,
|
|
623
658
|
'posts_today': posts_today,
|
|
624
659
|
'users': users,
|
|
@@ -86,8 +86,24 @@ def home_markdown(data=None, *, service_url=None):
|
|
|
86
86
|
lines.append(f'- [{name}]({quote(item["path"], safe="/@")}) — {item["created_at"]}')
|
|
87
87
|
if not data['latest']:
|
|
88
88
|
lines.append('No public posts yet.')
|
|
89
|
+
lines.append('\n## Public channels\n')
|
|
90
|
+
if data is None:
|
|
91
|
+
lines.append('Channel availability and posting requirements are temporarily unavailable.')
|
|
92
|
+
else:
|
|
93
|
+
for channel in data.get('channels', []):
|
|
94
|
+
name = re.sub(r'([\\`*_{}\[\]<>!|&])', r'\\\1', channel['name'])
|
|
95
|
+
lines.append(
|
|
96
|
+
f'- [{name}]({quote(channel["path"], safe="/@")}) — '
|
|
97
|
+
f'Read: {channel["read"]} Post: {channel["posting"]}'
|
|
98
|
+
)
|
|
99
|
+
if not data.get('channels'):
|
|
100
|
+
lines.append('No public discussion channels available.')
|
|
89
101
|
lines.extend([
|
|
90
102
|
'\n## Before posting\n',
|
|
103
|
+
'Only active, publicly readable top-level discussion channels are listed. '
|
|
104
|
+
'Private channels and internal directories are omitted. '
|
|
105
|
+
'Posting requirements are a guide: the server checks the signed identity, '
|
|
106
|
+
'operation permissions, certificate scope and any channel bans on every request. ',
|
|
91
107
|
'Read the [platform rules](/_rules) and [topic rules](/_rules/topics). '
|
|
92
108
|
'Public posts can be read by anyone. Ordinary resource links are read-only; '
|
|
93
109
|
'publishing or editing requires an authenticated operation. '
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Homepage channel discovery never enumerates private or inactive topics."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import replace
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
import pytest
|
|
7
|
+
from test_service import call
|
|
8
|
+
|
|
9
|
+
from msg.transports.http import create_app
|
|
10
|
+
from msg.transports.http_routes import home_markdown
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.mark.asyncio
|
|
14
|
+
async def test_public_channels_show_current_read_and_post_requirements(installed):
|
|
15
|
+
app, _ = installed
|
|
16
|
+
result = await call(app, 'discovery.read_query', {'home_summary': True}, contract_version=4)
|
|
17
|
+
assert result.status == 'ok', result.error
|
|
18
|
+
channels = {channel['path']: channel for channel in result.data['channels']}
|
|
19
|
+
assert '/main' in channels and '/wiki' in channels
|
|
20
|
+
assert 'Authenticated identity' in channels['/main']['posting']
|
|
21
|
+
assert 'certified-write certificate' in channels['/certified']['posting']
|
|
22
|
+
assert 'legacy directive' in channels['/last-will']['posting']
|
|
23
|
+
assert all(channel['read'] == 'Public; no login required.' for channel in channels.values())
|
|
24
|
+
for private in ('/private', '/admins', '/tools', '/_ca', '/.agents'):
|
|
25
|
+
assert private not in channels
|
|
26
|
+
assert all(set(channel) == {'name', 'path', 'read', 'posting'} for channel in channels.values())
|
|
27
|
+
|
|
28
|
+
async with app.metadata.transaction(write=True) as tx:
|
|
29
|
+
for path, changes in (
|
|
30
|
+
('/main', {'mode': 0o700}),
|
|
31
|
+
('/intro', {'state': 'archived'}),
|
|
32
|
+
('/store', {'mode': 0o755}),
|
|
33
|
+
('/sos', {'mode': 0o555}),
|
|
34
|
+
):
|
|
35
|
+
resource = await tx.resource(await tx.resolve(path))
|
|
36
|
+
await tx.replace(
|
|
37
|
+
replace(resource, **changes, generation=resource.generation + 1),
|
|
38
|
+
resource.generation,
|
|
39
|
+
)
|
|
40
|
+
tx.set_setting('policy:t_wiki', {'editable': False})
|
|
41
|
+
result = await call(app, 'discovery.read_query', {'home_summary': True}, contract_version=4)
|
|
42
|
+
channels = {channel['path']: channel for channel in result.data['channels']}
|
|
43
|
+
assert '/main' not in channels and '/intro' not in channels
|
|
44
|
+
assert 'Owner or authorized group' in channels['/store']['posting']
|
|
45
|
+
assert 'Read-only' in channels['/sos']['posting']
|
|
46
|
+
assert channels['/wiki']['posting'] == 'Posting is frozen.'
|
|
47
|
+
async with httpx.AsyncClient(
|
|
48
|
+
transport=httpx.ASGITransport(app=create_app(app)), base_url=app.settings.service_url
|
|
49
|
+
) as http:
|
|
50
|
+
response = await http.get('/')
|
|
51
|
+
section = response.text.split('## Public channels')[1].split('## Before posting')[0]
|
|
52
|
+
assert '[main](/main)' not in section and '[intro](/intro)' not in section
|
|
53
|
+
assert '[certified](/certified)' in section and 'certified-write certificate' in section
|
|
54
|
+
assert '[/private]' not in section and 'Read: Public; no login required.' in section
|
|
55
|
+
head = await http.head('/')
|
|
56
|
+
assert head.content == b''
|
|
57
|
+
assert head.headers['content-length'] == str(len(response.content))
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_channel_names_and_paths_are_escaped_and_failure_is_honest():
|
|
61
|
+
data = {
|
|
62
|
+
'posts': 0,
|
|
63
|
+
'posts_today': 0,
|
|
64
|
+
'users': 0,
|
|
65
|
+
'date': 'today',
|
|
66
|
+
'timezone': 'Asia/Taipei',
|
|
67
|
+
'latest': [],
|
|
68
|
+
'channels': [
|
|
69
|
+
{
|
|
70
|
+
'name': '[evil]<script>',
|
|
71
|
+
'path': '/a (b)',
|
|
72
|
+
'read': 'Public; no login required.',
|
|
73
|
+
'posting': 'Read-only.',
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
}
|
|
77
|
+
page = home_markdown(data).decode()
|
|
78
|
+
assert r'\[evil\]\<script\>' in page
|
|
79
|
+
assert '(/a%20%28b%29)' in page
|
|
80
|
+
assert (
|
|
81
|
+
'Channel availability and posting requirements are temporarily unavailable.'
|
|
82
|
+
in home_markdown().decode()
|
|
83
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|