meshcode 2.11.87__tar.gz → 2.11.90__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.87 → meshcode-2.11.90}/PKG-INFO +1 -1
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/__init__.py +1 -1
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/hostd.py +110 -6
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode.egg-info/PKG-INFO +1 -1
- meshcode-2.11.90/meshcode.egg-info/SOURCES.txt +89 -0
- meshcode-2.11.90/meshcode.egg-info/top_level.txt +1 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/pyproject.toml +1 -1
- meshcode-2.11.87/meshcode/ascii_art.py +0 -638
- meshcode-2.11.87/meshcode/cli.py +0 -42
- meshcode-2.11.87/meshcode/compat.py +0 -174
- meshcode-2.11.87/meshcode/error_hints.py +0 -74
- meshcode-2.11.87/meshcode/exceptions.py +0 -52
- meshcode-2.11.87/meshcode/invites.py +0 -406
- meshcode-2.11.87/meshcode/launcher.py +0 -353
- meshcode-2.11.87/meshcode/launcher_install.py +0 -414
- meshcode-2.11.87/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.87/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.87/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.87/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.87/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.87/meshcode/preferences.py +0 -260
- meshcode-2.11.87/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.87/meshcode/secrets.py +0 -365
- meshcode-2.11.87/meshcode/supervisor.py +0 -186
- meshcode-2.11.87/meshcode/upload.py +0 -125
- meshcode-2.11.87/meshcode-backend-wt/comms_v4.py +0 -1941
- meshcode-2.11.87/meshcode-backend-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.87/meshcode-backend-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.87/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.87/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.87/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.87/meshcode-backend-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.87/meshcode-backend-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.87/meshcode-backend-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.87/meshcode-backend-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.87/meshcode-backend-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.87/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -82
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -638
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -42
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -174
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -74
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -52
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -406
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -353
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -414
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -260
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -148
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -958
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -365
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -345
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -926
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -186
- meshcode-2.11.87/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -125
- meshcode-2.11.87/meshcode-noun-wt/comms_v4.py +0 -1941
- meshcode-2.11.87/meshcode-noun-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.87/meshcode-noun-wt/meshcode/ascii_art.py +0 -638
- meshcode-2.11.87/meshcode-noun-wt/meshcode/cli.py +0 -42
- meshcode-2.11.87/meshcode-noun-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.87/meshcode-noun-wt/meshcode/compat.py +0 -174
- meshcode-2.11.87/meshcode-noun-wt/meshcode/error_hints.py +0 -74
- meshcode-2.11.87/meshcode-noun-wt/meshcode/exceptions.py +0 -52
- meshcode-2.11.87/meshcode-noun-wt/meshcode/invites.py +0 -406
- meshcode-2.11.87/meshcode-noun-wt/meshcode/launcher.py +0 -353
- meshcode-2.11.87/meshcode-noun-wt/meshcode/launcher_install.py +0 -414
- meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.87/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.87/meshcode-noun-wt/meshcode/preferences.py +0 -260
- meshcode-2.11.87/meshcode-noun-wt/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.87/meshcode-noun-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.87/meshcode-noun-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.87/meshcode-noun-wt/meshcode/secrets.py +0 -365
- meshcode-2.11.87/meshcode-noun-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.87/meshcode-noun-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.87/meshcode-noun-wt/meshcode/supervisor.py +0 -186
- meshcode-2.11.87/meshcode-noun-wt/meshcode/upload.py +0 -125
- meshcode-2.11.87/meshcode-noun-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.87/meshcode-noun-wt/tests/test_core.py +0 -216
- meshcode-2.11.87/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.87/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.87/meshcode-noun-wt/tests/test_exceptions.py +0 -107
- meshcode-2.11.87/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.87/meshcode-noun-wt/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.87/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.87/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.87/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.87/meshcode-noun-wt/tests/test_security_regressions.py +0 -171
- meshcode-2.11.87/meshcode-noun-wt/tests/test_sentinel.py +0 -148
- meshcode-2.11.87/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -231
- meshcode-2.11.87/meshcode-tasks-wt/comms_v4.py +0 -1941
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/ascii_art.py +0 -638
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/cli.py +0 -42
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/compat.py +0 -174
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/error_hints.py +0 -74
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/exceptions.py +0 -52
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/invites.py +0 -406
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/launcher.py +0 -353
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/launcher_install.py +0 -414
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/preferences.py +0 -260
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/secrets.py +0 -365
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/supervisor.py +0 -186
- meshcode-2.11.87/meshcode-tasks-wt/meshcode/upload.py +0 -125
- meshcode-2.11.87/meshcode-tasks-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_core.py +0 -216
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_exceptions.py +0 -107
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_security_regressions.py +0 -171
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_sentinel.py +0 -148
- meshcode-2.11.87/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -231
- meshcode-2.11.87/meshcode.egg-info/SOURCES.txt +0 -240
- meshcode-2.11.87/meshcode.egg-info/top_level.txt +0 -4
- meshcode-2.11.87/tests/test_autonomous_prompt_inject 2.py +0 -126
- meshcode-2.11.87/tests/test_core.py +0 -216
- meshcode-2.11.87/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.87/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.87/tests/test_exceptions.py +0 -107
- meshcode-2.11.87/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.87/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.87/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.87/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.87/tests/test_security_regressions.py +0 -171
- meshcode-2.11.87/tests/test_sentinel.py +0 -148
- meshcode-2.11.87/tests/test_status_enum_coverage.py +0 -231
- {meshcode-2.11.87 → meshcode-2.11.90}/README.md +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/__main__.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/_session_handoff_template.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/cli.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/compat.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/daemon.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/doctor.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/invites.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/launcher.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/preferences.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/secrets.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/self_update.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode/up.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/meshcode/upload.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/setup.cfg +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_core.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_doctor.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.87/meshcode-backend-wt → meshcode-2.11.90}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.87 → meshcode-2.11.90}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -45,6 +45,65 @@ import uuid
|
|
|
45
45
|
from pathlib import Path
|
|
46
46
|
from typing import Optional
|
|
47
47
|
|
|
48
|
+
# COMMANDER-LIFECYCLE-ALWAYS-WORKS (task ca947d7f): the version of the code THIS hostd
|
|
49
|
+
# process is executing, captured at import. A long-running hostd keeps this in memory, so a
|
|
50
|
+
# bg pip update (new SDK) does NOT land daemon-side fixes (e.g. the Stop kill sweep _do_stops,
|
|
51
|
+
# task 35bee961) until the PROCESS restarts — which is why Samuel's qa sat 'stopping' for ~1h.
|
|
52
|
+
# We compare this against the on-disk installed version each sweep and self-reexec on drift.
|
|
53
|
+
try:
|
|
54
|
+
from meshcode import __version__ as _RUNNING_VERSION
|
|
55
|
+
except Exception:
|
|
56
|
+
_RUNNING_VERSION = "0.0.0"
|
|
57
|
+
_LAST_UPDATE_KICK_MONO = 0.0
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _maybe_self_restart_on_version_drift() -> None:
|
|
61
|
+
"""Keep a running hostd CURRENT so Stop/launch always work (task ca947d7f).
|
|
62
|
+
|
|
63
|
+
(a) periodically kicks the detached, TTL-guarded bg updater so even a host with no
|
|
64
|
+
agent launches still pulls new wheels onto disk;
|
|
65
|
+
(b) when the ON-DISK installed version is newer than the code we're running, os.execv-
|
|
66
|
+
restarts at this safe sweep boundary (no spawn in flight; hostd_state.json incl.
|
|
67
|
+
headless_pids is persisted and survives the re-exec, so in-flight stop targets aren't
|
|
68
|
+
lost). After re-exec, running == on-disk -> no re-exec loop.
|
|
69
|
+
Opt out with MESHCODE_HOSTD_NO_AUTORESTART=1.
|
|
70
|
+
"""
|
|
71
|
+
global _LAST_UPDATE_KICK_MONO
|
|
72
|
+
if os.environ.get("MESHCODE_HOSTD_NO_AUTORESTART", "").lower() in ("1", "true", "yes"):
|
|
73
|
+
return
|
|
74
|
+
now = time.monotonic()
|
|
75
|
+
if now - _LAST_UPDATE_KICK_MONO >= 1800: # at most every 30min
|
|
76
|
+
_LAST_UPDATE_KICK_MONO = now
|
|
77
|
+
try:
|
|
78
|
+
from meshcode import self_update as _su
|
|
79
|
+
_su.check_and_maybe_update() # non-blocking, detached, TTL-guarded internally
|
|
80
|
+
except Exception:
|
|
81
|
+
pass
|
|
82
|
+
try:
|
|
83
|
+
import importlib.metadata as _ilmd
|
|
84
|
+
ondisk = _ilmd.version("meshcode") # reads dist-info METADATA on disk (pip-updated)
|
|
85
|
+
except Exception:
|
|
86
|
+
return
|
|
87
|
+
try:
|
|
88
|
+
from meshcode import self_update as _su
|
|
89
|
+
newer = _su._is_newer(ondisk, _RUNNING_VERSION)
|
|
90
|
+
except Exception:
|
|
91
|
+
def _vt(v):
|
|
92
|
+
return tuple(int(x) for x in v.split(".") if x.isdigit())
|
|
93
|
+
try:
|
|
94
|
+
newer = _vt(ondisk) > _vt(_RUNNING_VERSION)
|
|
95
|
+
except Exception:
|
|
96
|
+
newer = False
|
|
97
|
+
if not newer:
|
|
98
|
+
return
|
|
99
|
+
_log(f"VERSION DRIFT: running {_RUNNING_VERSION}, on-disk {ondisk} -> self-reexec to load "
|
|
100
|
+
f"new code (Stop kill sweep + daemon fixes). headless_pids persisted; KeepAlive re-attaches.")
|
|
101
|
+
try:
|
|
102
|
+
os.execv(sys.executable, [sys.executable, "-m", "meshcode"] + sys.argv[1:])
|
|
103
|
+
except Exception as e:
|
|
104
|
+
_log(f"WARN: self-reexec failed ({e}); exiting so the supervisor restarts us")
|
|
105
|
+
os._exit(0)
|
|
106
|
+
|
|
48
107
|
STATE_DIR = Path.home() / ".meshcode"
|
|
49
108
|
HOST_ID_PATH = STATE_DIR / "host_id"
|
|
50
109
|
LOG_PATH = STATE_DIR / "hostd.log"
|
|
@@ -822,28 +881,58 @@ def _hostd_bootstrap_if_needed(ttl_sec: int = 3600, verbose: bool = False) -> bo
|
|
|
822
881
|
return ok
|
|
823
882
|
|
|
824
883
|
|
|
884
|
+
def _running_daemon_is_stale() -> bool:
|
|
885
|
+
"""ca947d7f: True ONLY if hostd_state.json records a running_version that is STRICTLY older
|
|
886
|
+
than the on-disk installed version. Absent / unknown / equal / newer -> False (FAIL-SAFE:
|
|
887
|
+
never bounce a healthy or ambiguous daemon on the login-critical path — commander's safety
|
|
888
|
+
condition). NOTE: a daemon predating the running_version stamp (<2.11.90) wrote no marker, so
|
|
889
|
+
this returns False for it — that one-time transition still needs a manual restart; this guards
|
|
890
|
+
FUTURE transitions as defense-in-depth (the daemon's own self-reexec is the primary path)."""
|
|
891
|
+
try:
|
|
892
|
+
rv = (_load_state() or {}).get("running_version")
|
|
893
|
+
if not rv:
|
|
894
|
+
return False
|
|
895
|
+
import importlib.metadata as _ilmd
|
|
896
|
+
ondisk = _ilmd.version("meshcode")
|
|
897
|
+
from meshcode import self_update as _su
|
|
898
|
+
return bool(_su._is_newer(ondisk, rv))
|
|
899
|
+
except Exception:
|
|
900
|
+
return False
|
|
901
|
+
|
|
902
|
+
|
|
825
903
|
def _hostd_bootstrap(verbose: bool = False) -> bool:
|
|
826
904
|
"""Idempotent auto-install + start of hostd (task f12b9d36) — called from `meshcode login`
|
|
827
905
|
so onboarding is just `pip install meshcode` + `meshcode login` (no manual `hostd install`).
|
|
828
|
-
If the OS job already exists, just ensure it's running (don't bounce a live daemon)
|
|
829
|
-
|
|
906
|
+
If the OS job already exists, just ensure it's running (don't bounce a live daemon) UNLESS the
|
|
907
|
+
running daemon is provably STALE (ca947d7f), in which case force-restart it so Stop's kill
|
|
908
|
+
sweep + launch fixes land. Best-effort: NEVER raises — login must not fail on a hiccup."""
|
|
830
909
|
import platform
|
|
831
910
|
try:
|
|
911
|
+
force = _running_daemon_is_stale() # bounce ONLY a provably-stale daemon
|
|
912
|
+
if force:
|
|
913
|
+
_log(f"hostd bootstrap: running daemon is STALE vs on-disk -> force-restart")
|
|
832
914
|
sysname = platform.system()
|
|
833
915
|
if sysname == "Darwin":
|
|
834
916
|
if not _hostd_plist_path().exists():
|
|
835
917
|
_hostd_install() # writes plist + launchctl load
|
|
836
918
|
try:
|
|
837
919
|
uid = str(os.getuid())
|
|
838
|
-
|
|
839
|
-
|
|
920
|
+
# `kickstart -k` restarts a running job; plain `kickstart` only starts if down.
|
|
921
|
+
args = ["launchctl", "kickstart", f"gui/{uid}/{_HOSTD_PLIST_LABEL}"]
|
|
922
|
+
if force:
|
|
923
|
+
args.insert(2, "-k")
|
|
924
|
+
subprocess.run(args, capture_output=True, text=True)
|
|
840
925
|
except Exception:
|
|
841
926
|
pass
|
|
842
927
|
elif sysname == "Windows":
|
|
843
928
|
q = subprocess.run(["schtasks", "/Query", "/TN", _HOSTD_TASK_NAME],
|
|
844
929
|
capture_output=True, text=True)
|
|
845
930
|
if q.returncode == 0:
|
|
846
|
-
|
|
931
|
+
if force:
|
|
932
|
+
# stale -> stop the running instance, then start fresh on the new wheel.
|
|
933
|
+
subprocess.run(["schtasks", "/End", "/TN", _HOSTD_TASK_NAME],
|
|
934
|
+
capture_output=True, text=True)
|
|
935
|
+
# task exists -> ensure running (IgnoreNew => harmless if already up; no double-spawn)
|
|
847
936
|
subprocess.run(["schtasks", "/Run", "/TN", _HOSTD_TASK_NAME],
|
|
848
937
|
capture_output=True, text=True)
|
|
849
938
|
else:
|
|
@@ -851,6 +940,10 @@ def _hostd_bootstrap(verbose: bool = False) -> bool:
|
|
|
851
940
|
_hostd_install_windows()
|
|
852
941
|
else: # Linux + others
|
|
853
942
|
if shutil.which("systemctl"):
|
|
943
|
+
if force:
|
|
944
|
+
subprocess.run(["systemctl", "--user", "restart", _HOSTD_SYSTEMD_UNIT],
|
|
945
|
+
capture_output=True, text=True)
|
|
946
|
+
return True
|
|
854
947
|
act = subprocess.run(["systemctl", "--user", "is-active", _HOSTD_SYSTEMD_UNIT],
|
|
855
948
|
capture_output=True, text=True)
|
|
856
949
|
if act.stdout.strip() == "active":
|
|
@@ -965,7 +1058,14 @@ def cmd_hostd(args: list) -> int:
|
|
|
965
1058
|
_log(f"registered host {host_id} in mc_host_config")
|
|
966
1059
|
else:
|
|
967
1060
|
_log(f"WARN: host registration failed (dashboard may not list this host): {_reg}")
|
|
968
|
-
_log(f"hostd starting — host_id={host_id} interval={POLL_INTERVAL_SEC}s stale={STALE_SECONDS}s")
|
|
1061
|
+
_log(f"hostd starting — host_id={host_id} interval={POLL_INTERVAL_SEC}s stale={STALE_SECONDS}s v{_RUNNING_VERSION}")
|
|
1062
|
+
# ca947d7f: stamp the version THIS daemon is running into hostd_state.json so
|
|
1063
|
+
# `meshcode login` (_hostd_bootstrap) can detect a STALE running daemon and force-
|
|
1064
|
+
# restart it (the one-time transition onto a self-reexec-capable build). Best-effort.
|
|
1065
|
+
try:
|
|
1066
|
+
_st = _load_state(); _st["running_version"] = _RUNNING_VERSION; _save_state(_st)
|
|
1067
|
+
except Exception:
|
|
1068
|
+
pass
|
|
969
1069
|
# uptime-since-spawn (core's suggestion): if the daemon dies <2min, the last alive log +
|
|
970
1070
|
# the uptime stamped on the FATAL line reveal the <2min pattern for RC.
|
|
971
1071
|
_spawn_mono = time.monotonic()
|
|
@@ -980,6 +1080,10 @@ def cmd_hostd(args: list) -> int:
|
|
|
980
1080
|
_rpc("mc_host_heartbeat", {"p_api_key": api_key, "p_host_id": host_id})
|
|
981
1081
|
except Exception:
|
|
982
1082
|
pass
|
|
1083
|
+
# ca947d7f: keep this daemon CURRENT — if a newer SDK is on disk,
|
|
1084
|
+
# re-exec NOW (before doing work) so Stop's kill sweep + launch fixes
|
|
1085
|
+
# always run on a stale-running host without manual intervention.
|
|
1086
|
+
_maybe_self_restart_on_version_drift()
|
|
983
1087
|
relaunched = _do_respawns(api_key, host_id)
|
|
984
1088
|
recycled = _do_recycles(api_key, host_id)
|
|
985
1089
|
ver_recycled = _do_version_recycles(api_key, host_id)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
meshcode/__init__.py
|
|
4
|
+
meshcode/__main__.py
|
|
5
|
+
meshcode/_session_handoff_template.py
|
|
6
|
+
meshcode/_stop_hook_template.py
|
|
7
|
+
meshcode/ascii_art.py
|
|
8
|
+
meshcode/atomic_push.py
|
|
9
|
+
meshcode/claude_update.py
|
|
10
|
+
meshcode/cli.py
|
|
11
|
+
meshcode/comms_v4.py
|
|
12
|
+
meshcode/compat.py
|
|
13
|
+
meshcode/daemon.py
|
|
14
|
+
meshcode/date_parse.py
|
|
15
|
+
meshcode/doctor.py
|
|
16
|
+
meshcode/error_hints.py
|
|
17
|
+
meshcode/exceptions.py
|
|
18
|
+
meshcode/hostd.py
|
|
19
|
+
meshcode/invites.py
|
|
20
|
+
meshcode/launcher.py
|
|
21
|
+
meshcode/launcher_install.py
|
|
22
|
+
meshcode/preferences.py
|
|
23
|
+
meshcode/protocol_handler.py
|
|
24
|
+
meshcode/protocol_v2.py
|
|
25
|
+
meshcode/quickstart.py
|
|
26
|
+
meshcode/rpc_allowlist.py
|
|
27
|
+
meshcode/run_agent.py
|
|
28
|
+
meshcode/secrets.py
|
|
29
|
+
meshcode/self_update.py
|
|
30
|
+
meshcode/setup_clients.py
|
|
31
|
+
meshcode/supervisor.py
|
|
32
|
+
meshcode/up.py
|
|
33
|
+
meshcode/upload.py
|
|
34
|
+
meshcode.egg-info/PKG-INFO
|
|
35
|
+
meshcode.egg-info/SOURCES.txt
|
|
36
|
+
meshcode.egg-info/dependency_links.txt
|
|
37
|
+
meshcode.egg-info/entry_points.txt
|
|
38
|
+
meshcode.egg-info/requires.txt
|
|
39
|
+
meshcode.egg-info/top_level.txt
|
|
40
|
+
meshcode/meshcode_mcp/__init__.py
|
|
41
|
+
meshcode/meshcode_mcp/__main__.py
|
|
42
|
+
meshcode/meshcode_mcp/backend.py
|
|
43
|
+
meshcode/meshcode_mcp/realtime.py
|
|
44
|
+
meshcode/meshcode_mcp/server.py
|
|
45
|
+
meshcode/meshcode_mcp/sleep_signals.py
|
|
46
|
+
meshcode/meshcode_mcp/test_backend.py
|
|
47
|
+
meshcode/meshcode_mcp/test_boot_timing.py
|
|
48
|
+
meshcode/meshcode_mcp/test_install_guard.py
|
|
49
|
+
meshcode/meshcode_mcp/test_prefs_claude_version.py
|
|
50
|
+
meshcode/meshcode_mcp/test_realtime.py
|
|
51
|
+
meshcode/meshcode_mcp/test_server_wrapper.py
|
|
52
|
+
meshcode/scripts/check_secrets.py
|
|
53
|
+
meshcode/scripts/race_rate_harness.py
|
|
54
|
+
tests/test_auto_update_hardening.py
|
|
55
|
+
tests/test_autonomous_closegap_1.py
|
|
56
|
+
tests/test_autonomous_closegap_2.py
|
|
57
|
+
tests/test_autonomous_closegap_3.py
|
|
58
|
+
tests/test_autonomous_prompt_inject.py
|
|
59
|
+
tests/test_boot_bug_regression.py
|
|
60
|
+
tests/test_color_truecolor.py
|
|
61
|
+
tests/test_core.py
|
|
62
|
+
tests/test_cross_agent_messaging.py
|
|
63
|
+
tests/test_date_parse.py
|
|
64
|
+
tests/test_doctor.py
|
|
65
|
+
tests/test_epistemic_v1_python_sdk.py
|
|
66
|
+
tests/test_epistemic_v1_stop_conditions.py
|
|
67
|
+
tests/test_esc_deaf_state.py
|
|
68
|
+
tests/test_exceptions.py
|
|
69
|
+
tests/test_file_upload.py
|
|
70
|
+
tests/test_init_device_code.py
|
|
71
|
+
tests/test_install_guard.py
|
|
72
|
+
tests/test_lease_sigterm_release.py
|
|
73
|
+
tests/test_mark_read_batch.py
|
|
74
|
+
tests/test_marketplace_ratings.py
|
|
75
|
+
tests/test_migration_integrity.py
|
|
76
|
+
tests/test_realtime_event_freshness.py
|
|
77
|
+
tests/test_rls_cross_tenant.py
|
|
78
|
+
tests/test_rpc_grants.py
|
|
79
|
+
tests/test_rpc_migrations.py
|
|
80
|
+
tests/test_run_agent_dry_run.py
|
|
81
|
+
tests/test_run_agent_no_server_import.py
|
|
82
|
+
tests/test_security_regressions.py
|
|
83
|
+
tests/test_self_update_user_site.py
|
|
84
|
+
tests/test_sentinel.py
|
|
85
|
+
tests/test_setup_path.py
|
|
86
|
+
tests/test_sleep_signals.py
|
|
87
|
+
tests/test_status_enum_coverage.py
|
|
88
|
+
tests/test_stay_on_loop_hook.py
|
|
89
|
+
tests/test_wait_open_tasks_contradiction.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
meshcode
|