meshcode 2.11.86__tar.gz → 2.11.88__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.86 → meshcode-2.11.88}/PKG-INFO +1 -1
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/__init__.py +1 -1
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/_session_handoff_template.py +51 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/hostd.py +63 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/setup_clients.py +66 -1
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode.egg-info/PKG-INFO +1 -1
- meshcode-2.11.88/meshcode.egg-info/SOURCES.txt +89 -0
- meshcode-2.11.88/meshcode.egg-info/top_level.txt +1 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/pyproject.toml +1 -1
- meshcode-2.11.86/meshcode/ascii_art.py +0 -638
- meshcode-2.11.86/meshcode/cli.py +0 -42
- meshcode-2.11.86/meshcode/compat.py +0 -174
- meshcode-2.11.86/meshcode/error_hints.py +0 -74
- meshcode-2.11.86/meshcode/exceptions.py +0 -52
- meshcode-2.11.86/meshcode/invites.py +0 -406
- meshcode-2.11.86/meshcode/launcher.py +0 -353
- meshcode-2.11.86/meshcode/launcher_install.py +0 -414
- meshcode-2.11.86/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.86/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.86/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.86/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.86/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.86/meshcode/preferences.py +0 -260
- meshcode-2.11.86/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.86/meshcode/secrets.py +0 -365
- meshcode-2.11.86/meshcode/supervisor.py +0 -186
- meshcode-2.11.86/meshcode/upload.py +0 -125
- meshcode-2.11.86/meshcode-backend-wt/comms_v4.py +0 -1941
- meshcode-2.11.86/meshcode-backend-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.86/meshcode-backend-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.86/meshcode-backend-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.86/meshcode-backend-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.86/meshcode-backend-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.86/meshcode-backend-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.86/meshcode-backend-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.86/meshcode-backend-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.86/meshcode-backend-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.86/meshcode-backend-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.86/meshcode-backend-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/__init__.py +0 -82
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/ascii_art.py +0 -638
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/cli.py +0 -42
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/compat.py +0 -174
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/error_hints.py +0 -74
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/exceptions.py +0 -52
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/invites.py +0 -406
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/launcher.py +0 -353
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/launcher_install.py +0 -414
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/preferences.py +0 -260
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/quickstart.py +0 -148
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/run_agent.py +0 -958
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/secrets.py +0 -365
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/self_update.py +0 -345
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/setup_clients.py +0 -926
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/supervisor.py +0 -186
- meshcode-2.11.86/meshcode-noun-wt/build/lib/meshcode/upload.py +0 -125
- meshcode-2.11.86/meshcode-noun-wt/comms_v4.py +0 -1941
- meshcode-2.11.86/meshcode-noun-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.86/meshcode-noun-wt/meshcode/ascii_art.py +0 -638
- meshcode-2.11.86/meshcode-noun-wt/meshcode/cli.py +0 -42
- meshcode-2.11.86/meshcode-noun-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.86/meshcode-noun-wt/meshcode/compat.py +0 -174
- meshcode-2.11.86/meshcode-noun-wt/meshcode/error_hints.py +0 -74
- meshcode-2.11.86/meshcode-noun-wt/meshcode/exceptions.py +0 -52
- meshcode-2.11.86/meshcode-noun-wt/meshcode/invites.py +0 -406
- meshcode-2.11.86/meshcode-noun-wt/meshcode/launcher.py +0 -353
- meshcode-2.11.86/meshcode-noun-wt/meshcode/launcher_install.py +0 -414
- meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.86/meshcode-noun-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.86/meshcode-noun-wt/meshcode/preferences.py +0 -260
- meshcode-2.11.86/meshcode-noun-wt/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.86/meshcode-noun-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.86/meshcode-noun-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.86/meshcode-noun-wt/meshcode/secrets.py +0 -365
- meshcode-2.11.86/meshcode-noun-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.86/meshcode-noun-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.86/meshcode-noun-wt/meshcode/supervisor.py +0 -186
- meshcode-2.11.86/meshcode-noun-wt/meshcode/upload.py +0 -125
- meshcode-2.11.86/meshcode-noun-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.86/meshcode-noun-wt/tests/test_core.py +0 -216
- meshcode-2.11.86/meshcode-noun-wt/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.86/meshcode-noun-wt/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.86/meshcode-noun-wt/tests/test_exceptions.py +0 -107
- meshcode-2.11.86/meshcode-noun-wt/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.86/meshcode-noun-wt/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.86/meshcode-noun-wt/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.86/meshcode-noun-wt/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.86/meshcode-noun-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.86/meshcode-noun-wt/tests/test_security_regressions.py +0 -171
- meshcode-2.11.86/meshcode-noun-wt/tests/test_sentinel.py +0 -148
- meshcode-2.11.86/meshcode-noun-wt/tests/test_status_enum_coverage.py +0 -231
- meshcode-2.11.86/meshcode-tasks-wt/comms_v4.py +0 -1941
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/__init__.py +0 -82
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/ascii_art.py +0 -638
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/cli.py +0 -42
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/comms_v4.py +0 -3563
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/compat.py +0 -174
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/error_hints.py +0 -74
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/exceptions.py +0 -52
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/invites.py +0 -406
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/launcher.py +0 -353
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/launcher_install.py +0 -414
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/__init__.py +0 -22
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/__main__.py +0 -62
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/backend.py +0 -1261
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/realtime.py +0 -460
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/server.py +0 -4117
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/test_backend.py +0 -86
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/test_realtime.py +0 -95
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/meshcode_mcp/test_server_wrapper.py +0 -117
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/preferences.py +0 -260
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/protocol_v2.py +0 -129
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/quickstart.py +0 -148
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/run_agent.py +0 -958
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/secrets.py +0 -365
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/self_update.py +0 -345
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/setup_clients.py +0 -926
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/supervisor.py +0 -186
- meshcode-2.11.86/meshcode-tasks-wt/meshcode/upload.py +0 -125
- meshcode-2.11.86/meshcode-tasks-wt/scripts/sentinel.py +0 -257
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_core.py +0 -216
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_exceptions.py +0 -107
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_rpc_migrations.py +0 -387
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_security_regressions.py +0 -171
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_sentinel.py +0 -148
- meshcode-2.11.86/meshcode-tasks-wt/tests/test_status_enum_coverage.py +0 -231
- meshcode-2.11.86/meshcode.egg-info/SOURCES.txt +0 -240
- meshcode-2.11.86/meshcode.egg-info/top_level.txt +0 -4
- meshcode-2.11.86/tests/test_autonomous_prompt_inject 2.py +0 -126
- meshcode-2.11.86/tests/test_core.py +0 -216
- meshcode-2.11.86/tests/test_cross_agent_messaging.py +0 -366
- meshcode-2.11.86/tests/test_esc_deaf_state.py +0 -361
- meshcode-2.11.86/tests/test_exceptions.py +0 -107
- meshcode-2.11.86/tests/test_mark_read_batch.py +0 -200
- meshcode-2.11.86/tests/test_migration_integrity.py +0 -176
- meshcode-2.11.86/tests/test_realtime_event_freshness.py +0 -236
- meshcode-2.11.86/tests/test_rls_cross_tenant.py +0 -255
- meshcode-2.11.86/tests/test_security_regressions.py +0 -171
- meshcode-2.11.86/tests/test_sentinel.py +0 -148
- meshcode-2.11.86/tests/test_status_enum_coverage.py +0 -231
- {meshcode-2.11.86 → meshcode-2.11.88}/README.md +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/__main__.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/cli.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/comms_v4.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/compat.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/daemon.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/doctor.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/invites.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/launcher.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/preferences.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/run_agent.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/secrets.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/self_update.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode/up.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/meshcode/upload.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/setup.cfg +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_core.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_doctor.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.86/meshcode-backend-wt → meshcode-2.11.88}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.86 → meshcode-2.11.88}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -113,6 +113,54 @@ def _extract_tail(transcript_path: str):
|
|
|
113
113
|
return rows[-MAX_TURNS:]
|
|
114
114
|
|
|
115
115
|
|
|
116
|
+
def _request_recycle_if_marked(project_dir) -> None:
|
|
117
|
+
"""CTX-CLOSE-RELAUNCH (task 400fc536): commander-tier sessions ask the
|
|
118
|
+
server to recycle (close+relaunch fresh) at the next task-edge, right after
|
|
119
|
+
the handoff is snapshotted. Gated by the scaffold-baked
|
|
120
|
+
.claude/meshcode_hook_ctx.json recycle_on_compact flag (commander-only v1).
|
|
121
|
+
|
|
122
|
+
Best-effort in every dimension: missing marker/flag, missing creds, import
|
|
123
|
+
failure, network error -> silently skip. handoff.json is already written, so
|
|
124
|
+
a context-recycle still relaunches WITH context; and the actual exit is the
|
|
125
|
+
server's call (mc_consume_recycle at a task boundary), never this hook.
|
|
126
|
+
"""
|
|
127
|
+
try:
|
|
128
|
+
ctx_path = project_dir / ".claude" / "meshcode_hook_ctx.json"
|
|
129
|
+
if not ctx_path.exists():
|
|
130
|
+
return
|
|
131
|
+
if not json.loads(ctx_path.read_text(encoding="utf-8")).get("recycle_on_compact"):
|
|
132
|
+
return # non-commander -> in-place autocompact, no recycle
|
|
133
|
+
mcp = json.loads((project_dir / ".mcp.json").read_text(encoding="utf-8"))
|
|
134
|
+
env = (next(iter((mcp.get("mcpServers") or {}).values()), {}) or {}).get("env", {}) or {}
|
|
135
|
+
url = env.get("SUPABASE_URL"); key = env.get("SUPABASE_KEY")
|
|
136
|
+
pid = env.get("MESHCODE_PROJECT_ID"); agent = env.get("MESHCODE_AGENT")
|
|
137
|
+
if not (url and key and pid and agent):
|
|
138
|
+
return
|
|
139
|
+
api_key = os.environ.get("MESHCODE_API_KEY")
|
|
140
|
+
if not api_key:
|
|
141
|
+
try:
|
|
142
|
+
import importlib
|
|
143
|
+
api_key = importlib.import_module("meshcode.secrets").get_api_key(
|
|
144
|
+
profile=env.get("MESHCODE_KEYCHAIN_PROFILE") or "default")
|
|
145
|
+
except Exception:
|
|
146
|
+
api_key = None
|
|
147
|
+
if not api_key:
|
|
148
|
+
return
|
|
149
|
+
import urllib.request as _u
|
|
150
|
+
body = json.dumps({
|
|
151
|
+
"p_api_key": api_key, "p_project_id": pid,
|
|
152
|
+
"p_agent_name": agent, "p_allow_busy": True, # flag-now; exit deferred to wait-loop
|
|
153
|
+
}).encode("utf-8")
|
|
154
|
+
req = _u.Request(
|
|
155
|
+
url.rstrip("/") + "/rest/v1/rpc/mc_request_recycle",
|
|
156
|
+
data=body, method="POST",
|
|
157
|
+
headers={"apikey": key, "Authorization": "Bearer " + key,
|
|
158
|
+
"Content-Type": "application/json"})
|
|
159
|
+
_u.urlopen(req, timeout=5).read() # best-effort; ignore result per backend contract
|
|
160
|
+
except Exception as e: # noqa: BLE001 — never block compaction
|
|
161
|
+
sys.stderr.write(f"[session_handoff_write] recycle-request skipped: {e}\\n")
|
|
162
|
+
|
|
163
|
+
|
|
116
164
|
def main() -> int:
|
|
117
165
|
try:
|
|
118
166
|
raw = sys.stdin.read()
|
|
@@ -137,6 +185,9 @@ def main() -> int:
|
|
|
137
185
|
tmp.replace(d / "handoff.json")
|
|
138
186
|
except OSError as e:
|
|
139
187
|
sys.stderr.write(f"[session_handoff_write] skipped: {e}\\n")
|
|
188
|
+
# CTX-CLOSE-RELAUNCH (task 400fc536): now that the thread is snapshotted,
|
|
189
|
+
# commander-tier sessions ask the server to recycle at the next task-edge.
|
|
190
|
+
_request_recycle_if_marked(_project_dir())
|
|
140
191
|
return 0
|
|
141
192
|
|
|
142
193
|
|
|
@@ -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"
|
|
@@ -980,6 +1039,10 @@ def cmd_hostd(args: list) -> int:
|
|
|
980
1039
|
_rpc("mc_host_heartbeat", {"p_api_key": api_key, "p_host_id": host_id})
|
|
981
1040
|
except Exception:
|
|
982
1041
|
pass
|
|
1042
|
+
# ca947d7f: keep this daemon CURRENT — if a newer SDK is on disk,
|
|
1043
|
+
# re-exec NOW (before doing work) so Stop's kill sweep + launch fixes
|
|
1044
|
+
# always run on a stale-running host without manual intervention.
|
|
1045
|
+
_maybe_self_restart_on_version_drift()
|
|
983
1046
|
relaunched = _do_respawns(api_key, host_id)
|
|
984
1047
|
recycled = _do_recycles(api_key, host_id)
|
|
985
1048
|
ver_recycled = _do_version_recycles(api_key, host_id)
|
|
@@ -288,6 +288,49 @@ def _stop_hook_command() -> str:
|
|
|
288
288
|
return _hook_command("stay_on_loop.py")
|
|
289
289
|
|
|
290
290
|
|
|
291
|
+
# Mirror of server.py _LEADER_KEYWORDS / _is_leader_agent — the canonical
|
|
292
|
+
# agent-side commander/leader signal. Kept in sync intentionally (small, stable).
|
|
293
|
+
_LEADER_KEYWORDS = (
|
|
294
|
+
'commander', 'lead', 'orchestrat', 'coordinator', 'coordinat',
|
|
295
|
+
'coordinad', 'jefe', 'líder', 'lider', 'director', 'manager',
|
|
296
|
+
'chief', 'captain', 'boss', 'head agent',
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _is_commander_role(name: str, role: str = "") -> bool:
|
|
301
|
+
"""True if this agent is commander/leader tier (name+role keyword match).
|
|
302
|
+
|
|
303
|
+
CTX-CLOSE-RELAUNCH (task 400fc536): the PreCompact handoff hook self-requests
|
|
304
|
+
a context-recycle ONLY for commander-tier sessions (v1 = commander-only).
|
|
305
|
+
The hook subprocess cannot import server.py's _is_leader_agent (its module
|
|
306
|
+
globals aren't set there), so we BAKE this decision into the workspace at
|
|
307
|
+
scaffold time (commander directive) using the SAME heuristic the SDK already
|
|
308
|
+
uses everywhere for leader detection. This is a client-side BEHAVIOUR gate,
|
|
309
|
+
not authorization — the server's owner check in mc_request_recycle is the
|
|
310
|
+
real security boundary — so the name/role heuristic is safe here.
|
|
311
|
+
"""
|
|
312
|
+
hay = ((name or "") + " " + (role or "")).lower()
|
|
313
|
+
return any(k in hay for k in _LEADER_KEYWORDS)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def _write_hook_ctx_marker(ws: Path, is_commander: bool, agent: str = "", project: str = "") -> None:
|
|
317
|
+
"""Write .claude/meshcode_hook_ctx.json — the scaffold-baked signal the
|
|
318
|
+
PreCompact handoff hook reads to decide whether to self-request a
|
|
319
|
+
context-recycle (CTX-CLOSE-RELAUNCH). Best-effort."""
|
|
320
|
+
try:
|
|
321
|
+
(ws / ".claude").mkdir(parents=True, exist_ok=True)
|
|
322
|
+
(ws / ".claude" / "meshcode_hook_ctx.json").write_text(
|
|
323
|
+
json.dumps({
|
|
324
|
+
"recycle_on_compact": bool(is_commander),
|
|
325
|
+
"agent": agent,
|
|
326
|
+
"project": project,
|
|
327
|
+
}, indent=2) + "\n",
|
|
328
|
+
encoding="utf-8",
|
|
329
|
+
)
|
|
330
|
+
except Exception as _e: # noqa: BLE001 — never block scaffold on this marker
|
|
331
|
+
print(f"[meshcode] WARNING: could not write hook ctx marker: {_e}", file=sys.stderr)
|
|
332
|
+
|
|
333
|
+
|
|
291
334
|
# The meshcode hooks (event -> hook-script filename). Each is matched in
|
|
292
335
|
# settings.json by its script filename so the heal touches ONLY meshcode's own
|
|
293
336
|
# hooks and never a user-added hook on the same event.
|
|
@@ -1487,6 +1530,10 @@ Call `meshcode_wait` now.
|
|
|
1487
1530
|
except OSError:
|
|
1488
1531
|
pass
|
|
1489
1532
|
(ws / ".claude" / "settings.json").write_text(settings_body, encoding="utf-8")
|
|
1533
|
+
# CTX-CLOSE-RELAUNCH (task 400fc536): bake the commander-tier signal the
|
|
1534
|
+
# PreCompact handoff hook reads to decide whether to self-request a
|
|
1535
|
+
# context-recycle (commander-only v1).
|
|
1536
|
+
_write_hook_ctx_marker(ws, _is_commander_role(agent, role), agent=agent, project=project)
|
|
1490
1537
|
except Exception as _e:
|
|
1491
1538
|
print(f"[meshcode] WARNING: could not write /meshcode-wait command + hooks: {_e}", file=sys.stderr)
|
|
1492
1539
|
|
|
@@ -1749,7 +1796,25 @@ def patch_hooks(dry_run: bool = False) -> int:
|
|
|
1749
1796
|
except Exception as e: # noqa: BLE001 — never let one ws abort the sweep
|
|
1750
1797
|
settings_changed, settings_note = False, f"settings heal failed: {e}"
|
|
1751
1798
|
|
|
1752
|
-
|
|
1799
|
+
# CTX-CLOSE-RELAUNCH (task 400fc536): backfill the commander-tier marker
|
|
1800
|
+
# the PreCompact hook reads. Recompute is_commander from the workspace's
|
|
1801
|
+
# baked .mcp.json (MESHCODE_AGENT + MESHCODE_ROLE) so existing commanders
|
|
1802
|
+
# get the recycle trigger without a full re-scaffold.
|
|
1803
|
+
marker_note = "marker skipped"
|
|
1804
|
+
if not dry_run:
|
|
1805
|
+
try:
|
|
1806
|
+
mcp = json.loads((ws / ".mcp.json").read_text(encoding="utf-8"))
|
|
1807
|
+
env = (next(iter((mcp.get("mcpServers") or {}).values()), {}) or {}).get("env", {}) or {}
|
|
1808
|
+
_agent = env.get("MESHCODE_AGENT") or ws.name
|
|
1809
|
+
_role = env.get("MESHCODE_ROLE") or ""
|
|
1810
|
+
_write_hook_ctx_marker(ws, _is_commander_role(_agent, _role), agent=_agent, project=env.get("MESHCODE_PROJECT") or "")
|
|
1811
|
+
marker_note = "marker written"
|
|
1812
|
+
except Exception as e: # noqa: BLE001
|
|
1813
|
+
marker_note = f"marker skipped ({e})"
|
|
1814
|
+
else:
|
|
1815
|
+
marker_note = "marker would write"
|
|
1816
|
+
|
|
1817
|
+
record = f"{ws.name} ({body_note}; {settings_note}; {marker_note})"
|
|
1753
1818
|
(patched if (body_changed or settings_changed) else skipped).append(record)
|
|
1754
1819
|
|
|
1755
1820
|
verb = "would patch" if dry_run else "patched"
|
|
@@ -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
|