meshcode 2.11.74__tar.gz → 2.11.75__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.74 → meshcode-2.11.75}/PKG-INFO +1 -1
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/__init__.py +1 -1
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/comms_v4.py +10 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/hostd.py +96 -1
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.74 → meshcode-2.11.75}/pyproject.toml +1 -1
- {meshcode-2.11.74 → meshcode-2.11.75}/README.md +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/__main__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/cli.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/compat.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/daemon.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/doctor.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/hostd 3.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/invites.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/launcher.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/preferences.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/secrets.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/self_update.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/up.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode/upload.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/comms_v4.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_core.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/comms_v4.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_core.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/comms_v4.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/cli.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/compat.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/error_hints.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/invites.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/launcher.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/preferences.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/quickstart.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/run_agent.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/secrets.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/self_update.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/supervisor.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/meshcode/upload.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/scripts/sentinel.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_core.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_sentinel.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/PKG-INFO 2 +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/SOURCES 2.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/dependency_links 2.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/entry_points 2.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/requires 2.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/top_level 2.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/setup.cfg +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 10.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 11.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 12.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 13.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 14.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 15.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 16.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 17.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 18.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 19.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 2.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 20.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 21.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 22.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 3.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 4.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 5.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 6.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 7.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 8.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject 9.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_core.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_doctor.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.74 → meshcode-2.11.75}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -2388,6 +2388,16 @@ def login(api_key):
|
|
|
2388
2388
|
backend = secrets_mod.keyring_status().get("backend", "?")
|
|
2389
2389
|
print(f"[meshcode] Authenticated as {result['display_name']} ({result['email']})")
|
|
2390
2390
|
print(f"[meshcode] API key stored in OS keychain ({backend})")
|
|
2391
|
+
|
|
2392
|
+
# ZERO-SETUP (task f12b9d36): auto-bootstrap hostd so Launch works with no manual
|
|
2393
|
+
# `meshcode hostd install`. Idempotent + cross-platform + best-effort (never breaks login).
|
|
2394
|
+
try:
|
|
2395
|
+
import importlib as _il
|
|
2396
|
+
_hd = _il.import_module("meshcode.hostd")
|
|
2397
|
+
_hd._hostd_bootstrap(verbose=True)
|
|
2398
|
+
except Exception:
|
|
2399
|
+
pass
|
|
2400
|
+
|
|
2391
2401
|
return True
|
|
2392
2402
|
|
|
2393
2403
|
|
|
@@ -35,6 +35,7 @@ from __future__ import annotations
|
|
|
35
35
|
import json
|
|
36
36
|
import os
|
|
37
37
|
import shlex
|
|
38
|
+
import shutil
|
|
38
39
|
import subprocess
|
|
39
40
|
import sys
|
|
40
41
|
import time
|
|
@@ -485,12 +486,64 @@ def _hostd_install_windows() -> int:
|
|
|
485
486
|
return 0
|
|
486
487
|
|
|
487
488
|
|
|
489
|
+
_HOSTD_SYSTEMD_UNIT = "meshcode-hostd.service"
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
def _hostd_run_argv() -> list:
|
|
493
|
+
"""Argv that runs `meshcode hostd run`, resolving the installed console script or
|
|
494
|
+
falling back to `python -m meshcode`."""
|
|
495
|
+
mc = shutil.which("meshcode")
|
|
496
|
+
if mc:
|
|
497
|
+
return [mc, "hostd", "run"]
|
|
498
|
+
return [sys.executable, "-m", "meshcode", "hostd", "run"]
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
def _hostd_install_linux() -> int:
|
|
502
|
+
"""Linux (task f12b9d36): systemd --user unit (durable, auto-restart, survives logout-login)
|
|
503
|
+
with nohup fallback when systemd --user isn't usable (no session bus / container)."""
|
|
504
|
+
(STATE_DIR / "logs").mkdir(parents=True, exist_ok=True)
|
|
505
|
+
argv = _hostd_run_argv()
|
|
506
|
+
execstart = " ".join(shlex.quote(a) for a in argv)
|
|
507
|
+
if shutil.which("systemctl"):
|
|
508
|
+
unit_dir = Path.home() / ".config" / "systemd" / "user"
|
|
509
|
+
unit_dir.mkdir(parents=True, exist_ok=True)
|
|
510
|
+
(unit_dir / _HOSTD_SYSTEMD_UNIT).write_text(
|
|
511
|
+
"[Unit]\nDescription=MeshCode hostd\nAfter=default.target\n\n"
|
|
512
|
+
"[Service]\nType=simple\n"
|
|
513
|
+
"Environment=MESHCODE_NO_UPDATE=1\nEnvironment=MESHCODE_NO_AUTO_UPDATE=1\n"
|
|
514
|
+
"Environment=MESHCODE_HOSTD_POLL_SEC=10\n"
|
|
515
|
+
f"ExecStart={execstart}\nRestart=on-failure\nRestartSec=10\n\n"
|
|
516
|
+
"[Install]\nWantedBy=default.target\n",
|
|
517
|
+
encoding="utf-8",
|
|
518
|
+
)
|
|
519
|
+
subprocess.run(["systemctl", "--user", "daemon-reload"], capture_output=True, text=True)
|
|
520
|
+
r = subprocess.run(["systemctl", "--user", "enable", "--now", _HOSTD_SYSTEMD_UNIT],
|
|
521
|
+
capture_output=True, text=True)
|
|
522
|
+
if r.returncode == 0:
|
|
523
|
+
print(f"[hostd] installed systemd --user unit '{_HOSTD_SYSTEMD_UNIT}' (enabled + started)")
|
|
524
|
+
return 0
|
|
525
|
+
_log(f"systemd --user enable failed ({r.stderr.strip()}); falling back to nohup")
|
|
526
|
+
# nohup fallback: starts now (host registers); not reboot-persistent.
|
|
527
|
+
env = {**os.environ, "MESHCODE_NO_UPDATE": "1", "MESHCODE_NO_AUTO_UPDATE": "1",
|
|
528
|
+
"MESHCODE_HOSTD_POLL_SEC": "10"}
|
|
529
|
+
try:
|
|
530
|
+
logf = open(STATE_DIR / "logs" / "hostd.stdout.log", "ab")
|
|
531
|
+
except Exception:
|
|
532
|
+
logf = subprocess.DEVNULL
|
|
533
|
+
subprocess.Popen(argv, stdout=logf, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL,
|
|
534
|
+
start_new_session=True, env=env)
|
|
535
|
+
print("[hostd] started via nohup (no systemd --user available; not reboot-persistent)")
|
|
536
|
+
return 0
|
|
537
|
+
|
|
538
|
+
|
|
488
539
|
def _hostd_install() -> int:
|
|
489
540
|
import platform
|
|
490
541
|
if platform.system() == "Windows":
|
|
491
542
|
return _hostd_install_windows()
|
|
543
|
+
if platform.system() == "Linux":
|
|
544
|
+
return _hostd_install_linux()
|
|
492
545
|
if platform.system() != "Darwin":
|
|
493
|
-
print("[hostd]
|
|
546
|
+
print("[hostd] unsupported platform; run `meshcode hostd run` under your own supervisor.", file=sys.stderr)
|
|
494
547
|
return 2
|
|
495
548
|
plist = _hostd_plist_path()
|
|
496
549
|
plist.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -524,6 +577,48 @@ def _hostd_uninstall() -> int:
|
|
|
524
577
|
return 0
|
|
525
578
|
|
|
526
579
|
|
|
580
|
+
def _hostd_bootstrap(verbose: bool = False) -> bool:
|
|
581
|
+
"""Idempotent auto-install + start of hostd (task f12b9d36) — called from `meshcode login`
|
|
582
|
+
so onboarding is just `pip install meshcode` + `meshcode login` (no manual `hostd install`).
|
|
583
|
+
If the OS job already exists, just ensure it's running (don't bounce a live daemon); else
|
|
584
|
+
install + start. Best-effort: NEVER raises — login must not fail on a bootstrap hiccup."""
|
|
585
|
+
import platform
|
|
586
|
+
try:
|
|
587
|
+
sysname = platform.system()
|
|
588
|
+
if sysname == "Darwin":
|
|
589
|
+
if not _hostd_plist_path().exists():
|
|
590
|
+
_hostd_install() # writes plist + launchctl load
|
|
591
|
+
try:
|
|
592
|
+
uid = str(os.getuid())
|
|
593
|
+
subprocess.run(["launchctl", "kickstart", f"gui/{uid}/{_HOSTD_PLIST_LABEL}"],
|
|
594
|
+
capture_output=True, text=True) # start if not already running
|
|
595
|
+
except Exception:
|
|
596
|
+
pass
|
|
597
|
+
elif sysname == "Windows":
|
|
598
|
+
q = subprocess.run(["schtasks", "/Query", "/TN", _HOSTD_TASK_NAME],
|
|
599
|
+
capture_output=True, text=True)
|
|
600
|
+
if q.returncode != 0:
|
|
601
|
+
_hostd_install_windows()
|
|
602
|
+
subprocess.run(["schtasks", "/Run", "/TN", _HOSTD_TASK_NAME],
|
|
603
|
+
capture_output=True, text=True) # harmless if already running
|
|
604
|
+
else: # Linux + others
|
|
605
|
+
if shutil.which("systemctl"):
|
|
606
|
+
act = subprocess.run(["systemctl", "--user", "is-active", _HOSTD_SYSTEMD_UNIT],
|
|
607
|
+
capture_output=True, text=True)
|
|
608
|
+
if act.stdout.strip() == "active":
|
|
609
|
+
return True # already running — no-op
|
|
610
|
+
_hostd_install_linux() # systemd enable --now, or nohup fallback
|
|
611
|
+
if verbose:
|
|
612
|
+
print("[meshcode] hostd bootstrapped — Launch is ready (no manual setup needed).")
|
|
613
|
+
return True
|
|
614
|
+
except Exception as e:
|
|
615
|
+
try:
|
|
616
|
+
_log(f"hostd bootstrap skipped: {e}")
|
|
617
|
+
except Exception:
|
|
618
|
+
pass
|
|
619
|
+
return False
|
|
620
|
+
|
|
621
|
+
|
|
527
622
|
def cmd_hostd(args: list) -> int:
|
|
528
623
|
"""Entry point for `meshcode hostd ...`."""
|
|
529
624
|
if not args or args[0] in ("-h", "--help"):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.74 → meshcode-2.11.75}/meshcode-backend-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/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.74 → meshcode-2.11.75}/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.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_realtime_event_freshness.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/meshcode-backend-wt/tests/test_security_regressions.py
RENAMED
|
File without changes
|
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/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.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/launcher_install.py
RENAMED
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py
RENAMED
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py
RENAMED
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/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.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py
RENAMED
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py
RENAMED
|
File without changes
|
{meshcode-2.11.74 → meshcode-2.11.75}/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.74 → meshcode-2.11.75}/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
|