meshcode 2.10.76__tar.gz → 2.10.77__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 (49) hide show
  1. {meshcode-2.10.76 → meshcode-2.10.77}/PKG-INFO +1 -1
  2. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/__init__.py +1 -1
  3. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/backend.py +21 -0
  4. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.10.76 → meshcode-2.10.77}/pyproject.toml +1 -1
  6. {meshcode-2.10.76 → meshcode-2.10.77}/README.md +0 -0
  7. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/ascii_art.py +0 -0
  8. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/cli.py +0 -0
  9. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/comms_v4.py +0 -0
  10. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/compat.py +0 -0
  11. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/error_hints.py +0 -0
  12. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/exceptions.py +0 -0
  13. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/invites.py +0 -0
  14. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/launcher.py +0 -0
  15. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/launcher_install.py +0 -0
  16. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/__init__.py +0 -0
  17. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/__main__.py +0 -0
  18. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/realtime.py +0 -0
  19. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/server.py +0 -0
  20. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_backend.py +0 -0
  21. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  22. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  23. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/preferences.py +0 -0
  24. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/protocol_v2.py +0 -0
  25. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/quickstart.py +0 -0
  26. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/run_agent.py +0 -0
  27. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/secrets.py +0 -0
  28. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/self_update.py +0 -0
  29. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/setup_clients.py +0 -0
  30. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/supervisor.py +0 -0
  31. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/upload.py +0 -0
  32. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/SOURCES.txt +0 -0
  33. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/dependency_links.txt +0 -0
  34. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/entry_points.txt +0 -0
  35. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/requires.txt +0 -0
  36. {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/top_level.txt +0 -0
  37. {meshcode-2.10.76 → meshcode-2.10.77}/setup.cfg +0 -0
  38. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_core.py +0 -0
  39. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_cross_agent_messaging.py +0 -0
  40. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_esc_deaf_state.py +0 -0
  41. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_exceptions.py +0 -0
  42. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_mark_read_batch.py +0 -0
  43. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_migration_integrity.py +0 -0
  44. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_realtime_event_freshness.py +0 -0
  45. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_rls_cross_tenant.py +0 -0
  46. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_rpc_migrations.py +0 -0
  47. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_security_regressions.py +0 -0
  48. {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_sentinel.py +0 -0
  49. {meshcode-2.10.76 → meshcode-2.10.77}/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.76
3
+ Version: 2.10.77
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.10.76"
2
+ __version__ = "2.10.77"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -1148,8 +1148,29 @@ def task_complete(api_key, project_id, task_id, completing_agent, summary=""):
1148
1148
  })
1149
1149
 
1150
1150
 
1151
+ # Per-(project,agent,session,event_type) min interval. Same idea as task_list:
1152
+ # fire-and-forget pollers that hammer record_event at >2/sec are throttled
1153
+ # client-side. Identical events within the window are dropped (returns
1154
+ # {"ok": true, "throttled": true}). pg_stat_statements showed mc_record_event
1155
+ # at ~9M calls in 6 hours — same shape as the task_list runaway.
1156
+ _RECORD_EVENT_LAST: Dict[tuple, float] = {}
1157
+ _RECORD_EVENT_LOCK = _threading.Lock()
1158
+ _RECORD_EVENT_MIN_INTERVAL = 0.5
1159
+ _RECORD_EVENT_CACHE_MAX = 256
1160
+
1161
+
1151
1162
  def record_event(api_key, project_id, agent_name, session_id, event_type, payload=None):
1152
1163
  """Fire-and-forget event recording for session replay."""
1164
+ cache_key = (project_id, agent_name, session_id, event_type)
1165
+ now = _time.time()
1166
+ with _RECORD_EVENT_LOCK:
1167
+ last = _RECORD_EVENT_LAST.get(cache_key)
1168
+ if last is not None and (now - last) < _RECORD_EVENT_MIN_INTERVAL:
1169
+ return {"ok": True, "throttled": True, "next_in_seconds": _RECORD_EVENT_MIN_INTERVAL - (now - last)}
1170
+ if len(_RECORD_EVENT_LAST) >= _RECORD_EVENT_CACHE_MAX:
1171
+ oldest_key = min(_RECORD_EVENT_LAST, key=_RECORD_EVENT_LAST.get)
1172
+ _RECORD_EVENT_LAST.pop(oldest_key, None)
1173
+ _RECORD_EVENT_LAST[cache_key] = now
1153
1174
  return sb_rpc("mc_record_event", {
1154
1175
  "p_api_key": api_key,
1155
1176
  "p_project_id": project_id,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.10.76
3
+ Version: 2.10.77
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.76"
7
+ version = "2.10.77"
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