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.
Files changed (29) hide show
  1. {meshcode-2.0.9 → meshcode-2.1.0}/PKG-INFO +1 -1
  2. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/__init__.py +1 -1
  3. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/server.py +35 -9
  4. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.0.9 → meshcode-2.1.0}/pyproject.toml +1 -1
  6. {meshcode-2.0.9 → meshcode-2.1.0}/README.md +0 -0
  7. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/cli.py +0 -0
  8. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/comms_v4.py +0 -0
  9. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/invites.py +0 -0
  10. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/launcher.py +0 -0
  11. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/launcher_install.py +0 -0
  12. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/__init__.py +0 -0
  13. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/__main__.py +0 -0
  14. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/backend.py +0 -0
  15. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/realtime.py +0 -0
  16. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/test_backend.py +0 -0
  17. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  18. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/preferences.py +0 -0
  19. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/protocol_v2.py +0 -0
  20. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/run_agent.py +0 -0
  21. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/secrets.py +0 -0
  22. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/self_update.py +0 -0
  23. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode/setup_clients.py +0 -0
  24. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/SOURCES.txt +0 -0
  25. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/dependency_links.txt +0 -0
  26. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/entry_points.txt +0 -0
  27. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/requires.txt +0 -0
  28. {meshcode-2.0.9 → meshcode-2.1.0}/meshcode.egg-info/top_level.txt +0 -0
  29. {meshcode-2.0.9 → meshcode-2.1.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.0.9
3
+ Version: 2.1.0
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.0.9"
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, _working_timer
409
+ global _last_tool_at
410
410
  _last_tool_at = _time.time()
411
- # Stay WORKING with 60s cooldowncovers LLM thinking between tools
412
- _working_timer = _threading.Timer(_WORKING_COOLDOWN_S, _working_to_online)
413
- _working_timer.daemon = True
414
- _working_timer.start()
411
+ # Don't flip to online hereCPU-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
- # Idle detection: only from online state (NOT waiting or working)
703
- # Agents in meshcode_wait should stay WAITING, not flip to IDLE
704
- if _current_state == "online" and (_time.time() - _last_tool_at) > _IDLE_THRESHOLD_S:
705
- _set_state("idle", f"idle ({int((_time.time() - _last_tool_at) / 60)}m)")
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.0.9
3
+ Version: 2.1.0
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.0.9"
7
+ version = "2.1.0"
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
File without changes
File without changes
File without changes
File without changes