meshcode 2.11.102__tar.gz → 2.11.104__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.102 → meshcode-2.11.104}/PKG-INFO +1 -1
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/__init__.py +1 -1
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/hostd.py +73 -26
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.102 → meshcode-2.11.104}/pyproject.toml +1 -1
- {meshcode-2.11.102 → meshcode-2.11.104}/README.md +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/__main__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/_session_handoff_template 2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/_session_handoff_template.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/claude_update 2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/cli.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/compat.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/daemon.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/doctor.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/hostd 2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/invites.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/launcher.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/preferences.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/secrets.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/self_update.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/up 2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/up.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode/upload.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/PKG-INFO 2 +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/SOURCES 2.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/dependency_links 2.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/entry_points 2.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/requires 2.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/top_level 2.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/setup.cfg +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_autonomous_prompt_inject 2.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_core.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_doctor.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.102 → meshcode-2.11.104}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -801,19 +801,28 @@ def _do_stops(api_key: str, host_id: str) -> int:
|
|
|
801
801
|
return n
|
|
802
802
|
|
|
803
803
|
|
|
804
|
+
# 38523a98 reaper. Commander guardrail #1: DRY-RUN FIRST — ship LOG-ONLY, confirm ZERO false positives in
|
|
805
|
+
# the logs (REAP-DRYRUN lines), THEN flip _REAP_DRYRUN=False to actually kill. Protects against mis-killing
|
|
806
|
+
# a live agent (Samuel's trauma). Guardrail #2: the orphan grace before reaping a stopped-but-alive zombie.
|
|
807
|
+
_REAP_DRYRUN = True
|
|
808
|
+
_REAP_ORPHAN_GRACE_SEC = 90 # don't reap a just-stopped agent — give the cooperative self-exit time first
|
|
809
|
+
|
|
810
|
+
|
|
804
811
|
def _do_reap(api_key: str, host_id: str) -> int:
|
|
805
|
-
"""Reaper (38523a98) —
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
(B) ORPHAN: a headless agent the owner set to a TERMINAL state (desired_state
|
|
812
|
-
whose recorded PID is
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
desired_state='running' agent
|
|
812
|
+
"""Reaper (38523a98) — identify headless processes that should NOT be running. CONSERVATIVE + currently
|
|
813
|
+
DRY-RUN (LOG-ONLY, _REAP_DRYRUN=True): logs what it WOULD kill, kills nothing, until verified. Cases,
|
|
814
|
+
both protected by _kill_headless_pid's cmdline reuse-guard (final safety):
|
|
815
|
+
(A) DUP ghosts: an agent with >1 live `meshcode run <target>` process (double-spawn ghost terminals —
|
|
816
|
+
Samuel's 'se traslapan y desconectan otro'). Reap the EXTRAS, KEEP the recorded PID — only when
|
|
817
|
+
that recorded PID is confirmed ALIVE (known-good survivor). Dead recorded PID => don't guess.
|
|
818
|
+
(B) ORPHAN ZOMBIE: a headless agent the owner set to a TERMINAL state (desired_state stopped/crashed)
|
|
819
|
+
whose recorded PID is STILL ALIVE — the 'offline-but-still-reading' / 'lo cerré y sigue ahí' case.
|
|
820
|
+
A FRESH heartbeat here IS the zombie (still reading despite stop). Reap it, but only AFTER a
|
|
821
|
+
~90s grace from first-sighting (commander guardrail #2) so the cooperative self-exit
|
|
822
|
+
(mc_consume_stop -> must_exit) gets first crack. Grace tracked in hostd_state (reapseen/*).
|
|
823
|
+
NEVER touches: a VISIBLE agent (user owns the window), or a desired_state='running' agent (workers are
|
|
824
|
+
sacred — only the dup-EXTRA of a running agent is reapable, never its live survivor). Returns count
|
|
825
|
+
actually killed (0 while DRY-RUN)."""
|
|
817
826
|
cfg = _rpc("mc_host_config_get", {"p_api_key": api_key, "p_host_id": host_id})
|
|
818
827
|
if not cfg or not cfg.get("ok"):
|
|
819
828
|
return 0
|
|
@@ -834,35 +843,64 @@ def _do_reap(api_key: str, host_id: str) -> int:
|
|
|
834
843
|
except Exception:
|
|
835
844
|
return False
|
|
836
845
|
|
|
846
|
+
def _reap(target, pid, reason):
|
|
847
|
+
"""LOG-ONLY while _REAP_DRYRUN; else hard-kill (reuse-guard inside). Returns 1 if killed."""
|
|
848
|
+
nonlocal pids
|
|
849
|
+
if _REAP_DRYRUN:
|
|
850
|
+
_log(f"REAP-DRYRUN {target}: WOULD kill pid {pid} ({reason}) — log-only, no kill. "
|
|
851
|
+
f"Flip _REAP_DRYRUN=False after confirming zero false positives.")
|
|
852
|
+
return 0
|
|
853
|
+
if _kill_headless_pid(target, pid):
|
|
854
|
+
if pids.get(target) == pid:
|
|
855
|
+
pids.pop(target, None)
|
|
856
|
+
_log(f"REAP {target}: killed pid {pid} ({reason})")
|
|
857
|
+
return 1
|
|
858
|
+
return 0
|
|
859
|
+
|
|
837
860
|
st = _load_state()
|
|
838
861
|
pids = st.get("headless_pids") or {}
|
|
862
|
+
seen = st.get("reapseen") or {}
|
|
863
|
+
now = time.time()
|
|
839
864
|
n = 0
|
|
865
|
+
live_targets = set()
|
|
840
866
|
for a in agents:
|
|
841
|
-
if not a.get("headless"):
|
|
842
|
-
continue # NEVER reap a visible agent — the user closes its window
|
|
843
867
|
proj, agent = a.get("project_name"), a.get("name")
|
|
844
868
|
if not proj or not agent:
|
|
845
869
|
continue
|
|
846
870
|
target = f"{proj}/{agent}"
|
|
847
|
-
|
|
848
|
-
|
|
871
|
+
live_targets.add(target)
|
|
872
|
+
if not a.get("headless"):
|
|
873
|
+
continue # NEVER reap a visible agent — the user closes its window
|
|
874
|
+
ds = a.get("desired_state")
|
|
849
875
|
keep = pids.get(target)
|
|
850
876
|
keep_alive = _alive(keep)
|
|
851
|
-
# (A) DEDUP — only with a CONFIRMED-ALIVE survivor to keep.
|
|
877
|
+
# (A) DEDUP — only with a CONFIRMED-ALIVE survivor to keep. (Applies to running agents too: we only
|
|
878
|
+
# ever reap the EXTRA ghost, never the live survivor.)
|
|
852
879
|
if keep_alive:
|
|
853
880
|
discovered = _discover_agent_pids(target)
|
|
854
881
|
if len(discovered) > 1:
|
|
855
882
|
for p in discovered:
|
|
856
|
-
if p != keep
|
|
857
|
-
n +=
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
if
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
883
|
+
if p != keep:
|
|
884
|
+
n += _reap(target, p, f"duplicate ghost; kept live {keep}")
|
|
885
|
+
# (B) ORPHAN ZOMBIE — owner set stopped/crashed but the proc is still alive. NEVER for running.
|
|
886
|
+
if ds in ("stopped", "crashed") and keep_alive:
|
|
887
|
+
first = seen.get(target)
|
|
888
|
+
if first is None:
|
|
889
|
+
seen[target] = now # start the grace clock; self-exit gets first crack
|
|
890
|
+
_log(f"REAP-PENDING {target}: desired={ds} but pid {keep} alive (hb={a.get('heartbeat_age_s')}s) "
|
|
891
|
+
f"— {_REAP_ORPHAN_GRACE_SEC}s grace for cooperative self-exit before reap")
|
|
892
|
+
elif now - float(first) >= _REAP_ORPHAN_GRACE_SEC:
|
|
893
|
+
n += _reap(target, keep, f"orphan zombie desired={ds}, hb={a.get('heartbeat_age_s')}s, "
|
|
894
|
+
f"alive {int(now-float(first))}s past stop")
|
|
895
|
+
seen.pop(target, None)
|
|
896
|
+
else:
|
|
897
|
+
seen.pop(target, None) # recovered / running / gone — clear the grace clock
|
|
898
|
+
# prune grace entries for agents no longer in the roster
|
|
899
|
+
for t in list(seen.keys()):
|
|
900
|
+
if t not in live_targets:
|
|
901
|
+
seen.pop(t, None)
|
|
865
902
|
st["headless_pids"] = pids
|
|
903
|
+
st["reapseen"] = seen
|
|
866
904
|
_save_state(st)
|
|
867
905
|
return n
|
|
868
906
|
|
|
@@ -906,6 +944,15 @@ def _do_recycle_enforce(api_key: str, host_id: str) -> int:
|
|
|
906
944
|
f"recycled {c.get('recycled_age_s')}s ago, hb {c.get('heartbeat_age_s')}s) "
|
|
907
945
|
f"-> fast-path respawn will relaunch it.")
|
|
908
946
|
n += 1
|
|
947
|
+
# mig425 companion (49fd4ebf, anti kill-loop): a 'requested_never_consumed' candidate was
|
|
948
|
+
# killed for NEVER consuming its recycle (last_recycle_at still NULL). Record the recycle NOW
|
|
949
|
+
# so the respawn does NOT immediately re-match mig425 branch 2 (which keys on last_recycle_at
|
|
950
|
+
# IS NULL) -> it would otherwise force-kill the fresh process every sweep forever. Recording
|
|
951
|
+
# moves it into branch 1's window, which ages out. NO-OP until mig425 lands: mig419 candidates
|
|
952
|
+
# carry no enforce_reason, so this is skipped (the consumed-still-alive path already records).
|
|
953
|
+
if c.get("enforce_reason") == "requested_never_consumed":
|
|
954
|
+
_rpc("mc_record_recycle",
|
|
955
|
+
{"p_api_key": api_key, "p_project_id": c.get("project_id"), "p_agent_name": agent})
|
|
909
956
|
st["headless_pids"] = pids
|
|
910
957
|
_save_state(st)
|
|
911
958
|
return n
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/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.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_cross_agent_messaging.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_migration_integrity.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/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.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/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
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/build/lib/meshcode/setup_clients.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
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.102 → meshcode-2.11.104}/meshcode-noun-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.102 → meshcode-2.11.104}/meshcode-noun-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.102 → meshcode-2.11.104}/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
|