meshcode 2.11.147__tar.gz → 2.11.148__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 (107) hide show
  1. {meshcode-2.11.147 → meshcode-2.11.148}/PKG-INFO +1 -1
  2. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/__init__.py +1 -1
  3. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/server.py +30 -3
  4. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.11.147 → meshcode-2.11.148}/pyproject.toml +1 -1
  6. {meshcode-2.11.147 → meshcode-2.11.148}/README.md +0 -0
  7. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/__main__.py +0 -0
  8. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/_session_handoff_template.py +0 -0
  9. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/_stop_hook_template.py +0 -0
  10. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/ascii_art.py +0 -0
  11. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/atomic_push.py +0 -0
  12. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/claude_update.py +0 -0
  13. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/cli.py +0 -0
  14. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/comms_v4.py +0 -0
  15. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/compat.py +0 -0
  16. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/daemon.py +0 -0
  17. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/date_parse.py +0 -0
  18. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/doctor.py +0 -0
  19. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/error_hints.py +0 -0
  20. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/exceptions.py +0 -0
  21. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/helper_visuals.py +0 -0
  22. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/hooks/__init__.py +0 -0
  23. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/hooks/repo_path_lock.py +0 -0
  24. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/hostd.py +0 -0
  25. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/invites.py +0 -0
  26. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/launcher.py +0 -0
  27. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/launcher_install.py +0 -0
  28. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/__init__.py +0 -0
  29. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/__main__.py +0 -0
  30. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/backend.py +0 -0
  31. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/realtime.py +0 -0
  32. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/sleep_signals.py +0 -0
  33. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/swarm.py +0 -0
  34. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/test_backend.py +0 -0
  35. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/test_boot_timing.py +0 -0
  36. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/test_install_guard.py +0 -0
  37. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/test_prefs_claude_version.py +0 -0
  38. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  39. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  40. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/meshcode_mcp/test_swarm.py +0 -0
  41. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/preferences.py +0 -0
  42. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/protocol_handler.py +0 -0
  43. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/protocol_v2.py +0 -0
  44. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/quickstart.py +0 -0
  45. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/rpc_allowlist.py +0 -0
  46. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/run_agent.py +0 -0
  47. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/scripts/check_secrets.py +0 -0
  48. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/scripts/race_rate_harness.py +0 -0
  49. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/secrets.py +0 -0
  50. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/self_update.py +0 -0
  51. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/setup_clients.py +0 -0
  52. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/supervisor.py +0 -0
  53. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/up.py +0 -0
  54. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode/upload.py +0 -0
  55. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode.egg-info/SOURCES.txt +0 -0
  56. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode.egg-info/dependency_links.txt +0 -0
  57. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode.egg-info/entry_points.txt +0 -0
  58. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode.egg-info/requires.txt +0 -0
  59. {meshcode-2.11.147 → meshcode-2.11.148}/meshcode.egg-info/top_level.txt +0 -0
  60. {meshcode-2.11.147 → meshcode-2.11.148}/setup.cfg +0 -0
  61. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_auto_update_hardening.py +0 -0
  62. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_autonomous_closegap_1.py +0 -0
  63. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_autonomous_closegap_2.py +0 -0
  64. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_autonomous_closegap_3.py +0 -0
  65. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_autonomous_prompt_inject.py +0 -0
  66. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_boot_bug_regression.py +0 -0
  67. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_color_truecolor.py +0 -0
  68. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_core.py +0 -0
  69. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_cross_agent_messaging.py +0 -0
  70. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_date_parse.py +0 -0
  71. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_doctor.py +0 -0
  72. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_epistemic_v1_python_sdk.py +0 -0
  73. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_epistemic_v1_stop_conditions.py +0 -0
  74. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_esc_deaf_state.py +0 -0
  75. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_exceptions.py +0 -0
  76. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_file_upload.py +0 -0
  77. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_helper_visuals.py +0 -0
  78. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_hostd_launch_pinned_env.py +0 -0
  79. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_hostd_serve_discovery_split.py +0 -0
  80. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_hostd_zombie_sessions.py +0 -0
  81. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_init_device_code.py +0 -0
  82. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_install_guard.py +0 -0
  83. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_lease_sigterm_release.py +0 -0
  84. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_live_mesh_guard.py +0 -0
  85. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_mark_read_batch.py +0 -0
  86. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_marketplace_ratings.py +0 -0
  87. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_migration_integrity.py +0 -0
  88. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_pretrust_claude.py +0 -0
  89. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_realtime_event_freshness.py +0 -0
  90. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_rls_cross_tenant.py +0 -0
  91. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_rpc_grants.py +0 -0
  92. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_rpc_migrations.py +0 -0
  93. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_run_agent_dry_run.py +0 -0
  94. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_run_agent_no_server_import.py +0 -0
  95. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_security_regressions.py +0 -0
  96. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_self_update_user_site.py +0 -0
  97. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_sentinel.py +0 -0
  98. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_session_replay_gate.py +0 -0
  99. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_setup_path.py +0 -0
  100. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_sleep_signals.py +0 -0
  101. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_status_enum_coverage.py +0 -0
  102. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_stay_on_loop_hook.py +0 -0
  103. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_stop_ghost_terminal.py +0 -0
  104. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_swarm_events.py +0 -0
  105. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_task_progress.py +0 -0
  106. {meshcode-2.11.147 → meshcode-2.11.148}/tests/test_terminal_lifecycle.py +0 -0
  107. {meshcode-2.11.147 → meshcode-2.11.148}/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.147
3
+ Version: 2.11.148
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.147"
2
+ __version__ = "2.11.148"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -969,6 +969,15 @@ _current_tool = ""
969
969
  _IDLE_THRESHOLD_S = 120 # seconds without tool call → IDLE
970
970
  _SLEEPING_THRESHOLD_S = 300 # seconds in waiting without activity → SLEEPING
971
971
  _WORKING_COOLDOWN_S = 60 # seconds after last tool returns before flipping to ONLINE
972
+
973
+ # ── P1 heartbeat throttle (2.11.148) ──
974
+ # When status+task haven't changed, skip the full mc_agents UPDATE and
975
+ # write only a cheap mc_heartbeats ping. Idle agents go from ~every 5s
976
+ # full-row writes to ~every 15s, staying under the 20s-live / 90s-offline
977
+ # thresholds while cutting Realtime fan-out ~3×.
978
+ _HB_THROTTLE_S = 15.0
979
+ _hb_last_state: "tuple[str, str] | None" = None
980
+ _hb_last_full_write: float = 0.0
972
981
  _working_timer: Optional[_threading.Timer] = None
973
982
 
974
983
 
@@ -2564,8 +2573,18 @@ def _heartbeat_loop_inner():
2564
2573
  # no longer wired to a status write.
2565
2574
 
2566
2575
  # Sync current state to DB (in case realtime missed it)
2576
+ # P1 throttle (2.11.148): skip full mc_agents UPDATE when state
2577
+ # hasn't changed recently — write cheap mc_heartbeats only.
2578
+ global _hb_last_state, _hb_last_full_write
2579
+ _hb_cur = (_current_state, _current_tool)
2580
+ _hb_now = _time.monotonic()
2567
2581
  try:
2568
- be.set_status(_PROJECT_ID, AGENT_NAME, _current_state, _current_tool, api_key=_get_api_key())
2582
+ if _hb_cur == _hb_last_state and (_hb_now - _hb_last_full_write) < _HB_THROTTLE_S:
2583
+ be.heartbeat(_PROJECT_ID, AGENT_NAME)
2584
+ else:
2585
+ be.set_status(_PROJECT_ID, AGENT_NAME, _current_state, _current_tool, api_key=_get_api_key())
2586
+ _hb_last_state = _hb_cur
2587
+ _hb_last_full_write = _hb_now
2569
2588
  except Exception as e:
2570
2589
  log.warning(f"status sync failed (agent may show stale status): {e}")
2571
2590
  # Realtime subscription recovery: if the WebSocket is connected but
@@ -6458,11 +6477,19 @@ def meshcode_boot() -> Dict[str, Any]:
6458
6477
  _overdue.append(_t)
6459
6478
  else:
6460
6479
  _due_today.append(_t)
6480
+ def _compact_due(_t):
6481
+ return {
6482
+ "id": str(_t.get("id", ""))[:8],
6483
+ "title": str(_t.get("title", ""))[:80],
6484
+ "due_at": _t.get("due_at"),
6485
+ "priority": _t.get("priority"),
6486
+ }
6487
+ _due_all = _due_today + _overdue
6461
6488
  calendar_block = {
6462
6489
  "pending_due_today": len(_due_today),
6463
6490
  "overdue": len(_overdue),
6464
- "next_due": (_due_today[0] if _due_today else (_overdue[0] if _overdue else None)),
6465
- "due_tasks": _due_today + _overdue,
6491
+ "next_due": (_compact_due(_due_all[0]) if _due_all else None),
6492
+ "due_tasks": [_compact_due(_t) for _t in _due_all],
6466
6493
  }
6467
6494
  resp["calendar_context"] = calendar_block
6468
6495
  except Exception:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.11.147
3
+ Version: 2.11.148
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.11.147"
7
+ version = "2.11.148"
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