meshcode 2.11.101__tar.gz → 2.11.102__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.101 → meshcode-2.11.102}/PKG-INFO +1 -1
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/__init__.py +1 -1
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/hostd.py +69 -2
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.101 → meshcode-2.11.102}/pyproject.toml +1 -1
- {meshcode-2.11.101 → meshcode-2.11.102}/README.md +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/__main__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/_session_handoff_template 2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/_session_handoff_template.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/claude_update 2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/cli.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/compat.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/daemon.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/doctor.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/hostd 2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/invites.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/launcher.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/preferences.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/secrets.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/self_update.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/up 2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/up.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode/upload.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/PKG-INFO 2 +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/SOURCES 2.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/dependency_links 2.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/entry_points 2.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/requires 2.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/top_level 2.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/setup.cfg +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_autonomous_prompt_inject 2.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_core.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_doctor.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.101 → meshcode-2.11.102}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -801,6 +801,72 @@ def _do_stops(api_key: str, host_id: str) -> int:
|
|
|
801
801
|
return n
|
|
802
802
|
|
|
803
803
|
|
|
804
|
+
def _do_reap(api_key: str, host_id: str) -> int:
|
|
805
|
+
"""Reaper (38523a98) — kill headless processes that should NOT be running. CONSERVATIVE: a no-op in
|
|
806
|
+
normal operation. Both cases are protected by _kill_headless_pid's cmdline reuse-guard (final safety):
|
|
807
|
+
(A) DUP ghosts: an agent with >1 live `meshcode run <target>` process (a double-spawn left ghost
|
|
808
|
+
terminals — Samuel's 'se traslapan y desconectan otro'). Kill the EXTRAS, KEEP the recorded PID
|
|
809
|
+
— but ONLY when that recorded PID is itself confirmed ALIVE, so a known-good survivor stays. If
|
|
810
|
+
the recorded PID is dead we do NOT guess a survivor (leave it to _do_respawns/_do_stops).
|
|
811
|
+
(B) ORPHAN: a headless agent the owner set to a TERMINAL state (desired_state in stopped/crashed)
|
|
812
|
+
whose recorded PID is still alive AND heartbeat is stale (>=90s, so NOT a just-recovered agent)
|
|
813
|
+
— the 'offline but still reading' case. _do_stops (runs first) already kills stopped+FRESH; this
|
|
814
|
+
catches the stale-but-alive gap + 'crashed'.
|
|
815
|
+
NEVER reaps: a VISIBLE agent (user owns the window), a FRESH-heartbeat agent (genuinely alive), or a
|
|
816
|
+
desired_state='running' agent. Returns number of processes killed."""
|
|
817
|
+
cfg = _rpc("mc_host_config_get", {"p_api_key": api_key, "p_host_id": host_id})
|
|
818
|
+
if not cfg or not cfg.get("ok"):
|
|
819
|
+
return 0
|
|
820
|
+
agents = cfg.get("agents") or []
|
|
821
|
+
if not agents:
|
|
822
|
+
return 0
|
|
823
|
+
|
|
824
|
+
def _alive(p) -> bool:
|
|
825
|
+
if not p:
|
|
826
|
+
return False
|
|
827
|
+
try:
|
|
828
|
+
os.kill(int(p), 0)
|
|
829
|
+
return True
|
|
830
|
+
except ProcessLookupError:
|
|
831
|
+
return False
|
|
832
|
+
except PermissionError:
|
|
833
|
+
return True # exists, owned by another uid — treat as alive (don't reap blindly)
|
|
834
|
+
except Exception:
|
|
835
|
+
return False
|
|
836
|
+
|
|
837
|
+
st = _load_state()
|
|
838
|
+
pids = st.get("headless_pids") or {}
|
|
839
|
+
n = 0
|
|
840
|
+
for a in agents:
|
|
841
|
+
if not a.get("headless"):
|
|
842
|
+
continue # NEVER reap a visible agent — the user closes its window
|
|
843
|
+
proj, agent = a.get("project_name"), a.get("name")
|
|
844
|
+
if not proj or not agent:
|
|
845
|
+
continue
|
|
846
|
+
target = f"{proj}/{agent}"
|
|
847
|
+
hb = a.get("heartbeat_age_s")
|
|
848
|
+
fresh = (hb is not None and hb < 90) # genuinely alive => never reap
|
|
849
|
+
keep = pids.get(target)
|
|
850
|
+
keep_alive = _alive(keep)
|
|
851
|
+
# (A) DEDUP — only with a CONFIRMED-ALIVE survivor to keep.
|
|
852
|
+
if keep_alive:
|
|
853
|
+
discovered = _discover_agent_pids(target)
|
|
854
|
+
if len(discovered) > 1:
|
|
855
|
+
for p in discovered:
|
|
856
|
+
if p != keep and _kill_headless_pid(target, p):
|
|
857
|
+
n += 1
|
|
858
|
+
_log(f"REAP-DUP {target}: killed duplicate ghost pid {p} (kept live {keep})")
|
|
859
|
+
# (B) ORPHAN — owner set it stopped/crashed, it's not a recovered (fresh-hb) agent.
|
|
860
|
+
if keep_alive and (a.get("desired_state") in ("stopped", "crashed")) and not fresh:
|
|
861
|
+
if _kill_headless_pid(target, keep):
|
|
862
|
+
pids.pop(target, None)
|
|
863
|
+
n += 1
|
|
864
|
+
_log(f"REAP {target}: killed orphan (desired={a.get('desired_state')}, hb={hb}s) headless pid {keep}")
|
|
865
|
+
st["headless_pids"] = pids
|
|
866
|
+
_save_state(st)
|
|
867
|
+
return n
|
|
868
|
+
|
|
869
|
+
|
|
804
870
|
def _do_recycle_enforce(api_key: str, host_id: str) -> int:
|
|
805
871
|
"""RECYCLE-MUST-GUARANTEE-RESPAWN (task c0fc5597). An interactive claude (no --print) can't
|
|
806
872
|
self-exit on must_exit=recycle: the model leaves its loop but the process idles + the MCP
|
|
@@ -1387,10 +1453,11 @@ def cmd_hostd(args: list) -> int:
|
|
|
1387
1453
|
recycled = _do_recycles(api_key, host_id)
|
|
1388
1454
|
ver_recycled = _do_version_recycles(api_key, host_id)
|
|
1389
1455
|
stopped = _do_stops(api_key, host_id)
|
|
1456
|
+
reaped = _do_reap(api_key, host_id) # 38523a98: kill ghosts/dup-PIDs/crashed-orphans
|
|
1390
1457
|
_gc_headless_pids() # cb90b058: drop dead PIDs (stale entry can't mask a live agent)
|
|
1391
1458
|
_up = int(time.monotonic() - _spawn_mono)
|
|
1392
|
-
if relaunched or recycled or ver_recycled or stopped or enforced:
|
|
1393
|
-
_log(f"sweep done (uptime={_up}s) — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled, {stopped} stopped, {enforced} recycle-enforced")
|
|
1459
|
+
if relaunched or recycled or ver_recycled or stopped or enforced or reaped:
|
|
1460
|
+
_log(f"sweep done (uptime={_up}s) — {relaunched} respawned, {recycled} recycled, {ver_recycled} version-recycled, {stopped} stopped, {enforced} recycle-enforced, {reaped} reaped")
|
|
1394
1461
|
elif time.monotonic() - _last_alive_log >= 60:
|
|
1395
1462
|
_log(f"alive — uptime={_up}s")
|
|
1396
1463
|
_last_alive_log = time.monotonic()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/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.101 → meshcode-2.11.102}/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.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_migration_integrity.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/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.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/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.101 → meshcode-2.11.102}/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.101 → meshcode-2.11.102}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/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.101 → meshcode-2.11.102}/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.101 → meshcode-2.11.102}/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.101 → meshcode-2.11.102}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-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.101 → meshcode-2.11.102}/meshcode-tasks-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.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.101 → meshcode-2.11.102}/meshcode-tasks-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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|