meshcode 2.6.9__tar.gz → 2.7.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.
- {meshcode-2.6.9 → meshcode-2.7.0}/PKG-INFO +1 -1
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/__init__.py +1 -1
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/meshcode_mcp/backend.py +8 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/meshcode_mcp/realtime.py +17 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/meshcode_mcp/server.py +1 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.6.9 → meshcode-2.7.0}/pyproject.toml +1 -1
- {meshcode-2.6.9 → meshcode-2.7.0}/README.md +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/cli.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/comms_v4.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/invites.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/launcher.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/launcher_install.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/preferences.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/run_agent.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/secrets.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/self_update.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode/setup_clients.py +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/setup.cfg +0 -0
- {meshcode-2.6.9 → meshcode-2.7.0}/tests/test_status_enum_coverage.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""MeshCode — Real-time communication between AI agents."""
|
|
2
|
-
__version__ = "2.
|
|
2
|
+
__version__ = "2.7.0"
|
|
@@ -36,6 +36,14 @@ def _load_env_file() -> Dict[str, str]:
|
|
|
36
36
|
_env_file = _load_env_file()
|
|
37
37
|
SUPABASE_URL = os.environ.get("SUPABASE_URL") or _env_file.get("SUPABASE_URL") or _DEFAULT_SUPABASE_URL
|
|
38
38
|
SUPABASE_KEY = os.environ.get("SUPABASE_KEY") or _env_file.get("SUPABASE_KEY") or _DEFAULT_SUPABASE_KEY
|
|
39
|
+
SUPABASE_SERVICE_ROLE_KEY = (
|
|
40
|
+
os.environ.get("SUPABASE_SERVICE_ROLE_KEY")
|
|
41
|
+
or os.environ.get("SUPABASE_SECRET_KEY")
|
|
42
|
+
or _env_file.get("SUPABASE_SERVICE_ROLE_KEY")
|
|
43
|
+
or _env_file.get("SUPABASE_SECRET_KEY")
|
|
44
|
+
or _env_file.get("NEW_SUPABASE_SECRET")
|
|
45
|
+
or ""
|
|
46
|
+
)
|
|
39
47
|
SCHEMA = "meshcode"
|
|
40
48
|
|
|
41
49
|
|
|
@@ -44,12 +44,14 @@ class RealtimeListener:
|
|
|
44
44
|
project_id: str,
|
|
45
45
|
agent_name: str,
|
|
46
46
|
notify_callback: Optional[Callable[[Dict], Awaitable[None]]] = None,
|
|
47
|
+
service_role_key: Optional[str] = None,
|
|
47
48
|
):
|
|
48
49
|
self.supabase_url = supabase_url
|
|
49
50
|
self.supabase_key = supabase_key
|
|
50
51
|
self.project_id = project_id
|
|
51
52
|
self.agent_name = agent_name
|
|
52
53
|
self.notify_callback = notify_callback
|
|
54
|
+
self.service_role_key = service_role_key
|
|
53
55
|
|
|
54
56
|
# Last 100 unread messages — drained by meshcode_check tool
|
|
55
57
|
self.queue: Deque[Dict] = deque(maxlen=100)
|
|
@@ -127,6 +129,21 @@ class RealtimeListener:
|
|
|
127
129
|
self._connected = True
|
|
128
130
|
log.info(f"Realtime connected for agent={self.agent_name}")
|
|
129
131
|
|
|
132
|
+
# Elevate auth context if service_role_key is available.
|
|
133
|
+
# This lets Supabase Realtime bypass RLS for INSERT event delivery,
|
|
134
|
+
# so mc_user_has_project_access (which needs auth.uid()) is not required.
|
|
135
|
+
if self.service_role_key:
|
|
136
|
+
try:
|
|
137
|
+
await ws.send(json.dumps({
|
|
138
|
+
"topic": "realtime:*",
|
|
139
|
+
"event": "access_token",
|
|
140
|
+
"payload": {"access_token": self.service_role_key},
|
|
141
|
+
"ref": "auth",
|
|
142
|
+
}))
|
|
143
|
+
log.info("Realtime auth elevated with service_role_key")
|
|
144
|
+
except Exception as e:
|
|
145
|
+
log.warning(f"Failed to send access_token: {e}")
|
|
146
|
+
|
|
130
147
|
# Phoenix channel join: phoenix realtime topic
|
|
131
148
|
topic = f"realtime:{self.project_id}-{self.agent_name}"
|
|
132
149
|
join_msg = {
|
|
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
|