meshcode 2.11.168__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.
Files changed (119) hide show
  1. {meshcode-2.11.168 → meshcode-2.11.170}/PKG-INFO +1 -1
  2. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/comms_v4.py +1 -31
  4. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/hostd.py +14 -0
  5. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/run_agent.py +9 -22
  6. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode.egg-info/PKG-INFO +1 -1
  7. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode.egg-info/SOURCES.txt +0 -1
  8. {meshcode-2.11.168 → meshcode-2.11.170}/pyproject.toml +1 -1
  9. {meshcode-2.11.168 → meshcode-2.11.170}/README.md +0 -0
  10. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/__main__.py +0 -0
  11. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/_launch_smoke.py +0 -0
  12. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/_session_handoff_template.py +0 -0
  13. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/_stop_hook_template.py +0 -0
  14. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/_update_guard.py +0 -0
  15. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/ascii_art.py +0 -0
  16. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/atomic_push.py +0 -0
  17. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/claude_update.py +0 -0
  18. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/cli.py +0 -0
  19. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/compat.py +0 -0
  20. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/daemon.py +0 -0
  21. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/date_parse.py +0 -0
  22. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/doctor.py +0 -0
  23. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/error_hints.py +0 -0
  24. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/exceptions.py +0 -0
  25. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/hooks/__init__.py +0 -0
  26. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/hooks/push_guard.py +0 -0
  27. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/hooks/repo_path_lock.py +0 -0
  28. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/invites.py +0 -0
  29. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/launcher.py +0 -0
  30. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/launcher_install.py +0 -0
  31. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/__init__.py +0 -0
  32. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/__main__.py +0 -0
  33. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/backend.py +0 -0
  34. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/realtime.py +0 -0
  35. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/server.py +0 -0
  36. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  37. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_backend.py +0 -0
  38. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  39. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  40. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  41. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  42. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  43. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/preferences.py +0 -0
  44. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/protocol_handler.py +0 -0
  45. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/protocol_v2.py +0 -0
  46. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/quickstart.py +0 -0
  47. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/rpc_allowlist.py +0 -0
  48. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/scripts/check_secrets.py +0 -0
  49. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/scripts/race_rate_harness.py +0 -0
  50. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/secrets.py +0 -0
  51. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/self_update.py +0 -0
  52. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/setup_clients.py +0 -0
  53. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/supervisor.py +0 -0
  54. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/terminal_mirror_runner.py +0 -0
  55. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/up.py +0 -0
  56. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode/upload.py +0 -0
  57. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode.egg-info/dependency_links.txt +0 -0
  58. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode.egg-info/entry_points.txt +0 -0
  59. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode.egg-info/requires.txt +0 -0
  60. {meshcode-2.11.168 → meshcode-2.11.170}/meshcode.egg-info/top_level.txt +0 -0
  61. {meshcode-2.11.168 → meshcode-2.11.170}/setup.cfg +0 -0
  62. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_auto_update_hardening.py +0 -0
  63. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_autonomous_closegap_1.py +0 -0
  64. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_autonomous_closegap_2.py +0 -0
  65. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_autonomous_closegap_3.py +0 -0
  66. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_autonomous_prompt_inject.py +0 -0
  67. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_boot_bug_regression.py +0 -0
  68. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_color_truecolor.py +0 -0
  69. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_core.py +0 -0
  70. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_cross_agent_messaging.py +0 -0
  71. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_date_parse.py +0 -0
  72. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_doctor.py +0 -0
  73. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_ensure_boot_env_urgent_wake.py +0 -0
  74. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_epistemic_v1_python_sdk.py +0 -0
  75. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  76. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_esc_deaf_state.py +0 -0
  77. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_exceptions.py +0 -0
  78. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_file_upload.py +0 -0
  79. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_fleet_reaper.py +0 -0
  80. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_hostd_launch_pinned_env.py +0 -0
  81. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_hostd_serve_discovery_split.py +0 -0
  82. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_hostd_zombie_sessions.py +0 -0
  83. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_init_device_code.py +0 -0
  84. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_install_guard.py +0 -0
  85. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_launch_smoke.py +0 -0
  86. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_lease_sigterm_release.py +0 -0
  87. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_live_mesh_guard.py +0 -0
  88. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_mark_read_batch.py +0 -0
  89. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_marketplace_ratings.py +0 -0
  90. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_migration_integrity.py +0 -0
  91. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_no_appleevents_on_sweep.py +0 -0
  92. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_preflight_hb_gate.py +0 -0
  93. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_pretrust_claude.py +0 -0
  94. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_prompt_dedup_budget.py +0 -0
  95. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_push_guard.py +0 -0
  96. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_realtime_event_freshness.py +0 -0
  97. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_replica_base_workspace_fallback.py +0 -0
  98. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_replica_boot_protocol_unconditional.py +0 -0
  99. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_rls_cross_tenant.py +0 -0
  100. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_rm_guard.py +0 -0
  101. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_rpc_grants.py +0 -0
  102. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_rpc_migrations.py +0 -0
  103. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_run_agent_dry_run.py +0 -0
  104. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_run_agent_no_server_import.py +0 -0
  105. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_security_regressions.py +0 -0
  106. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_self_update_user_site.py +0 -0
  107. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_sentinel.py +0 -0
  108. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_session_replay_gate.py +0 -0
  109. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_setup_path.py +0 -0
  110. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_sleep_signals.py +0 -0
  111. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_status_enum_coverage.py +0 -0
  112. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_stay_on_loop_hook.py +0 -0
  113. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_stop_ghost_terminal.py +0 -0
  114. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_task_progress.py +0 -0
  115. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_terminal_lifecycle.py +0 -0
  116. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_up_launch_cmd.py +0 -0
  117. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_update_guard.py +0 -0
  118. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_urgent_wake_tmux.py +0 -0
  119. {meshcode-2.11.168 → meshcode-2.11.170}/tests/test_wait_open_tasks_contradiction.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.168
3
+ Version: 2.11.170
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -1,5 +1,5 @@
1
1
  """MeshCode — Real-time communication between AI agents."""
2
- __version__ = "2.11.168"
2
+ __version__ = "2.11.170"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -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:
@@ -3603,36 +3603,6 @@ 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)
3636
3606
  import importlib
3637
3607
  _run = importlib.import_module("meshcode.run_agent").run
3638
3608
  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))
@@ -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),
@@ -1718,28 +1718,7 @@ 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
- _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)
1721
+ _settings_model = (json.loads(_sp.read_text(encoding="utf-8")) or {}).get("model")
1743
1722
  if not _settings_model:
1744
1723
  _mcp_cfg = json.loads(mcp_json_path.read_text(encoding="utf-8"))
1745
1724
  _env = (next(iter((_mcp_cfg.get("mcpServers") or {}).values()), {}) or {}).get("env", {}) or {}
@@ -1909,6 +1888,14 @@ def run(agent: str, project: Optional[str] = None, editor_override: Optional[str
1909
1888
  # AND the repo-lock dir (whichever claude opens in).
1910
1889
  _pretrust_claude_workspace(str(ws), repo_lock)
1911
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
+
1912
1899
  # Flush all output before exec replaces this process — execvp does NOT
1913
1900
  # flush Python file buffers, so any buffered stdout (e.g. the banner)
1914
1901
  # would be silently lost.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.168
3
+ Version: 2.11.170
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -1,6 +1,5 @@
1
1
  README.md
2
2
  pyproject.toml
3
- setup.cfg
4
3
  meshcode/__init__.py
5
4
  meshcode/__main__.py
6
5
  meshcode/_launch_smoke.py
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meshcode"
7
- version = "2.11.168"
7
+ version = "2.11.170"
8
8
  description = "Real-time communication between AI agents — Supabase-backed CLI"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
File without changes
File without changes
File without changes
File without changes