meshcode 2.11.27__tar.gz → 2.11.28__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.27 → meshcode-2.11.28}/PKG-INFO +1 -1
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/__init__.py +1 -1
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/server.py +12 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.27 → meshcode-2.11.28}/pyproject.toml +1 -1
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_auto_update_hardening.py +58 -1
- {meshcode-2.11.27 → meshcode-2.11.28}/README.md +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/__main__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/cli.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/compat.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/daemon.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/doctor.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/invites.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/launcher.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/preferences.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/secrets.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/self_update.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode/upload.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/setup.cfg +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_core.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_doctor.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.27 → meshcode-2.11.28}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -6104,6 +6104,18 @@ def _auto_update() -> None:
|
|
|
6104
6104
|
# legitimate upgrade check. Per task 8d5eed7a.
|
|
6105
6105
|
os.environ.pop("MESHCODE_UPDATED", None)
|
|
6106
6106
|
return
|
|
6107
|
+
# MCP-serve guard: this function runs synchronously at the top of
|
|
6108
|
+
# run_server(), BEFORE FastMCP starts serving JSON-RPC. A blocking
|
|
6109
|
+
# `pip install --upgrade` (timeout 60s) here easily blows Claude
|
|
6110
|
+
# Code's MCP handshake window (~5s) — tools never register and the
|
|
6111
|
+
# agent boots into "MCP tools not available". The CLI-side
|
|
6112
|
+
# self_update.py (spawned by `meshcode go` before execv into the
|
|
6113
|
+
# editor) already handles user-facing upgrades; in MCP serve context
|
|
6114
|
+
# we should never block the handshake to chase a newer version.
|
|
6115
|
+
# Detected via the MESHCODE_MCP_SERVE=1 sentinel set in __main__.py.
|
|
6116
|
+
if os.environ.get("MESHCODE_MCP_SERVE") == "1":
|
|
6117
|
+
log.debug("[meshcode] Auto-update skipped in MCP serve subprocess (CLI handles upgrades)")
|
|
6118
|
+
return
|
|
6107
6119
|
|
|
6108
6120
|
# Time-gate (task c0e7de87, 2026-05-19): the PyPI HEAD GET below has a 3s
|
|
6109
6121
|
# timeout (line ~5430) and pip-install another 60s. Hammering PyPI on
|
|
@@ -37,12 +37,18 @@ def _check_boot_version_drift_inline():
|
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
def _auto_update_inline_skeleton():
|
|
40
|
-
"""Subset of _auto_update covering the env-var gates only.
|
|
40
|
+
"""Subset of _auto_update covering the env-var gates only.
|
|
41
|
+
|
|
42
|
+
Order matters: the MCP-serve gate must fire BEFORE any network /
|
|
43
|
+
pip work so the MCP handshake window is never blocked.
|
|
44
|
+
"""
|
|
41
45
|
if os.environ.get("MESHCODE_AUTO_UPDATE", "1").lower() in ("0", "false", "no"):
|
|
42
46
|
return "disabled"
|
|
43
47
|
if os.environ.get("MESHCODE_UPDATED") == "1":
|
|
44
48
|
os.environ.pop("MESHCODE_UPDATED", None)
|
|
45
49
|
return "post_exec_skip"
|
|
50
|
+
if os.environ.get("MESHCODE_MCP_SERVE") == "1":
|
|
51
|
+
return "mcp_serve_skip"
|
|
46
52
|
return "would_check_pypi"
|
|
47
53
|
|
|
48
54
|
|
|
@@ -114,6 +120,57 @@ def test_auto_update_disabled_case_variants(monkeypatch):
|
|
|
114
120
|
assert _auto_update_inline_skeleton() == "disabled", f"value {val!r} failed"
|
|
115
121
|
|
|
116
122
|
|
|
123
|
+
# ---------------------------------------------------------------------------
|
|
124
|
+
# 3b. MCP-serve gate (added 2026-05-20 / 2.11.28)
|
|
125
|
+
#
|
|
126
|
+
# Symptom: right after publishing 2.11.27, commander agents booted with
|
|
127
|
+
# "MCP meshcode tools are not available" — first-turn deferred-tools list
|
|
128
|
+
# missing all meshcode_* tools. RC: _auto_update runs synchronously at the
|
|
129
|
+
# top of run_server() and does a blocking `pip install --upgrade` (60s
|
|
130
|
+
# timeout). When PyPI advertises a newer version, the install easily
|
|
131
|
+
# exceeds Claude Code's ~5s MCP handshake window and tools never register.
|
|
132
|
+
# Fix: skip _auto_update entirely when MESHCODE_MCP_SERVE=1; the CLI's
|
|
133
|
+
# self_update.py handles user-facing upgrades before execv.
|
|
134
|
+
# ---------------------------------------------------------------------------
|
|
135
|
+
|
|
136
|
+
def test_mcp_serve_sentinel_skips_update(monkeypatch):
|
|
137
|
+
monkeypatch.setenv("MESHCODE_MCP_SERVE", "1")
|
|
138
|
+
monkeypatch.delenv("MESHCODE_AUTO_UPDATE", raising=False)
|
|
139
|
+
monkeypatch.delenv("MESHCODE_UPDATED", raising=False)
|
|
140
|
+
assert _auto_update_inline_skeleton() == "mcp_serve_skip"
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def test_mcp_serve_gate_runs_before_pypi(monkeypatch):
|
|
144
|
+
"""MCP-serve gate must short-circuit before any 'would_check_pypi'
|
|
145
|
+
branch fires — otherwise the gate is moot because the slow path
|
|
146
|
+
runs anyway."""
|
|
147
|
+
monkeypatch.setenv("MESHCODE_MCP_SERVE", "1")
|
|
148
|
+
monkeypatch.delenv("MESHCODE_AUTO_UPDATE", raising=False)
|
|
149
|
+
monkeypatch.delenv("MESHCODE_UPDATED", raising=False)
|
|
150
|
+
assert _auto_update_inline_skeleton() != "would_check_pypi"
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def test_disabled_still_wins_over_mcp_serve(monkeypatch):
|
|
154
|
+
"""Explicit MESHCODE_AUTO_UPDATE=0 must remain the highest-priority
|
|
155
|
+
opt-out — useful for CI / debugging where the user wants to be
|
|
156
|
+
100% certain no pip side-effects fire."""
|
|
157
|
+
monkeypatch.setenv("MESHCODE_AUTO_UPDATE", "0")
|
|
158
|
+
monkeypatch.setenv("MESHCODE_MCP_SERVE", "1")
|
|
159
|
+
monkeypatch.delenv("MESHCODE_UPDATED", raising=False)
|
|
160
|
+
assert _auto_update_inline_skeleton() == "disabled"
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_post_exec_sentinel_still_wins_over_mcp_serve(monkeypatch):
|
|
164
|
+
"""If we just re-execed after an upgrade, the UPDATED sentinel
|
|
165
|
+
must still take precedence so it gets cleared (otherwise it
|
|
166
|
+
persists into subprocess children)."""
|
|
167
|
+
monkeypatch.setenv("MESHCODE_UPDATED", "1")
|
|
168
|
+
monkeypatch.setenv("MESHCODE_MCP_SERVE", "1")
|
|
169
|
+
monkeypatch.delenv("MESHCODE_AUTO_UPDATE", raising=False)
|
|
170
|
+
assert _auto_update_inline_skeleton() == "post_exec_skip"
|
|
171
|
+
assert "MESHCODE_UPDATED" not in os.environ
|
|
172
|
+
|
|
173
|
+
|
|
117
174
|
# ---------------------------------------------------------------------------
|
|
118
175
|
# 4. PyPI/pip behaviour matrix (mocked — covers the cells that don't need
|
|
119
176
|
# a live relaunch). Uses an inlined version of the post-gate _auto_update
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.27 → meshcode-2.11.28}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/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.27 → meshcode-2.11.28}/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.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/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.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/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.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/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.27 → meshcode-2.11.28}/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.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.27 → meshcode-2.11.28}/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.27 → meshcode-2.11.28}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|