meshcode 2.11.167__tar.gz → 2.11.168__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.168}/PKG-INFO +1 -1
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/__init__.py +1 -1
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/comms_v4.py +30 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/run_agent.py +22 -1
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.11.167 → meshcode-2.11.168}/pyproject.toml +1 -1
- {meshcode-2.11.167 → meshcode-2.11.168}/README.md +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/__main__.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/_launch_smoke.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/_session_handoff_template.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/_stop_hook_template.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/_update_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/ascii_art.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/atomic_push.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/claude_update.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/cli.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/compat.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/daemon.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/date_parse.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/doctor.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/error_hints.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/exceptions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/hooks/__init__.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/hooks/push_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/hooks/repo_path_lock.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/hostd.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/invites.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/launcher.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/launcher_install.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/preferences.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/protocol_handler.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/quickstart.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/rpc_allowlist.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/scripts/check_secrets.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/scripts/race_rate_harness.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/secrets.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/self_update.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/setup_clients.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/supervisor.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/terminal_mirror_runner.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/up.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode/upload.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/setup.cfg +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_auto_update_hardening.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_autonomous_closegap_1.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_autonomous_closegap_2.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_autonomous_closegap_3.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_autonomous_prompt_inject.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_boot_bug_regression.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_color_truecolor.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_core.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_date_parse.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_doctor.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_ensure_boot_env_urgent_wake.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_epistemic_v1_python_sdk.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_epistemic_v1_stop_conditions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_exceptions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_file_upload.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_fleet_reaper.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_hostd_launch_pinned_env.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_hostd_serve_discovery_split.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_hostd_zombie_sessions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_init_device_code.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_install_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_launch_smoke.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_lease_sigterm_release.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_live_mesh_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_marketplace_ratings.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_no_appleevents_on_sweep.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_preflight_hb_gate.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_pretrust_claude.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_prompt_dedup_budget.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_push_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_replica_base_workspace_fallback.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_replica_boot_protocol_unconditional.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_rm_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_rpc_grants.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_run_agent_dry_run.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_run_agent_no_server_import.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_security_regressions.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_self_update_user_site.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_sentinel.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_session_replay_gate.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_setup_path.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_sleep_signals.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_status_enum_coverage.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_stay_on_loop_hook.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_stop_ghost_terminal.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_task_progress.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_terminal_lifecycle.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_up_launch_cmd.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_update_guard.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_urgent_wake_tmux.py +0 -0
- {meshcode-2.11.167 → meshcode-2.11.168}/tests/test_wait_open_tasks_contradiction.py +0 -0
|
@@ -3603,6 +3603,36 @@ if __name__ == "__main__":
|
|
|
3603
3603
|
autonomous_env = (os.environ.get("MESHCODE_AUTONOMOUS", "").strip().lower()
|
|
3604
3604
|
in ("1", "true", "yes", "on"))
|
|
3605
3605
|
autonomous = bool(flags.get("autonomous")) or autonomous_env
|
|
3606
|
+
# SELF-BUMP-BEFORE-SPAWN (task 36fe573d ext, Samuel 2026-07-02): a human typing
|
|
3607
|
+
# `meshcode run` must land on the LATEST meshcode WITHOUT ever updating by hand —
|
|
3608
|
+
# "meshcode se debe actualizar solo, its the whole point". The CC-autoupdate +
|
|
3609
|
+
# settings.json model-pin-strip fixes live in newer meshcode; a user stuck on an
|
|
3610
|
+
# old CLI (e.g. 2.11.144) would never receive them (chicken-egg). hostd already
|
|
3611
|
+
# runs `meshcode self-upgrade` as a launch pre-step, but a DIRECT human
|
|
3612
|
+
# `meshcode run/go` went straight to spawn and skipped it — this closes that gap.
|
|
3613
|
+
#
|
|
3614
|
+
# Reuses the deferral-safe blocking updater (self_update.check_and_maybe_update_blocking,
|
|
3615
|
+
# force=False): version-check-first + idempotent ("already latest" -> no-op), NEVER
|
|
3616
|
+
# raises (offline/PyPI-fail -> stays on installed), DEFERS when a live agent serve
|
|
3617
|
+
# shares this env (never clobbers a running MCP — the class#2-clobber guard), and
|
|
3618
|
+
# honors the MESHCODE_NO_UPDATE=1 / --no-update opt-out. On a REAL upgrade the OLD
|
|
3619
|
+
# code is already imported in-process, so we RE-EXEC the same argv under the fresh
|
|
3620
|
+
# interpreter/site so THIS spawn runs the new launcher (versioned-env spawn-latest +
|
|
3621
|
+
# CC-autoupdate + pin-strip). The _MESHCODE_SELF_BUMPED sentinel makes the re-exec
|
|
3622
|
+
# one-shot (no loop; the post-exec run is already latest anyway). Skipped on --dry-run.
|
|
3623
|
+
if not dry_run and not os.environ.get("_MESHCODE_SELF_BUMPED"):
|
|
3624
|
+
try:
|
|
3625
|
+
import importlib as _il
|
|
3626
|
+
_su = _il.import_module("meshcode.self_update")
|
|
3627
|
+
_bumped = _su.check_and_maybe_update_blocking(verbose=True, force=False)
|
|
3628
|
+
if _bumped:
|
|
3629
|
+
print(f"[meshcode] re-exec under meshcode {_bumped} (self-bump) ...",
|
|
3630
|
+
file=sys.stderr)
|
|
3631
|
+
os.environ["_MESHCODE_SELF_BUMPED"] = str(_bumped)
|
|
3632
|
+
os.execv(sys.executable,
|
|
3633
|
+
[sys.executable, "-m", "meshcode"] + sys.argv[1:])
|
|
3634
|
+
except Exception as _sbe:
|
|
3635
|
+
print(f"[meshcode] self-bump skipped: {_sbe}", file=sys.stderr)
|
|
3606
3636
|
import importlib
|
|
3607
3637
|
_run = importlib.import_module("meshcode.run_agent").run
|
|
3608
3638
|
sys.exit(_run(agent, project=proj_override, editor_override=editor_override, permission_override=perm_override, dry_run=dry_run, autonomous=autonomous, repo_path=repo_override))
|
|
@@ -1718,7 +1718,28 @@ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str
|
|
|
1718
1718
|
_settings_model = None
|
|
1719
1719
|
_sp = ws / ".claude" / "settings.json"
|
|
1720
1720
|
if _sp.exists():
|
|
1721
|
-
|
|
1721
|
+
_sj = json.loads(_sp.read_text(encoding="utf-8")) or {}
|
|
1722
|
+
_settings_model = _sj.get("model")
|
|
1723
|
+
# DASHBOARD-MODEL-WINS (task 36fe573d, Samuel 2026-07-02): older meshcode
|
|
1724
|
+
# versions auto-pinned "model": PLATFORM_DEFAULT_MODEL into every workspace
|
|
1725
|
+
# settings.json. That legacy pin short-circuits the mc_agent_model_pref RPC
|
|
1726
|
+
# below, so the dashboard model dropdown (Fable 5, etc.) NEVER takes effect.
|
|
1727
|
+
# Current _meshcode_settings_dict() no longer writes it, but existing
|
|
1728
|
+
# workspaces keep the stale key forever (_heal_settings_hooks only touches
|
|
1729
|
+
# hooks). Strip it here ONLY when it equals the platform default (i.e. the
|
|
1730
|
+
# auto-written value) so a human-chosen NON-default model is preserved.
|
|
1731
|
+
# Net effect: dashboard pref becomes authoritative; if there is no pref,
|
|
1732
|
+
# PLATFORM_DEFAULT_MODEL is re-applied a few lines below -> same model, no
|
|
1733
|
+
# regression. Idempotent: after the first launch the key is gone.
|
|
1734
|
+
if _settings_model == PLATFORM_DEFAULT_MODEL:
|
|
1735
|
+
_sj.pop("model", None)
|
|
1736
|
+
try:
|
|
1737
|
+
_sp.write_text(json.dumps(_sj, indent=2) + "\n", encoding="utf-8")
|
|
1738
|
+
except Exception:
|
|
1739
|
+
pass
|
|
1740
|
+
_settings_model = None
|
|
1741
|
+
print("[meshcode] Stripped legacy settings.json model pin "
|
|
1742
|
+
"-> dashboard model_pref is now authoritative", file=sys.stderr)
|
|
1722
1743
|
if not _settings_model:
|
|
1723
1744
|
_mcp_cfg = json.loads(mcp_json_path.read_text(encoding="utf-8"))
|
|
1724
1745
|
_env = (next(iter((_mcp_cfg.get("mcpServers") or {}).values()), {}) or {}).get("env", {}) or {}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|