meshcode 2.11.167__tar.gz → 2.11.170__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.167 → meshcode-2.11.170}/PKG-INFO +1 -1
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/__init__.py +1 -1
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/comms_v4.py +1 -1
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/hostd.py +14 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/run_agent.py +8 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode.egg-info/SOURCES.txt +0 -1
- {meshcode-2.11.167 → meshcode-2.11.170}/pyproject.toml +1 -1
- {meshcode-2.11.167 → meshcode-2.11.170}/README.md +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/__main__.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/_launch_smoke.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/_session_handoff_template.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/_update_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/cli.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/compat.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/daemon.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/doctor.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/hooks/__init__.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/hooks/push_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/hooks/repo_path_lock.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/invites.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/launcher.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/preferences.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/secrets.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/self_update.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/terminal_mirror_runner.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/up.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode/upload.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/setup.cfg +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_core.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_doctor.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_ensure_boot_env_urgent_wake.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_fleet_reaper.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_hostd_launch_pinned_env.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_hostd_serve_discovery_split.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_hostd_zombie_sessions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_launch_smoke.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_live_mesh_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_no_appleevents_on_sweep.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_preflight_hb_gate.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_pretrust_claude.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_prompt_dedup_budget.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_push_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_replica_base_workspace_fallback.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_replica_boot_protocol_unconditional.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_rm_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_session_replay_gate.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_stop_ghost_terminal.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_task_progress.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_terminal_lifecycle.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_up_launch_cmd.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_update_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_urgent_wake_tmux.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.170}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -3104,7 +3104,7 @@ if __name__ == "__main__":
|
|
|
3104
3104
|
|
|
3105
3105
|
# Auth guard: commands that talk to Supabase need a valid API key.
|
|
3106
3106
|
# doctor, help, version, login, prefs, launcher don't need auth.
|
|
3107
|
-
_NO_AUTH_CMDS = {"doctor", "compat", "upgrade", "self-upgrade", "help", "--help", "-h", "login",
|
|
3107
|
+
_NO_AUTH_CMDS = {"doctor", "smoke", "compat", "upgrade", "self-upgrade", "help", "--help", "-h", "login",
|
|
3108
3108
|
"init", "prefs", "launcher", "--version", "-V", "version",
|
|
3109
3109
|
"whoami", "profiles", "scan", "setup-path"}
|
|
3110
3110
|
if cmd not in _NO_AUTH_CMDS:
|
|
@@ -864,6 +864,7 @@ _ORPHAN_CLAIMED_LOGGED: set = set()
|
|
|
864
864
|
# C3 (task f9f4a2d3): names rejected by the is_valid_agent_name gate, logged once per
|
|
865
865
|
# name per daemon session so a poisoned DB row raises a visible alert without flooding.
|
|
866
866
|
_INVALID_NAME_LOGGED: set = set()
|
|
867
|
+
_AUTORESPAWN_OFF_LOGGED: set = set() # persistent fleet kill-switch (Samuel 2026-07-01)
|
|
867
868
|
|
|
868
869
|
|
|
869
870
|
def _do_respawns(api_key: str, host_id: str) -> int:
|
|
@@ -936,6 +937,19 @@ def _do_respawns(api_key: str, host_id: str) -> int:
|
|
|
936
937
|
# do NOT re-record here (that would inflate the count on a mere rate-limit skip).
|
|
937
938
|
_log(f"SKIP respawn {proj}/{agent}: not allowed (count={c.get('respawn_count')}, rate-limited/at-cap)")
|
|
938
939
|
continue
|
|
940
|
+
# PERSISTENT FLEET KILL-SWITCH (Samuel 2026-07-01, terminal-storm middle-ground):
|
|
941
|
+
# if ~/.meshcode/fleet-autorespawn-off exists, suppress ALL auto-respawn. EXPLICIT
|
|
942
|
+
# launches (restart_requested via mc_agent_power / the Launch button) STILL spawn, so
|
|
943
|
+
# commanders boot agents on demand while NOTHING auto-resurrects. Default (no file) =
|
|
944
|
+
# unchanged behavior. The permanent off-switch the 30-min fleet-native-disabled never was.
|
|
945
|
+
if not c.get("restart_requested") and (STATE_DIR / "fleet-autorespawn-off").exists():
|
|
946
|
+
_ao_t = f"{proj}/{agent}"
|
|
947
|
+
if _ao_t not in _AUTORESPAWN_OFF_LOGGED:
|
|
948
|
+
_AUTORESPAWN_OFF_LOGGED.add(_ao_t)
|
|
949
|
+
_log(f"AUTORESPAWN OFF: skip auto-respawn {_ao_t} "
|
|
950
|
+
f"(~/.meshcode/fleet-autorespawn-off present -- persistent kill-switch; "
|
|
951
|
+
f"explicit Launch still honored). Delete that file to re-enable auto-respawn.")
|
|
952
|
+
continue
|
|
939
953
|
# BOOT-AUTOSTART GATE (task b6da0d54; signal fixed in task 8067e04c): don't auto-launch
|
|
940
954
|
# an agent whose desired_state='running' was set BEFORE this hostd started — that's a
|
|
941
955
|
# boot-stale 'running' leftover from a prior session (the "terminals pop at boot" bug),
|
|
@@ -1888,6 +1888,14 @@ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str
|
|
|
1888
1888
|
# AND the repo-lock dir (whichever claude opens in).
|
|
1889
1889
|
_pretrust_claude_workspace(str(ws), repo_lock)
|
|
1890
1890
|
|
|
1891
|
+
# MCP handshake budget (mesh-dev piece-1, 2026-07-03): Claude Code's default
|
|
1892
|
+
# MCP_TIMEOUT is 5s, but the meshcode MCP server can legitimately take longer
|
|
1893
|
+
# on first connect (lease acquire vs a loaded Supabase pool = today's
|
|
1894
|
+
# fleet-wide "agent won't connect"). Give every launched agent a 240s window
|
|
1895
|
+
# automatically; setdefault so an explicit user/env override still wins.
|
|
1896
|
+
# Root fix (lease deferral off the handshake path) ships separately.
|
|
1897
|
+
os.environ.setdefault("MCP_TIMEOUT", "240000")
|
|
1898
|
+
|
|
1891
1899
|
# Flush all output before exec replaces this process — execvp does NOT
|
|
1892
1900
|
# flush Python file buffers, so any buffered stdout (e.g. the banner)
|
|
1893
1901
|
# would be silently lost.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|