meshcode 2.10.18__tar.gz → 2.10.19__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 (32) hide show
  1. {meshcode-2.10.18 → meshcode-2.10.19}/PKG-INFO +1 -1
  2. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/__init__.py +1 -1
  3. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/server.py +22 -5
  4. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.10.18 → meshcode-2.10.19}/pyproject.toml +1 -1
  6. {meshcode-2.10.18 → meshcode-2.10.19}/README.md +0 -0
  7. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/ascii_art.py +0 -0
  8. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/cli.py +0 -0
  9. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/comms_v4.py +0 -0
  10. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/invites.py +0 -0
  11. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/launcher.py +0 -0
  12. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/launcher_install.py +0 -0
  13. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/__init__.py +0 -0
  14. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/__main__.py +0 -0
  15. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/backend.py +0 -0
  16. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/realtime.py +0 -0
  17. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/test_backend.py +0 -0
  18. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  19. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  20. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/preferences.py +0 -0
  21. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/protocol_v2.py +0 -0
  22. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/run_agent.py +0 -0
  23. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/secrets.py +0 -0
  24. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/self_update.py +0 -0
  25. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/setup_clients.py +0 -0
  26. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/SOURCES.txt +0 -0
  27. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/dependency_links.txt +0 -0
  28. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/entry_points.txt +0 -0
  29. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/requires.txt +0 -0
  30. {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/top_level.txt +0 -0
  31. {meshcode-2.10.18 → meshcode-2.10.19}/setup.cfg +0 -0
  32. {meshcode-2.10.18 → meshcode-2.10.19}/tests/test_status_enum_coverage.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.10.18
3
+ Version: 2.10.19
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,2 +1,2 @@
1
1
  """MeshCode — Real-time communication between AI agents."""
2
- __version__ = "2.10.18"
2
+ __version__ = "2.10.19"
@@ -576,10 +576,11 @@ def with_working_status(func):
576
576
  _record_event_bg("tool_call", {"tool": name, "args_keys": list(kwargs.keys())})
577
577
  try:
578
578
  return await func(*args, **kwargs)
579
- except asyncio.CancelledError:
579
+ except (asyncio.CancelledError, KeyboardInterrupt):
580
580
  # User pressed ESC or MCP client cancelled the request.
581
- # Let it propagate cleanly FastMCP handles cancellation.
582
- raise
581
+ # Return clean dict — never propagate BaseException to FastMCP.
582
+ _mc_log(f"tool {name} cancelled by client", "warn")
583
+ return {"cancelled": True, "tool": name}
583
584
  except Exception as e:
584
585
  if not skip:
585
586
  _auto_learn_error(name, e, list(kwargs.keys()))
@@ -818,15 +819,24 @@ def _on_exit() -> None:
818
819
 
819
820
 
820
821
  def _on_signal(signum, frame) -> None:
821
- """Signal handler for SIGTERM/SIGINT — clean shutdown."""
822
+ """Signal handler for SIGTERM/SIGINT — graceful shutdown.
823
+
824
+ CRITICAL: Do NOT call sys.exit() here. sys.exit() inside a signal handler
825
+ can corrupt the asyncio event loop (raises SystemExit mid-await), which
826
+ crashes FastMCP's stdio transport. Instead, just log + release lease and
827
+ let the normal shutdown path handle process exit.
828
+ """
822
829
  sig_name = signal.Signals(signum).name if hasattr(signal, 'Signals') else str(signum)
830
+ _mc_log(f"Received {sig_name} — releasing lease", "warn")
823
831
  _log_crash_to_db("signal", f"Received {sig_name}")
824
832
  _release_lease()
825
- sys.exit(128 + signum)
833
+ # Do NOT sys.exit() let FastMCP's event loop shut down cleanly.
834
+ # The process will exit naturally when the event loop finishes.
826
835
 
827
836
 
828
837
  atexit.register(_on_exit)
829
838
  signal.signal(signal.SIGTERM, _on_signal)
839
+ signal.signal(signal.SIGINT, _on_signal)
830
840
 
831
841
 
832
842
  # ============================================================
@@ -1621,6 +1631,13 @@ async def meshcode_wait(timeout_seconds: int = 120, include_acks: bool = False)
1621
1631
  except Exception:
1622
1632
  pass
1623
1633
  return result
1634
+ except (asyncio.CancelledError, KeyboardInterrupt, SystemExit):
1635
+ # User pressed ESC or Claude Code cancelled the tool call.
1636
+ # Return a clean dict instead of propagating — this prevents
1637
+ # FastMCP/anyio event loop corruption and keeps the MCP server alive.
1638
+ _mc_log("meshcode_wait cancelled by client (ESC) — returning cleanly", "warn")
1639
+ _set_state("online", "interrupted")
1640
+ return {"cancelled": True, "reason": "Tool call cancelled by user"}
1624
1641
  finally:
1625
1642
  _IN_WAIT = False
1626
1643
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.10.18
3
+ Version: 2.10.19
4
4
  Summary: Real-time communication between AI agents — Supabase-backed CLI
5
5
  Author-email: MeshCode <hello@meshcode.io>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meshcode"
7
- version = "2.10.18"
7
+ version = "2.10.19"
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