meshcode 2.11.14__tar.gz → 2.11.16__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.
- {meshcode-2.11.14 → meshcode-2.11.16}/PKG-INFO +1 -1
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/__init__.py +1 -1
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/server.py +15 -0
- meshcode-2.11.16/meshcode/rpc_allowlist.py +106 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode.egg-info/SOURCES.txt +2 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/pyproject.toml +1 -1
- meshcode-2.11.16/tests/test_rpc_grants.py +76 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/README.md +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/__main__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/cli.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/compat.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/daemon.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/doctor.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/invites.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/launcher.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/preferences.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/secrets.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/self_update.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode/upload.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/setup.cfg +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_core.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_doctor.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.14 → meshcode-2.11.16}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -4906,6 +4906,21 @@ def meshcode_boot() -> Dict[str, Any]:
|
|
|
4906
4906
|
_PERSONA = ph
|
|
4907
4907
|
_PERSONA_INJECTED = False # let with_working_status surface it once
|
|
4908
4908
|
|
|
4909
|
+
# AUDIT-S1: health-check Supabase secrets (mig 335). Soft-fail
|
|
4910
|
+
# gracefully when RPC not deployed. Non-fatal — surfaces warning only.
|
|
4911
|
+
try:
|
|
4912
|
+
_hc = be.sb_rpc("mc_health_check_secrets", {})
|
|
4913
|
+
if isinstance(_hc, dict):
|
|
4914
|
+
if _hc.get("ok") is False:
|
|
4915
|
+
resp["health_warning"] = {
|
|
4916
|
+
"type": "secrets_misconfigured",
|
|
4917
|
+
"missing": _hc.get("missing") or [],
|
|
4918
|
+
"weak": _hc.get("weak") or [],
|
|
4919
|
+
"hint": "Supabase secrets not fully configured — see mig 335 / audit S1. Contact ops to set/rotate.",
|
|
4920
|
+
}
|
|
4921
|
+
except Exception:
|
|
4922
|
+
pass
|
|
4923
|
+
|
|
4909
4924
|
# CAL-3 calendar context (mig 329): surface upcoming due tasks +
|
|
4910
4925
|
# overdue count + newly-unblocked so the agent knows the cadence
|
|
4911
4926
|
# backlog without a second tool call. Soft-fail if mig 329 not
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"""Single source of truth for agent-callable mc_* RPCs.
|
|
2
|
+
|
|
3
|
+
Used by:
|
|
4
|
+
- mig 334 (GRANT EXECUTE TO anon, authenticated, service_role per name)
|
|
5
|
+
- scripts/check_rpc_grants.py (CI gate calling mc_check_rpc_grants)
|
|
6
|
+
- tests/test_rpc_grants.py (unit test that asserts list invariants)
|
|
7
|
+
|
|
8
|
+
When adding a new agent-callable RPC, add its bare name (no schema, no args)
|
|
9
|
+
here AND issue a mig that grants it. The CI gate then catches drift.
|
|
10
|
+
|
|
11
|
+
Excluded by convention (must NOT be on this list):
|
|
12
|
+
- mc_admin_* (privileged management)
|
|
13
|
+
- mc_billing_* (billing surface)
|
|
14
|
+
- mc_force_* (force operations — service_role only)
|
|
15
|
+
- _mc_* (internal helpers)
|
|
16
|
+
|
|
17
|
+
Exception: mc_force_clear_stale_lease is intentionally agent-callable —
|
|
18
|
+
it's the install-guard's recovery path for orphan leases (mig 086 + 136).
|
|
19
|
+
See FORCE_PREFIX_EXEMPT.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
FORCE_PREFIX_EXEMPT = {"mc_force_clear_stale_lease"}
|
|
23
|
+
|
|
24
|
+
AGENT_CALLABLE_RPCS = [
|
|
25
|
+
# ── Tasks
|
|
26
|
+
"mc_task_create",
|
|
27
|
+
"mc_task_claim",
|
|
28
|
+
"mc_task_complete",
|
|
29
|
+
"mc_task_reassign",
|
|
30
|
+
"mc_task_cancel",
|
|
31
|
+
"mc_task_reject",
|
|
32
|
+
"mc_task_approve",
|
|
33
|
+
"mc_task_search",
|
|
34
|
+
"mc_task_reschedule", # mig 330
|
|
35
|
+
"mc_task_get_deps", # mig 330
|
|
36
|
+
"mc_tasks_due_soon", # mig 329
|
|
37
|
+
"mc_task_is_blocked", # mig 329
|
|
38
|
+
"mc_task_unblock_chain", # mig 329
|
|
39
|
+
"mc_tasks_for_goal", # mig 230
|
|
40
|
+
|
|
41
|
+
# ── Agents
|
|
42
|
+
"mc_register_agent",
|
|
43
|
+
"mc_agent_set_status_by_api_key",
|
|
44
|
+
"mc_acquire_agent_lease",
|
|
45
|
+
"mc_release_agent_lease",
|
|
46
|
+
"mc_force_clear_stale_lease",
|
|
47
|
+
"mc_heartbeat",
|
|
48
|
+
"mc_get_agent_idle_times", # mig 322
|
|
49
|
+
"mc_agent_persona",
|
|
50
|
+
"mc_agent_time_context", # mig 328
|
|
51
|
+
"mc_agent_time_context_all", # mig 328
|
|
52
|
+
|
|
53
|
+
# ── Boot context
|
|
54
|
+
"mc_boot", # mig 271
|
|
55
|
+
"mc_agent_boot_context",
|
|
56
|
+
"mc_resolve_project",
|
|
57
|
+
|
|
58
|
+
# ── Messages
|
|
59
|
+
"mc_send_message",
|
|
60
|
+
"mc_send_multi",
|
|
61
|
+
"mc_broadcast",
|
|
62
|
+
"mc_log_activity",
|
|
63
|
+
"mc_dispatch_should_refuse", # mig 327
|
|
64
|
+
|
|
65
|
+
# ── Memory
|
|
66
|
+
"mc_memory_set",
|
|
67
|
+
"mc_memory_list",
|
|
68
|
+
"mc_memory_search",
|
|
69
|
+
"mc_memory_contradictions",
|
|
70
|
+
|
|
71
|
+
# ── Decisions / outcomes
|
|
72
|
+
"mc_has_open_decision",
|
|
73
|
+
"mc_decide",
|
|
74
|
+
"mc_outcome",
|
|
75
|
+
"mc_explain",
|
|
76
|
+
|
|
77
|
+
# ── Validation / pairing
|
|
78
|
+
"mc_validate_api_key",
|
|
79
|
+
"mc_create_pairing_session",
|
|
80
|
+
"mc_poll_pairing_session",
|
|
81
|
+
|
|
82
|
+
# ── Device-code OAuth (mig 326)
|
|
83
|
+
"mc_device_code_create",
|
|
84
|
+
"mc_device_code_session_info",
|
|
85
|
+
"mc_device_code_approve",
|
|
86
|
+
"mc_device_code_poll",
|
|
87
|
+
"mc_device_token_validate",
|
|
88
|
+
"mc_device_token_revoke",
|
|
89
|
+
"mc_device_token_rename",
|
|
90
|
+
"mc_device_tokens_list",
|
|
91
|
+
|
|
92
|
+
# ── Tier check (mig 330)
|
|
93
|
+
"mc_tier_check_limit",
|
|
94
|
+
|
|
95
|
+
# ── Health (mig 335)
|
|
96
|
+
"mc_health_check_secrets",
|
|
97
|
+
"mc_check_rpc_grants", # mig 336 — self-referential is fine
|
|
98
|
+
|
|
99
|
+
# ── Misc agent-callable
|
|
100
|
+
"mc_list_user_projects",
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def is_agent_callable(name: str) -> bool:
|
|
105
|
+
"""Quick membership check."""
|
|
106
|
+
return name in AGENT_CALLABLE_RPCS
|
|
@@ -19,6 +19,7 @@ meshcode/preferences.py
|
|
|
19
19
|
meshcode/protocol_handler.py
|
|
20
20
|
meshcode/protocol_v2.py
|
|
21
21
|
meshcode/quickstart.py
|
|
22
|
+
meshcode/rpc_allowlist.py
|
|
22
23
|
meshcode/run_agent.py
|
|
23
24
|
meshcode/secrets.py
|
|
24
25
|
meshcode/self_update.py
|
|
@@ -213,6 +214,7 @@ tests/test_mark_read_batch.py
|
|
|
213
214
|
tests/test_migration_integrity.py
|
|
214
215
|
tests/test_realtime_event_freshness.py
|
|
215
216
|
tests/test_rls_cross_tenant.py
|
|
217
|
+
tests/test_rpc_grants.py
|
|
216
218
|
tests/test_rpc_migrations.py
|
|
217
219
|
tests/test_security_regressions.py
|
|
218
220
|
tests/test_sentinel.py
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Tests for the rpc_allowlist + grant-coverage script (AUDIT-S2).
|
|
2
|
+
|
|
3
|
+
Live grant verification runs in CI via scripts/check_rpc_grants.py against
|
|
4
|
+
a real Supabase. These tests check the allowlist invariants offline so
|
|
5
|
+
local dev pytest still works without DB credentials.
|
|
6
|
+
"""
|
|
7
|
+
import re
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
from meshcode.rpc_allowlist import (
|
|
12
|
+
AGENT_CALLABLE_RPCS,
|
|
13
|
+
FORCE_PREFIX_EXEMPT,
|
|
14
|
+
is_agent_callable,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_allowlist_is_nonempty():
|
|
19
|
+
assert len(AGENT_CALLABLE_RPCS) >= 10
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_allowlist_has_no_duplicates():
|
|
23
|
+
assert len(AGENT_CALLABLE_RPCS) == len(set(AGENT_CALLABLE_RPCS))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_allowlist_no_excluded_prefixes():
|
|
27
|
+
"""Per convention, admin/billing/force/internal RPCs MUST NOT be agent-callable.
|
|
28
|
+
|
|
29
|
+
Exception: FORCE_PREFIX_EXEMPT lists known mc_force_* RPCs that are
|
|
30
|
+
legitimately agent-callable (install-guard recovery path).
|
|
31
|
+
"""
|
|
32
|
+
forbidden = re.compile(r"^(mc_admin_|mc_billing_|mc_force_|_mc_)")
|
|
33
|
+
bad = [
|
|
34
|
+
n for n in AGENT_CALLABLE_RPCS
|
|
35
|
+
if forbidden.match(n) and n not in FORCE_PREFIX_EXEMPT
|
|
36
|
+
]
|
|
37
|
+
assert not bad, f"convention violation — these must not be agent-callable: {bad}"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_allowlist_all_start_with_mc_prefix():
|
|
41
|
+
bad = [n for n in AGENT_CALLABLE_RPCS if not n.startswith("mc_")]
|
|
42
|
+
assert not bad, f"all entries must be public.mc_* RPCs; bad: {bad}"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_is_agent_callable_helper():
|
|
46
|
+
assert is_agent_callable("mc_task_create") is True
|
|
47
|
+
assert is_agent_callable("mc_admin_disconnect") is False
|
|
48
|
+
assert is_agent_callable("nonexistent_rpc") is False
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def test_known_agent_rpcs_are_listed():
|
|
52
|
+
"""Sentinel: if any of these go missing the allowlist has regressed."""
|
|
53
|
+
must_have = [
|
|
54
|
+
"mc_task_create",
|
|
55
|
+
"mc_send_message",
|
|
56
|
+
"mc_heartbeat",
|
|
57
|
+
"mc_boot",
|
|
58
|
+
"mc_acquire_agent_lease",
|
|
59
|
+
"mc_validate_api_key",
|
|
60
|
+
"mc_memory_set",
|
|
61
|
+
]
|
|
62
|
+
missing = [n for n in must_have if n not in AGENT_CALLABLE_RPCS]
|
|
63
|
+
assert not missing, f"core agent RPCs missing from allowlist: {missing}"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_known_non_agent_rpcs_are_NOT_listed():
|
|
67
|
+
must_not_have = [
|
|
68
|
+
"mc_admin_disconnect_agent",
|
|
69
|
+
"mc_admin_force_release_lease",
|
|
70
|
+
"mc_billing_set_plan",
|
|
71
|
+
"mc_force_clear_all",
|
|
72
|
+
"_mc_assert_task_scope",
|
|
73
|
+
"_mc_api_key_row",
|
|
74
|
+
]
|
|
75
|
+
leaks = [n for n in must_not_have if n in AGENT_CALLABLE_RPCS]
|
|
76
|
+
assert not leaks, f"privileged RPCs incorrectly on allowlist: {leaks}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_cross_agent_messaging.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-backend-wt/tests/test_status_enum_coverage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-noun-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.14 → meshcode-2.11.16}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|