meshcode 2.11.59__tar.gz → 2.11.60__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.59 → meshcode-2.11.60}/PKG-INFO +1 -1
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/__init__.py +1 -1
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/hostd.py +74 -2
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.59 → meshcode-2.11.60}/pyproject.toml +1 -1
- {meshcode-2.11.59 → meshcode-2.11.60}/README.md +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/__main__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/cli.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/compat.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/daemon.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/doctor.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/invites.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/launcher.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/preferences.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/secrets.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/self_update.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode/upload.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/setup.cfg +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_autonomous_prompt_inject 2.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_core.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_doctor.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.59 → meshcode-2.11.60}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -193,6 +193,77 @@ def _do_respawns(api_key: str, host_id: str) -> int:
|
|
|
193
193
|
return n
|
|
194
194
|
|
|
195
195
|
|
|
196
|
+
# ------------------------------------------------------------------
|
|
197
|
+
# Recycle — relaunch a managed agent at a TASK BOUNDARY when it exceeds
|
|
198
|
+
# its recycle policy. Uptime-recycle is daemon-driven (needs mig370's
|
|
199
|
+
# project_name in the roster). Context-recycle is agent-cooperative (the
|
|
200
|
+
# agent self-persists handoff + exits at a boundary; our respawn path then
|
|
201
|
+
# relaunches it). Recorded via mc_record_recycle — NEVER counted against
|
|
202
|
+
# the crash respawn cap.
|
|
203
|
+
# ------------------------------------------------------------------
|
|
204
|
+
|
|
205
|
+
_HOSTD_STATE_PATH = STATE_DIR / "hostd_state.json"
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _load_state() -> dict:
|
|
209
|
+
try:
|
|
210
|
+
if _HOSTD_STATE_PATH.exists():
|
|
211
|
+
return json.loads(_HOSTD_STATE_PATH.read_text(encoding="utf-8"))
|
|
212
|
+
except Exception:
|
|
213
|
+
pass
|
|
214
|
+
return {}
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _save_state(st: dict) -> None:
|
|
218
|
+
try:
|
|
219
|
+
STATE_DIR.mkdir(parents=True, exist_ok=True)
|
|
220
|
+
_HOSTD_STATE_PATH.write_text(json.dumps(st), encoding="utf-8")
|
|
221
|
+
except Exception:
|
|
222
|
+
pass
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _do_recycles(api_key: str, host_id: str) -> int:
|
|
226
|
+
"""Uptime-based recycle at task boundary. Returns number recycled."""
|
|
227
|
+
cfg = _rpc("mc_host_config_get", {"p_api_key": api_key, "p_host_id": host_id})
|
|
228
|
+
if not cfg or not cfg.get("ok"):
|
|
229
|
+
return 0
|
|
230
|
+
pol = _rpc("mc_host_recycle_policy", {"p_api_key": api_key, "p_host_id": host_id})
|
|
231
|
+
mode = (pol or {}).get("recycle_mode")
|
|
232
|
+
value = (pol or {}).get("recycle_value")
|
|
233
|
+
if mode != "time" or not value:
|
|
234
|
+
return 0 # context-recycle is agent-cooperative; only time is daemon-driven
|
|
235
|
+
st = _load_state()
|
|
236
|
+
now = time.time()
|
|
237
|
+
n = 0
|
|
238
|
+
seen = set()
|
|
239
|
+
for a in cfg.get("agents", []):
|
|
240
|
+
if a.get("desired_state") != "running":
|
|
241
|
+
continue
|
|
242
|
+
proj, agent = a.get("project_name"), a.get("name")
|
|
243
|
+
if not proj or not agent:
|
|
244
|
+
continue
|
|
245
|
+
key = f"{a.get('project_id')}/{agent}"
|
|
246
|
+
seen.add(key)
|
|
247
|
+
first = st.get(key)
|
|
248
|
+
if first is None:
|
|
249
|
+
st[key] = now # start the uptime clock on first observation
|
|
250
|
+
continue
|
|
251
|
+
if (a.get("status") or "") in BUSY_STATUSES:
|
|
252
|
+
continue # task boundary only — never mid-task
|
|
253
|
+
if (now - first) >= float(value) * 3600.0:
|
|
254
|
+
_log(f"RECYCLE {proj}/{agent} (uptime {(now-first)/3600:.1f}h >= {value}h)")
|
|
255
|
+
if _spawn_agent(proj, agent):
|
|
256
|
+
_rpc("mc_record_recycle",
|
|
257
|
+
{"p_api_key": api_key, "p_project_id": a.get("project_id"), "p_agent_name": agent})
|
|
258
|
+
st[key] = now # reset clock after recycle
|
|
259
|
+
n += 1
|
|
260
|
+
# prune state for agents no longer managed on this host
|
|
261
|
+
for k in [k for k in st if k not in seen]:
|
|
262
|
+
st.pop(k, None)
|
|
263
|
+
_save_state(st)
|
|
264
|
+
return n
|
|
265
|
+
|
|
266
|
+
|
|
196
267
|
# ------------------------------------------------------------------
|
|
197
268
|
# launchd trigger-start (macOS) — extends supervisor.py pattern.
|
|
198
269
|
# The hostd daemon is NOT autostart-at-login: RunAtLoad=false. It is
|
|
@@ -299,8 +370,9 @@ def cmd_hostd(args: list) -> int:
|
|
|
299
370
|
while True:
|
|
300
371
|
try:
|
|
301
372
|
relaunched = _do_respawns(api_key, host_id)
|
|
302
|
-
|
|
303
|
-
|
|
373
|
+
recycled = _do_recycles(api_key, host_id)
|
|
374
|
+
if relaunched or recycled:
|
|
375
|
+
_log(f"sweep done — {relaunched} respawned, {recycled} recycled")
|
|
304
376
|
except Exception as e:
|
|
305
377
|
_log(f"WARN: sweep error: {e}")
|
|
306
378
|
time.sleep(POLL_INTERVAL_SEC)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.59 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/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.59 → meshcode-2.11.60}/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.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/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.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/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.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/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.59 → meshcode-2.11.60}/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.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.59 → meshcode-2.11.60}/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.59 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|