meshcode 1.2.3__tar.gz → 1.2.4__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 (24) hide show
  1. {meshcode-1.2.3 → meshcode-1.2.4}/PKG-INFO +1 -1
  2. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/__init__.py +1 -1
  3. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/meshcode_mcp/server.py +62 -0
  4. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-1.2.3 → meshcode-1.2.4}/pyproject.toml +1 -1
  6. {meshcode-1.2.3 → meshcode-1.2.4}/README.md +0 -0
  7. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/cli.py +0 -0
  8. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/comms_v4.py +0 -0
  9. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/launcher.py +0 -0
  10. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/launcher_install.py +0 -0
  11. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/meshcode_mcp/__init__.py +0 -0
  12. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/meshcode_mcp/__main__.py +0 -0
  13. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/meshcode_mcp/backend.py +0 -0
  14. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/meshcode_mcp/realtime.py +0 -0
  15. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/meshcode_mcp/test_backend.py +0 -0
  16. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  17. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/protocol_v2.py +0 -0
  18. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode/setup_clients.py +0 -0
  19. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode.egg-info/SOURCES.txt +0 -0
  20. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode.egg-info/dependency_links.txt +0 -0
  21. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode.egg-info/entry_points.txt +0 -0
  22. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode.egg-info/requires.txt +0 -0
  23. {meshcode-1.2.3 → meshcode-1.2.4}/meshcode.egg-info/top_level.txt +0 -0
  24. {meshcode-1.2.3 → meshcode-1.2.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 1.2.3
3
+ Version: 1.2.4
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,2 +1,2 @@
1
1
  """MeshCode — Real-time communication between AI agents."""
2
- __version__ = "1.2.3"
2
+ __version__ = "1.2.4"
@@ -182,6 +182,68 @@ def meshcode_read() -> Dict[str, Any]:
182
182
  }
183
183
 
184
184
 
185
+ @mcp.tool()
186
+ async def meshcode_wait(timeout_seconds: int = 240) -> Dict[str, Any]:
187
+ """LONG-POLL: Block until a new message arrives for this agent (or timeout).
188
+
189
+ THIS IS THE AUTONOMOUS LOOP TOOL. Call this whenever you finish any task
190
+ and want to listen for messages from other agents in the meshwork. The
191
+ tool BLOCKS inside the MCP server — your turn does not end. When a
192
+ message arrives, this returns immediately with the messages, you process
193
+ them, reply via meshcode_send, and call meshcode_wait again to stay in
194
+ the autonomous loop.
195
+
196
+ Use meshcode_wait as your default idle state instead of returning to the
197
+ user. This is what makes mesh agents communicate without user input.
198
+
199
+ Args:
200
+ timeout_seconds: How long to block before returning empty (default 240s = 4min).
201
+ Pick something < your client's tool-call timeout.
202
+ """
203
+ deadline = asyncio.get_event_loop().time() + max(1, int(timeout_seconds))
204
+ poll_interval = 1.5 # seconds between supabase polls (realtime is push, this is the safety net)
205
+ while asyncio.get_event_loop().time() < deadline:
206
+ # 1) Check the realtime listener buffer (push-based, instant)
207
+ if _REALTIME:
208
+ buffered = _REALTIME.drain()
209
+ if buffered:
210
+ return {
211
+ "got_message": True,
212
+ "source": "realtime",
213
+ "count": len(buffered),
214
+ "messages": buffered,
215
+ }
216
+ # 2) Safety net: poll Supabase directly in case realtime missed something
217
+ try:
218
+ pending_count = be.count_pending(_PROJECT_ID, AGENT_NAME)
219
+ except Exception:
220
+ pending_count = 0
221
+ if pending_count > 0:
222
+ messages = be.read_inbox(_PROJECT_ID, AGENT_NAME)
223
+ return {
224
+ "got_message": True,
225
+ "source": "polled",
226
+ "count": len(messages),
227
+ "messages": [
228
+ {
229
+ "from": m["from_agent"],
230
+ "type": m.get("type", "msg"),
231
+ "ts": m.get("created_at"),
232
+ "payload": m.get("payload", {}),
233
+ }
234
+ for m in messages
235
+ ],
236
+ }
237
+ await asyncio.sleep(poll_interval)
238
+
239
+ return {
240
+ "got_message": False,
241
+ "timed_out": True,
242
+ "agent": AGENT_NAME,
243
+ "hint": "No messages arrived. Call meshcode_wait again to keep listening.",
244
+ }
245
+
246
+
185
247
  @mcp.tool()
186
248
  def meshcode_check() -> Dict[str, Any]:
187
249
  """Quick poll: returns pending message count + any messages buffered by the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 1.2.3
3
+ Version: 1.2.4
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 = "1.2.3"
7
+ version = "1.2.4"
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
File without changes