meshcode 2.10.75__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.75 → meshcode-2.10.77}/PKG-INFO +1 -1
  2. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/__init__.py +1 -1
  3. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/meshcode_mcp/backend.py +21 -0
  4. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/meshcode_mcp/server.py +14 -1
  5. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode.egg-info/PKG-INFO +1 -1
  6. {meshcode-2.10.75 → meshcode-2.10.77}/pyproject.toml +1 -1
  7. {meshcode-2.10.75 → meshcode-2.10.77}/README.md +0 -0
  8. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/ascii_art.py +0 -0
  9. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/cli.py +0 -0
  10. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/comms_v4.py +0 -0
  11. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/compat.py +0 -0
  12. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/error_hints.py +0 -0
  13. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/exceptions.py +0 -0
  14. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/invites.py +0 -0
  15. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/launcher.py +0 -0
  16. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/launcher_install.py +0 -0
  17. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/meshcode_mcp/__init__.py +0 -0
  18. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/meshcode_mcp/__main__.py +0 -0
  19. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/meshcode_mcp/realtime.py +0 -0
  20. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_backend.py +0 -0
  21. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  22. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  23. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/preferences.py +0 -0
  24. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/protocol_v2.py +0 -0
  25. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/quickstart.py +0 -0
  26. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/run_agent.py +0 -0
  27. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/secrets.py +0 -0
  28. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/self_update.py +0 -0
  29. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/setup_clients.py +0 -0
  30. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/supervisor.py +0 -0
  31. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode/upload.py +0 -0
  32. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode.egg-info/SOURCES.txt +0 -0
  33. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode.egg-info/dependency_links.txt +0 -0
  34. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode.egg-info/entry_points.txt +0 -0
  35. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode.egg-info/requires.txt +0 -0
  36. {meshcode-2.10.75 → meshcode-2.10.77}/meshcode.egg-info/top_level.txt +0 -0
  37. {meshcode-2.10.75 → meshcode-2.10.77}/setup.cfg +0 -0
  38. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_core.py +0 -0
  39. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_cross_agent_messaging.py +0 -0
  40. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_esc_deaf_state.py +0 -0
  41. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_exceptions.py +0 -0
  42. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_mark_read_batch.py +0 -0
  43. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_migration_integrity.py +0 -0
  44. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_realtime_event_freshness.py +0 -0
  45. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_rls_cross_tenant.py +0 -0
  46. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_rpc_migrations.py +0 -0
  47. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_security_regressions.py +0 -0
  48. {meshcode-2.10.75 → meshcode-2.10.77}/tests/test_sentinel.py +0 -0
  49. {meshcode-2.10.75 → 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.75
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.75"
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,
@@ -1062,9 +1062,22 @@ def _build_instructions() -> str:
1062
1062
  f"\nUSER-PROVIDED ROLE PROMPT (from the dashboard):\n---\n{_LAUNCH_PROMPT}\n---\n"
1063
1063
  if _LAUNCH_PROMPT else ""
1064
1064
  )
1065
+ # Pull the canonical loop directive from the DB so product can tune it
1066
+ # without a client release. Falls back to the baked-in version below if
1067
+ # the RPC isn't available (older DB) or the call fails.
1068
+ _db_loop = ""
1069
+ try:
1070
+ _r = be.sb_rpc("mc_get_loop_directive", {})
1071
+ if isinstance(_r, list) and _r:
1072
+ _r = _r[0]
1073
+ if isinstance(_r, str) and _r.strip():
1074
+ _db_loop = _r.strip() + "\n\n"
1075
+ except Exception:
1076
+ pass
1077
+
1065
1078
  base = f"""You are agent "{AGENT_NAME}" in meshwork "{PROJECT_NAME}".{role_block}{launch_block}
1066
1079
 
1067
- PERMANENT LOOP (MANDATORY — #1 RULE):
1080
+ {_db_loop}PERMANENT LOOP (MANDATORY — #1 RULE):
1068
1081
  You MUST stay in meshcode_wait() forever. After EVERY action, call meshcode_wait().
1069
1082
  NEVER exit. NEVER stop. NEVER say "standing by" without calling meshcode_wait().
1070
1083
  The ONLY exits: user says "stop", got_done signal, or fatal error.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.10.75
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.75"
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