meshcode 2.11.23__tar.gz → 2.11.24__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.23 → meshcode-2.11.24}/PKG-INFO +1 -1
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/__init__.py +1 -1
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/server.py +97 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.23 → meshcode-2.11.24}/pyproject.toml +1 -1
- {meshcode-2.11.23 → meshcode-2.11.24}/README.md +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/__main__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/cli.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/compat.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/daemon.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/doctor.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/invites.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/launcher.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/preferences.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/secrets.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/self_update.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode/upload.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/setup.cfg +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_core.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_doctor.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.23 → meshcode-2.11.24}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -5439,6 +5439,103 @@ def meshcode_atomic_push(
|
|
|
5439
5439
|
return {"error": str(e), "error_type": type(e).__name__}
|
|
5440
5440
|
|
|
5441
5441
|
|
|
5442
|
+
@mcp.tool()
|
|
5443
|
+
@with_working_status
|
|
5444
|
+
def meshcode_check_deploy_drift(
|
|
5445
|
+
target_url: str = "https://meshcode.io/build-sha.txt",
|
|
5446
|
+
expected_sha: Optional[str] = None,
|
|
5447
|
+
fallback_to_meta_tag: bool = True,
|
|
5448
|
+
) -> Dict[str, Any]:
|
|
5449
|
+
"""Compare a deployed build SHA against expected (or local origin HEAD).
|
|
5450
|
+
MESH-IMPROVE-6 Part B (pair with front-end's Vite plugin, 82a1378).
|
|
5451
|
+
|
|
5452
|
+
Strategy:
|
|
5453
|
+
1. fetch target_url; if text contains a 40-hex SHA, that's deployed_sha
|
|
5454
|
+
2. if (1) fails AND fallback_to_meta_tag, fetch the site root and grep
|
|
5455
|
+
<meta name="meshcode-build-sha" content="..."/>
|
|
5456
|
+
3. if expected_sha not provided, fetch origin/main HEAD via gh-api
|
|
5457
|
+
(uses PAT from .git/config — same pattern as atomic_push)
|
|
5458
|
+
4. report {deployed_sha, expected_sha, commits_ahead_estimate,
|
|
5459
|
+
drift_warning, suggested_action}
|
|
5460
|
+
|
|
5461
|
+
Args:
|
|
5462
|
+
target_url: where to read the deployed SHA from (default build-sha.txt)
|
|
5463
|
+
expected_sha: explicit expected; omit to auto-fetch origin/main HEAD
|
|
5464
|
+
fallback_to_meta_tag: if build-sha.txt 404s, try meta tag
|
|
5465
|
+
|
|
5466
|
+
Returns: {ok, deployed_sha, expected_sha, drift_warning, suggested_action}
|
|
5467
|
+
"""
|
|
5468
|
+
import re as _re
|
|
5469
|
+
import urllib.request as _ur
|
|
5470
|
+
import urllib.error as _ue
|
|
5471
|
+
deployed_sha = None
|
|
5472
|
+
fetch_err = None
|
|
5473
|
+
try:
|
|
5474
|
+
req = _ur.Request(target_url, headers={"User-Agent": "meshcode-deploy-drift/1.0"})
|
|
5475
|
+
with _ur.urlopen(req, timeout=10) as r:
|
|
5476
|
+
body = r.read().decode(errors="replace").strip()
|
|
5477
|
+
m = _re.search(r"\b[0-9a-f]{7,40}\b", body)
|
|
5478
|
+
if m:
|
|
5479
|
+
deployed_sha = m.group(0)
|
|
5480
|
+
except (_ue.HTTPError, _ue.URLError) as e:
|
|
5481
|
+
fetch_err = f"{type(e).__name__}: {e}"
|
|
5482
|
+
if deployed_sha is None and fallback_to_meta_tag:
|
|
5483
|
+
try:
|
|
5484
|
+
root_url = "/".join(target_url.split("/")[:3]) + "/"
|
|
5485
|
+
req = _ur.Request(root_url, headers={"User-Agent": "meshcode-deploy-drift/1.0"})
|
|
5486
|
+
with _ur.urlopen(req, timeout=10) as r:
|
|
5487
|
+
body = r.read().decode(errors="replace")
|
|
5488
|
+
m = _re.search(r'meta\s+name="meshcode-build-sha"\s+content="([0-9a-f]{7,40})"', body)
|
|
5489
|
+
if m:
|
|
5490
|
+
deployed_sha = m.group(1)
|
|
5491
|
+
except Exception as e:
|
|
5492
|
+
fetch_err = (fetch_err or "") + f"; meta_tag_fetch: {e}"
|
|
5493
|
+
if expected_sha is None:
|
|
5494
|
+
try:
|
|
5495
|
+
from meshcode.atomic_push import parse_git_config
|
|
5496
|
+
remotes = parse_git_config()
|
|
5497
|
+
if "origin" in remotes:
|
|
5498
|
+
owner, repo, pat = remotes["origin"]
|
|
5499
|
+
api_url = f"https://api.github.com/repos/{owner}/{repo}/git/ref/heads/main"
|
|
5500
|
+
req = _ur.Request(api_url)
|
|
5501
|
+
req.add_header("Authorization", f"Bearer {pat}")
|
|
5502
|
+
req.add_header("Accept", "application/vnd.github+json")
|
|
5503
|
+
with _ur.urlopen(req, timeout=10) as r:
|
|
5504
|
+
expected_sha = json.loads(r.read().decode())["object"]["sha"]
|
|
5505
|
+
except Exception as e:
|
|
5506
|
+
return {
|
|
5507
|
+
"ok": False,
|
|
5508
|
+
"error": f"could not resolve expected_sha: {e}",
|
|
5509
|
+
"deployed_sha": deployed_sha,
|
|
5510
|
+
"fetch_err": fetch_err,
|
|
5511
|
+
}
|
|
5512
|
+
if not deployed_sha:
|
|
5513
|
+
return {
|
|
5514
|
+
"ok": False,
|
|
5515
|
+
"error": "could not read deployed SHA from target_url or meta tag",
|
|
5516
|
+
"target_url": target_url,
|
|
5517
|
+
"expected_sha": expected_sha,
|
|
5518
|
+
"fetch_err": fetch_err,
|
|
5519
|
+
}
|
|
5520
|
+
# Compare prefixes (deployed might be 7-char short)
|
|
5521
|
+
drift = not (
|
|
5522
|
+
deployed_sha == expected_sha
|
|
5523
|
+
or deployed_sha == expected_sha[: len(deployed_sha)]
|
|
5524
|
+
or expected_sha == deployed_sha[: len(expected_sha)]
|
|
5525
|
+
)
|
|
5526
|
+
return {
|
|
5527
|
+
"ok": True,
|
|
5528
|
+
"deployed_sha": deployed_sha,
|
|
5529
|
+
"expected_sha": expected_sha,
|
|
5530
|
+
"drift_warning": drift,
|
|
5531
|
+
"suggested_action": (
|
|
5532
|
+
"wait for publish/build to rotate OR trigger remote build"
|
|
5533
|
+
if drift else "deployed matches expected — safe to verify"
|
|
5534
|
+
),
|
|
5535
|
+
"target_url": target_url,
|
|
5536
|
+
}
|
|
5537
|
+
|
|
5538
|
+
|
|
5442
5539
|
@mcp.tool()
|
|
5443
5540
|
@with_working_status
|
|
5444
5541
|
def meshcode_commander_brief(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.23 → meshcode-2.11.24}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/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.23 → meshcode-2.11.24}/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.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/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.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/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.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/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.23 → meshcode-2.11.24}/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.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.23 → meshcode-2.11.24}/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.23 → meshcode-2.11.24}/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
|