msgctl 0.2.1__tar.gz → 0.2.3__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.3}/CHANGELOG.md +12 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/PKG-INFO +1 -1
- {msgctl-0.2.1 → msgctl-0.2.3}/pyproject.toml +1 -1
- {msgctl-0.2.1 → msgctl-0.2.3}/pyproject.toml.orig +1 -1
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/__init__.py +1 -1
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/discovery.py +41 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/http_routes.py +17 -1
- msgctl-0.2.3/tests/test_home_channels.py +83 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/uv.lock +1 -1
- {msgctl-0.2.1 → msgctl-0.2.3}/.python-version +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/CONTRIBUTING.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/README.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/SECURITY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/conformance/test_token_budget.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/conformance/test_transports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/conftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/README.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/hosting-role.sql +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/hosting.example.toml +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/mail.example.toml +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/msgd-hosting.service +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/msgd-worker.service +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/msgd.service +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/nginx-shared-http-logging.conf +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/nginx.conf +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/prepare-hosting-content.sh +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/prepare-service.sh +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/deploy/sshd_config +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/ARCHITECTURE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/ARCHITECTURE_PROGRESS_20260929.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/ARCHITECTURE_REUSE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/AUTHORIZATION_SOURCES.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/BOUNTY_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/CLIENT_BOUNDARY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/CLIENT_CONNECTIONS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/CLIENT_INSTALLATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/CLIENT_PART_BYTES_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/CLI_FIELD_SELECTION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/COMPLETE_RECOVERY_PROOF.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/CREDENTIAL_DELIVERY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/CUSTODIAL_HISTORY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/C_READ_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/DEPLOYMENT.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/DESIGN_CHANGE_REQUESTS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/DESIGN_CONTRACT_INVENTORY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/FILESYSTEM_LAYOUT.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/GIT_BOUNDARY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/HOSTING_AUTHORITY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/HOSTING_RUNTIME.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/HOSTING_RUNTIME_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/IMPLEMENTATION_STATUS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/INTEGRATION_PROGRESS_20260929.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/INTEGRATION_REGRESSION_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/ISSUES_68_70_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/ISSUES_78_80_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/ISSUE_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/ISSUE_RESOLUTION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/ITERATION_PLAN.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/LEDGER_MIGRATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/LEGACY_GIT_MIGRATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/LEGACY_IDENTITY_ARCHIVE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/LEGACY_SQLITE_PRESERVATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/LOCAL_VERIFICATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/MANAGED_CHECKOUT.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/MARKET_BOUNDARY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/MARKET_CLEARING.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/MARKET_CONTRACTS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/METADATA_SESSION_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/NATIVE_PACKAGES.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/NEW_ROOT_LEGACY_IMPORT_RUNBOOK.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/OAUTH.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/OFFER_ORDER_COMPATIBILITY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/OFFER_RESOURCE_MIGRATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/PROTOCOLS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/QUALITY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/READ_ENTRY_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/RELEASE_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/SAVED_QUERIES.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/SEARCH_QUERY_V5.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/SSH_GIT_LOCAL_ACCEPTANCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TASK_A_RECOVERY_20260928.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TASK_A_VERIFICATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TASK_C_EVIDENCE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TEMPORARY_UPGRADE.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TERMINAL_DEMO.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TOKEN_DELIVERY_BOUNDARY_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TOOL_RUNNER_BOUNDARY.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TRANSFER_STATUS_PROGRESS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/TRUST_PATHS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/VERIFICATION.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/issue-75-77-local-verification.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/docs/registry-template-tool-contracts.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/packaging/build-native.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/audit_filesystem_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/check_client_install.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/check_installed_server.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/check_isolated_sshd.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/check_package_artifacts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/check_tool_sandbox.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/ci_shards.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/render_terminal_demo.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/scripts/verify_local.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/accounts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/backup_retirement.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/backups.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/config_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/content_edit_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/custodial_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/diagnostics.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/dm_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/git_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/honor_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/legacy_approval.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/market.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/market_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/money.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/offer_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/preflight.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/recovery_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/recovery_proof.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/recovery_replay.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/recovery_state.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/restore_database.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/root.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/rotation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/token_delivery_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/tool_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/transfer_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/admin/upgrade_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/application.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/atomic_file.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/bootstrap.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/cli.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_api_keys.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_certificates.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_collaboration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_connection.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_content.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_custodial.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_market.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_oauth.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_output.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_secrets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_tokens.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/client_upgrade.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/config.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/config_contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/constants.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/batching.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/codec.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/cursors.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/email_address.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/errors.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/events.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/execution_ports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/executor.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/handles.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/models.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/packet.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/permissions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/read_query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/registry.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/requests.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/schema_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/schemas.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/search_query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/tags.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/template_dsl.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/text_patch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/tool_execution.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/core/transfer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/daemon.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/bootstrap.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/favicon.png +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/install.sh +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/legacy/sqlite-0221.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/logo-dark.svg +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/logo.svg +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/recovery-checkpoint.example.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/recovery-checkpoint.schema.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/recovery-policy-checkpoint.schema.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/recovery-state-schema.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/root-web-font-LICENSE.txt +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/root-web-sans-bold.woff2 +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/root-web-sans.woff2 +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/root-web.html +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/shortcodes.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/AGENTS.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/_index.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/auth.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/files.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/identity.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/protocol.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/read-write.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/recovery.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/security.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/data/system/rules/topics.md +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/git_publication.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/hosting.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/keystore.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/repositories.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/rss.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/ssh.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/ssh_git.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/extensions/tools.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/hosting_runtime.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/arbitration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/catalog.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/compatibility.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/delivery_notifications.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/delivery_targets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/email.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/entitlement_orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/escrow.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/ledger.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/managed_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/offer_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/order_records.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/order_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/rationale.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/references.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/market/targets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/oauth_config.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/achievements.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/batch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/bounty.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/collaboration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/collaboration_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/common.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/communication.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/content.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/custodial_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/discussion.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/extensions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/features.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/files.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/following.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/hosting_capacity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/money.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/oauth_identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/offers.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/proposals.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/read_predicates.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/receipts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/saved_queries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/schemas.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/sharing.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/store.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/system.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/transfer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/plugins/watches.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/py.typed +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/age_keys.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/authentication.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/authorization.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/backup_retirement.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/capabilities.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/certificates.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/crypto.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/custodial_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/custodial_protocol.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/custody_history.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/network.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/oauth.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/quarantine.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/root_files.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/rotation_journal.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/sealed_box.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/sharing_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/token_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/trust_files.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/security/vault.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/service_origin.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/capacity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/custodial_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/git.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/ledger_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/legacy_git_capture.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/legacy_git_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/legacy_git_rehearsal.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/legacy_identity_plan.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/legacy_rehearsal.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/legacy_resource_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/legacy_sqlite.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/market_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/postgres.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/read_only.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/session.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/sqlite.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/topic_event_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/storage/valkey_bus.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/client.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/dictionary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/git_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/graphql.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/http_common.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/legacy_content_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/mcp.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/mcp_protocol.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/oauth_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/packet.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/read_tree_path.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/stdio.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/subject_views.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/transports/url_safety.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/tui.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/tui_i18n.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/workers/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/workers/effects.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/workers/leases.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/workers/mail.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/workers/maintenance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/workers/sandbox.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/workers/sandbox_child.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/src/msg/workers/webhook.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/conftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/fixtures/create_legacy_market.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/fixtures/legacy_market_source.json +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/fixtures/legacy_sqlite_0221.sql +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/http_read_cache_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/__init__.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/conftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/test_content_patch_contract.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/test_lfs_integrity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/test_lfs_migration_contract.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/test_read_query_tree.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/test_read_tree_transports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/test_revision_signature_fields.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/test_text_patch_formats.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/issue_78_80/test_tree_query_ref.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/read_only_evidence.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_access_log_secret_redaction.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_account_archive.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_achievement_concurrency.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_achievement_context_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_achievement_pins.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_achievements.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_agent_entry.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_architecture_ports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_attachment_http_cache.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_authority_snapshot_drift.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_authorization.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_authorization_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_authorization_recovery_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_authorization_sources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_backup_daemon.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_backup_drill.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_backup_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_backup_retirement_attestation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_backup_retirement_cli.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_batch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_batch_secret_release.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_bounty.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_bounty_commit_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_bounty_escrow_binding.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_bounty_public_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_bounty_snapshot_integrity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_branding.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ca_depth.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_canonical_post_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_capability_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_capacity_bounds.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_checkout_decision_integrity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ci_shards.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_cli_cursor_output.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_cli_dm.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_cli_hosting.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_cli_json_fields.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_cli_legacy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_cli_recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_cli_search_grep.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_connection.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_installer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_output_formats.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_part_bytes.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_response_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_secrets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_client_token_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_collaboration_current_visibility.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_collaboration_list_bounds.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_collaboration_list_deadline.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_collaboration_resource_surfaces.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_collaboration_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_collaboration_surfaces.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_complete_recovery_proof.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_config_safety.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_configuration_field_contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_content_edit_check.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_credential_delivery_contract.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_credential_delivery_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_credential_recovery_window.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_credential_upgrade_interleave.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custodial_client_upgrade.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custodial_historical_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custodial_inventory_ack.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custodial_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custodial_rewrap.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custodial_schema_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custodial_upgrade.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custodial_vault.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_custody_exit_evidence.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_delivery_target_regression.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_dictionary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_dictionary_route.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_dm.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_dm_selftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_effect_completion_fencing.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_effect_lease_deadlines.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_effect_retry_state.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_entitlement_orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_error_messages.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_escrow_decision_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_escrow_decisions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_execution_composition.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_extensions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_feature_manifest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_file_copy_integrity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_file_operations.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_fixture_collection.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_following.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_foundation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_get_only_write.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_git_http_push.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_git_lfs.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_git_selftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_git_transport_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_graceful_shutdown.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_handoff_lease.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_honor_diagnostics.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_hosting_addressable_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_hosting_read_permissions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_hosting_runtime.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_hosting_runtime_authority.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_hosting_runtime_isolation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_hosting_same_origin.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_http_effect_order.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_http_range_bounds.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_identity_handle_rename.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_identity_keys.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_independent_share_after_move.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_lease_list_bounds.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_lease_list_deadline.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ledger_account_isolation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ledger_accounts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ledger_migration_json.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ledger_migration_references.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_approval.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_content_http.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_directive.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_git_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_identity_plan.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_ledger_snapshot.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_resource_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_routes_removed.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_secret_entrypoints.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_share_source_isolation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_sqlite_preservation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_legacy_token_release.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_lexical_search_grep.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_lfs_shared_gc_quota.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_linkset_diff.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_local_postgres_fixtures.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_local_verification.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_managed_checkout.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_manifest_feature_linkage.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_markdown_redirect.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_71.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_72.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_account_scope.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_arbitration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_cli_bindings.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_compatibility_reads.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_explicit_acceptance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_integration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_lease_deadlines.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_manual_flow.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_notification_reuse.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_rationale.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_market_redemption.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_metadata_session_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_money_admin.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_money_config.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_money_core.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_money_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_money_public.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_native_git_read_only.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_nested_read_query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_network_url_ports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_nginx_secret_logs.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_notes_todos.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_oauth.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_oauth_authority.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_oauth_custodial_ceiling.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_offer_compatibility_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_offer_import.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_offer_resource_writer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_offers.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_online_ca_policy.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_online_issuer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_operations_admin.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_order_paths.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_order_resources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_orders.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_organization_governance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_pagination.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_passive_get_guard.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_passive_ingress_priority.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_patch_rebase_identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_path_read_query.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_personal_content_signatures.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_personal_documents.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_personal_signed_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_personal_text_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_pg_config.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_pg_sql_translation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_plugin_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_post_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_postgres.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_presence_claim.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_proposals.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_protocol_routes.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_query_ref.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_query_ref_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_read_cursor.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_read_entry_contract_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_read_namespace.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_read_only_evidence.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_read_projection_cache_transports.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_read_projection_cache_unit.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_read_query_cursor.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_read_query_keyset_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_receipt_effect_order.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_recovery_authority_reconcile.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_recovery_current_authority.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_recovery_envelope.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_recovery_metadata.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_recovery_policy_v2.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_recovery_runtime_generation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_recovery_safety_units.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_registry_contract_references.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_registry_operation_rules.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_registry_references.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_registry_schema_ownership.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_registry_template_tools.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_release_artifacts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_release_version.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_request_target_safety.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_resource_path_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_restore_physical_failure.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_revision_sources.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_root_rotation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_root_rotation_resume.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_root_storage_layout.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_root_web_release.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_route_effect_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_rss_query_validation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_saved_queries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_saved_query_typed_scopes.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_saved_query_watch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_search_engine_discovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_search_phrase_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_search_source_relation_filters.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_search_spelling.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_search_suggestions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_security.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_security_patch_regressions.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_security_rollback_fences.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_security_storage_rollback.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_security_topic_events.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_security_transfer_rollback.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_service.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_session_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_share_grants.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_share_grants_v2.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_share_links.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_share_source_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_share_transport_matrix.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_single_mailbox_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_smtp_socket_acceptance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_sqlite_connection_lifecycle.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ssh_bank_grant.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ssh_process_identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ssh_root_provisioning.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_ssh_rss.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_stable_resource_views.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_stdio_cli.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_storage_commit_faults.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_storage_layout.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_store_foundation.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_subject_read_aliases.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_subject_receipts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_subject_view_effect_order.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_sync_checkpoint.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_sync_cursor.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_system_rule_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_system_rule_retirement.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_system_rules.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tags_index.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_task_a_custodial_binding.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_task_a_preflight.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_task_a_recovery_checkpoint.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_task_a_root_files.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_temporary_dual_keys.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_temporary_legacy_migration.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_temporary_signed_business.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_text_patch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_text_patch_eof_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_text_patch_line_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_text_patch_rebase_batch.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_todo_due_inbox.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_token_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_token_delivery_boundary.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tool_feature_selftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tool_runner_contract.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tool_sandbox_acceptance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tools.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tools_directory.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_topic_governance.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_transfer.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_transfer_endpoint.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_transfer_selftest.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_transfer_status_cursors.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_trust_path_compatibility.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tui.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tui_i18n.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tui_mailbox_selection.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tui_recovery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_tui_transport_boundaries.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_upgrade_journal.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_upgrade_journal_file_types.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_url_secrets.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_valkey_bus.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_watch_contracts.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_watch_corruption.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_watch_surfaces.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_webhook_delivery.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_webhook_domain_events.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_webhook_identity.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_webhook_overlap.py +0 -0
- {msgctl-0.2.1 → msgctl-0.2.3}/tests/test_webhook_overlap_collation.py +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# 变更记录
|
|
2
2
|
|
|
3
|
+
## 0.2.3 — 发布候选
|
|
4
|
+
|
|
5
|
+
修正首页频道的发帖权限说明,分别显示仅频道所有者、授权群组与公开发帖模式。
|
|
6
|
+
首页源码链接指向改名后的 `TokenNotIncluded/msg`;未修改协议或授权规则。
|
|
7
|
+
一键安装脚本继续固定 0.2.1 客户端源码。
|
|
8
|
+
|
|
9
|
+
## 0.2.2 — 发布候选
|
|
10
|
+
|
|
11
|
+
首页显示频道列表和对应链接,便于发现与进入公开讨论。
|
|
12
|
+
一键安装脚本继续固定已验证的 0.2.1 客户端源码;本次变更仅影响服务端首页。
|
|
13
|
+
PyPI 上传、服务器部署和现场频道显示需分别验证。
|
|
14
|
+
|
|
3
15
|
## 0.2.1 — 发布候选
|
|
4
16
|
|
|
5
17
|
仓库名为 `msg`,Python 发行包为 `msgctl`,命令为 `msg`、`msgd`。
|
|
@@ -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,48 @@ 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:
|
|
643
|
+
posting = (
|
|
644
|
+
'Owner or authorized group; authorization to create posts is required.'
|
|
645
|
+
if mode & 0o300 == 0o300
|
|
646
|
+
else 'Authorized group; authorization to create posts is required.'
|
|
647
|
+
)
|
|
648
|
+
elif mode & 0o300 == 0o300:
|
|
649
|
+
posting = 'Channel owner; authorization to create posts is required.'
|
|
650
|
+
else:
|
|
651
|
+
posting = 'Read-only; ordinary posting is disabled.'
|
|
652
|
+
if any(item.mode & 0o4000 for item in chain):
|
|
653
|
+
posting += ' A scoped certified-write certificate is also required.'
|
|
654
|
+
channels.append({
|
|
655
|
+
'name': resource.name,
|
|
656
|
+
'path': short_subject_path(await tx.path(resource.id)),
|
|
657
|
+
'read': 'Public; no login required.',
|
|
658
|
+
'posting': posting,
|
|
659
|
+
})
|
|
620
660
|
return HandlerOutput(
|
|
621
661
|
data={
|
|
662
|
+
'channels': channels,
|
|
622
663
|
'posts': posts,
|
|
623
664
|
'posts_today': posts_today,
|
|
624
665
|
'users': users,
|
|
@@ -58,7 +58,7 @@ HOME_MARKDOWN = (
|
|
|
58
58
|
'Send messages. Exchange files. Pass context. Keep the next agent moving.\n\n'
|
|
59
59
|
'Signed identities, scoped permissions, and a server you can run yourself.\n\n'
|
|
60
60
|
'[Topics](/main) · [Platform rules](/_rules) · [Agent guide](/AGENTS.md) · '
|
|
61
|
-
'[Operations](/-/d) · [Source code](https://github.com/TokenNotIncluded/msg
|
|
61
|
+
'[Operations](/-/d) · [Source code](https://github.com/TokenNotIncluded/msg)\n'
|
|
62
62
|
).encode()
|
|
63
63
|
|
|
64
64
|
|
|
@@ -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 'Channel owner' 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
|