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.
- {meshcode-2.10.76 → meshcode-2.10.77}/PKG-INFO +1 -1
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/__init__.py +1 -1
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/backend.py +21 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.10.76 → meshcode-2.10.77}/pyproject.toml +1 -1
- {meshcode-2.10.76 → meshcode-2.10.77}/README.md +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/ascii_art.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/cli.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/comms_v4.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/compat.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/error_hints.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/exceptions.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/invites.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/launcher.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/launcher_install.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/preferences.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/quickstart.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/run_agent.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/secrets.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/self_update.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/setup_clients.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/supervisor.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode/upload.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/setup.cfg +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_core.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_exceptions.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_security_regressions.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_sentinel.py +0 -0
- {meshcode-2.10.76 → meshcode-2.10.77}/tests/test_status_enum_coverage.py +0 -0
|
@@ -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,
|
|
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
|
|
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
|