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.
- {meshcode-2.10.18 → meshcode-2.10.19}/PKG-INFO +1 -1
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/__init__.py +1 -1
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/server.py +22 -5
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.10.18 → meshcode-2.10.19}/pyproject.toml +1 -1
- {meshcode-2.10.18 → meshcode-2.10.19}/README.md +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/ascii_art.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/cli.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/comms_v4.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/invites.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/launcher.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/launcher_install.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/preferences.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/run_agent.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/secrets.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/self_update.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode/setup_clients.py +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/setup.cfg +0 -0
- {meshcode-2.10.18 → meshcode-2.10.19}/tests/test_status_enum_coverage.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""MeshCode — Real-time communication between AI agents."""
|
|
2
|
-
__version__ = "2.10.
|
|
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
|
-
#
|
|
582
|
-
|
|
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 —
|
|
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(
|
|
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
|
|
|
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
|