meshcode 2.0.9__tar.gz → 2.1.0__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.0.9 → meshcode-2.1.0}/PKG-INFO +1 -1
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/__init__.py +1 -1
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/server.py +35 -9
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.0.9 → meshcode-2.1.0}/pyproject.toml +1 -1
- {meshcode-2.0.9 → meshcode-2.1.0}/README.md +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/cli.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/comms_v4.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/invites.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/launcher.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/launcher_install.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/preferences.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/run_agent.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/secrets.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/self_update.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/setup_clients.py +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.0.9 → meshcode-2.1.0}/setup.cfg +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""MeshCode — Real-time communication between AI agents."""
|
|
2
|
-
__version__ = "2.0
|
|
2
|
+
__version__ = "2.1.0"
|
|
@@ -406,12 +406,10 @@ def with_working_status(func):
|
|
|
406
406
|
return await func(*args, **kwargs)
|
|
407
407
|
finally:
|
|
408
408
|
if not skip:
|
|
409
|
-
global _last_tool_at
|
|
409
|
+
global _last_tool_at
|
|
410
410
|
_last_tool_at = _time.time()
|
|
411
|
-
#
|
|
412
|
-
|
|
413
|
-
_working_timer.daemon = True
|
|
414
|
-
_working_timer.start()
|
|
411
|
+
# Don't flip to online here — CPU-based detection in heartbeat
|
|
412
|
+
# will handle the transition when LLM stops generating
|
|
415
413
|
return awrapper
|
|
416
414
|
else:
|
|
417
415
|
@_functools.wraps(func)
|
|
@@ -688,6 +686,24 @@ async def _on_new_message(msg: Dict[str, Any]) -> None:
|
|
|
688
686
|
_heartbeat_stop = _threading.Event()
|
|
689
687
|
|
|
690
688
|
|
|
689
|
+
def _get_parent_cpu() -> float:
|
|
690
|
+
"""Check parent process CPU usage to detect if LLM is actively generating."""
|
|
691
|
+
try:
|
|
692
|
+
import subprocess as _sp, platform as _pl
|
|
693
|
+
ppid = os.getppid()
|
|
694
|
+
if _pl.system() == "Windows":
|
|
695
|
+
r = _sp.run(["wmic", "process", "where", f"processid={ppid}", "get", "percentprocessortime"],
|
|
696
|
+
capture_output=True, text=True, timeout=5)
|
|
697
|
+
lines = [l.strip() for l in r.stdout.strip().split("\n") if l.strip()]
|
|
698
|
+
return float(lines[-1]) if len(lines) > 1 else 0.0
|
|
699
|
+
else:
|
|
700
|
+
r = _sp.run(["ps", "-p", str(ppid), "-o", "%cpu"], capture_output=True, text=True, timeout=5)
|
|
701
|
+
lines = [l.strip() for l in r.stdout.strip().split("\n") if l.strip()]
|
|
702
|
+
return float(lines[-1]) if len(lines) > 1 else 0.0
|
|
703
|
+
except Exception:
|
|
704
|
+
return 0.0
|
|
705
|
+
|
|
706
|
+
|
|
691
707
|
def _heartbeat_thread_fn():
|
|
692
708
|
"""Heartbeat in a DAEMON THREAD — independent of asyncio event loop.
|
|
693
709
|
|
|
@@ -699,10 +715,20 @@ def _heartbeat_thread_fn():
|
|
|
699
715
|
while not _heartbeat_stop.is_set():
|
|
700
716
|
try:
|
|
701
717
|
be.sb_rpc("mc_heartbeat", {"p_project_id": _PROJECT_ID, "p_agent_name": AGENT_NAME, "p_version": "2.0.0"})
|
|
702
|
-
|
|
703
|
-
#
|
|
704
|
-
if _current_state
|
|
705
|
-
|
|
718
|
+
|
|
719
|
+
# CPU-based status detection: check parent process (editor/LLM) CPU usage
|
|
720
|
+
if _current_state not in ("waiting",): # Don't override explicit WAITING
|
|
721
|
+
parent_cpu = _get_parent_cpu()
|
|
722
|
+
if parent_cpu > 5.0:
|
|
723
|
+
# LLM is actively generating tokens
|
|
724
|
+
if _current_state != "working":
|
|
725
|
+
_set_state("working", "generating response")
|
|
726
|
+
elif _current_state == "working" and parent_cpu <= 5.0:
|
|
727
|
+
# LLM just finished — flip to online
|
|
728
|
+
_set_state("online", "")
|
|
729
|
+
elif _current_state == "online" and (_time.time() - _last_tool_at) > _IDLE_THRESHOLD_S:
|
|
730
|
+
_set_state("idle", f"idle ({int((_time.time() - _last_tool_at) / 60)}m)")
|
|
731
|
+
|
|
706
732
|
# Sync current state to DB (in case realtime missed it)
|
|
707
733
|
try:
|
|
708
734
|
be.set_status(_PROJECT_ID, AGENT_NAME, _current_state, _current_tool)
|
|
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
|