meshcode 2.11.58__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.58 → meshcode-2.11.60}/PKG-INFO +1 -1
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/__init__.py +1 -1
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/hostd.py +154 -2
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.58 → meshcode-2.11.60}/pyproject.toml +1 -1
- {meshcode-2.11.58 → meshcode-2.11.60}/README.md +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/__main__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/cli.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/compat.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/daemon.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/doctor.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/invites.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/launcher.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/preferences.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/secrets.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/self_update.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode/upload.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/setup.cfg +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_prompt_inject 2.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_core.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_doctor.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.58 → meshcode-2.11.60}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -193,6 +193,151 @@ 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
|
+
|
|
267
|
+
# ------------------------------------------------------------------
|
|
268
|
+
# launchd trigger-start (macOS) — extends supervisor.py pattern.
|
|
269
|
+
# The hostd daemon is NOT autostart-at-login: RunAtLoad=false. It is
|
|
270
|
+
# kicked off on demand (button -> meshcode:// -> `launchctl kickstart`)
|
|
271
|
+
# and KeepAlive keeps it alive while it runs. One job per host.
|
|
272
|
+
# ------------------------------------------------------------------
|
|
273
|
+
|
|
274
|
+
_HOSTD_PLIST_LABEL = "io.meshcode.hostd"
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def _hostd_plist_path():
|
|
278
|
+
return Path.home() / "Library" / "LaunchAgents" / f"{_HOSTD_PLIST_LABEL}.plist"
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def _hostd_plist_xml() -> str:
|
|
282
|
+
import shutil
|
|
283
|
+
mc = shutil.which("meshcode") or f"{sys.executable} -m meshcode"
|
|
284
|
+
args = (mc.split() + ["hostd", "run"]) if " -m " in mc else [mc, "hostd", "run"]
|
|
285
|
+
args_xml = "\n".join(f" <string>{a}</string>" for a in args)
|
|
286
|
+
logdir = STATE_DIR / "logs"
|
|
287
|
+
logdir.mkdir(parents=True, exist_ok=True)
|
|
288
|
+
return f"""<?xml version="1.0" encoding="UTF-8"?>
|
|
289
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
290
|
+
<plist version="1.0">
|
|
291
|
+
<dict>
|
|
292
|
+
<key>Label</key><string>{_HOSTD_PLIST_LABEL}</string>
|
|
293
|
+
<key>ProgramArguments</key>
|
|
294
|
+
<array>
|
|
295
|
+
{args_xml}
|
|
296
|
+
</array>
|
|
297
|
+
<key>RunAtLoad</key><false/>
|
|
298
|
+
<key>KeepAlive</key><true/>
|
|
299
|
+
<key>ThrottleInterval</key><integer>10</integer>
|
|
300
|
+
<key>StandardOutPath</key><string>{logdir / "hostd.stdout.log"}</string>
|
|
301
|
+
<key>StandardErrorPath</key><string>{logdir / "hostd.stderr.log"}</string>
|
|
302
|
+
<key>EnvironmentVariables</key>
|
|
303
|
+
<dict>
|
|
304
|
+
<key>PATH</key><string>/usr/local/bin:/usr/bin:/bin:{os.path.dirname(sys.executable)}</string>
|
|
305
|
+
<key>MESHCODE_NO_AUTO_UPDATE</key><string>1</string>
|
|
306
|
+
</dict>
|
|
307
|
+
</dict>
|
|
308
|
+
</plist>
|
|
309
|
+
"""
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
def _hostd_install() -> int:
|
|
313
|
+
import platform
|
|
314
|
+
if platform.system() != "Darwin":
|
|
315
|
+
print("[hostd] launchd install is macOS only (Linux: use systemd --user; or run `meshcode hostd run` under your own supervisor).", file=sys.stderr)
|
|
316
|
+
return 2
|
|
317
|
+
plist = _hostd_plist_path()
|
|
318
|
+
plist.parent.mkdir(parents=True, exist_ok=True)
|
|
319
|
+
plist.write_text(_hostd_plist_xml(), encoding="utf-8")
|
|
320
|
+
subprocess.run(["launchctl", "unload", str(plist)], capture_output=True, text=True)
|
|
321
|
+
r = subprocess.run(["launchctl", "load", str(plist)], capture_output=True, text=True)
|
|
322
|
+
if r.returncode != 0:
|
|
323
|
+
print(f"[hostd] launchctl load failed: {r.stderr.strip()}", file=sys.stderr)
|
|
324
|
+
return 1
|
|
325
|
+
print(f"[hostd] installed (RunAtLoad=false, trigger-start). plist: {plist}")
|
|
326
|
+
print(f"[hostd] start now: launchctl kickstart gui/$(id -u)/{_HOSTD_PLIST_LABEL}")
|
|
327
|
+
return 0
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def _hostd_uninstall() -> int:
|
|
331
|
+
plist = _hostd_plist_path()
|
|
332
|
+
if not plist.exists():
|
|
333
|
+
print("[hostd] not installed")
|
|
334
|
+
return 0
|
|
335
|
+
subprocess.run(["launchctl", "unload", str(plist)], capture_output=True, text=True)
|
|
336
|
+
plist.unlink(missing_ok=True)
|
|
337
|
+
print("[hostd] uninstalled")
|
|
338
|
+
return 0
|
|
339
|
+
|
|
340
|
+
|
|
196
341
|
def cmd_hostd(args: list) -> int:
|
|
197
342
|
"""Entry point for `meshcode hostd ...`."""
|
|
198
343
|
if not args or args[0] in ("-h", "--help"):
|
|
@@ -211,6 +356,12 @@ def cmd_hostd(args: list) -> int:
|
|
|
211
356
|
print(json.dumps({"host_id": host_id, "needing_respawn": res}, indent=2))
|
|
212
357
|
return 0
|
|
213
358
|
|
|
359
|
+
if sub == "install":
|
|
360
|
+
return _hostd_install()
|
|
361
|
+
|
|
362
|
+
if sub == "uninstall":
|
|
363
|
+
return _hostd_uninstall()
|
|
364
|
+
|
|
214
365
|
if sub == "run":
|
|
215
366
|
if not api_key:
|
|
216
367
|
_log("FATAL: no api key — set MESHCODE_API_KEY")
|
|
@@ -219,8 +370,9 @@ def cmd_hostd(args: list) -> int:
|
|
|
219
370
|
while True:
|
|
220
371
|
try:
|
|
221
372
|
relaunched = _do_respawns(api_key, host_id)
|
|
222
|
-
|
|
223
|
-
|
|
373
|
+
recycled = _do_recycles(api_key, host_id)
|
|
374
|
+
if relaunched or recycled:
|
|
375
|
+
_log(f"sweep done — {relaunched} respawned, {recycled} recycled")
|
|
224
376
|
except Exception as e:
|
|
225
377
|
_log(f"WARN: sweep error: {e}")
|
|
226
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.58 → meshcode-2.11.60}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → 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.58 → 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.58 → 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.58 → meshcode-2.11.60}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.58 → 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.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → 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.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → meshcode-2.11.60}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → 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.58 → 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.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → meshcode-2.11.60}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.58 → 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.58 → 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
|