meshcode 2.6.4__tar.gz → 2.6.5__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.4 → meshcode-2.6.5}/PKG-INFO +1 -1
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/__init__.py +1 -1
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/meshcode_mcp/server.py +35 -5
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.6.4 → meshcode-2.6.5}/pyproject.toml +1 -1
- {meshcode-2.6.4 → meshcode-2.6.5}/README.md +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/cli.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/comms_v4.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/invites.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/launcher.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/launcher_install.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/preferences.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/run_agent.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/secrets.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/self_update.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode/setup_clients.py +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/setup.cfg +0 -0
- {meshcode-2.6.4 → meshcode-2.6.5}/tests/test_status_enum_coverage.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""MeshCode — Real-time communication between AI agents."""
|
|
2
|
-
__version__ = "2.6.
|
|
2
|
+
__version__ = "2.6.5"
|
|
@@ -746,7 +746,7 @@ RULES:
|
|
|
746
746
|
|
|
747
747
|
SESSION START (do these IMMEDIATELY — don't wait for user input):
|
|
748
748
|
1. meshcode_set_status(status="online", task="ready")
|
|
749
|
-
2. meshcode_check() — read
|
|
749
|
+
2. meshcode_check() — read NEW messages only (last_seen is auto-restored from mesh memory on boot, old messages are skipped automatically)
|
|
750
750
|
3. meshcode_tasks() — check for assigned/pending tasks and claim any unclaimed ones
|
|
751
751
|
4. meshcode_auto_wake() — scan meshwork health, create tasks for issues found
|
|
752
752
|
5. meshcode_status() — see who's online
|
|
@@ -1124,8 +1124,8 @@ except Exception:
|
|
|
1124
1124
|
@mcp.tool()
|
|
1125
1125
|
@with_working_status
|
|
1126
1126
|
def meshcode_send(to: str, message: Any, in_reply_to: Optional[str] = None,
|
|
1127
|
-
sensitive: bool = False, encrypted: bool =
|
|
1128
|
-
"""Send message. Use "agent@meshwork" for cross-mesh. sensitive=True hides from exports.
|
|
1127
|
+
sensitive: bool = False, encrypted: bool = False) -> Dict[str, Any]:
|
|
1128
|
+
"""Send message. Use "agent@meshwork" for cross-mesh. sensitive=True hides from exports. Pass encrypted=True for secrets/credentials (AES-256-GCM)."""
|
|
1129
1129
|
if isinstance(message, str):
|
|
1130
1130
|
# Auto-wrap strings but warn if too long — prefer structured JSON
|
|
1131
1131
|
if len(message) > 400:
|
|
@@ -1291,6 +1291,25 @@ _CONSECUTIVE_IDLE_SECONDS = 0
|
|
|
1291
1291
|
_AUTO_SLEEP_THRESHOLD = int(os.environ.get("MESHCODE_AUTO_SLEEP_SECONDS", "600")) # default 10min
|
|
1292
1292
|
_LAST_SEEN_TS: Optional[str] = None # auto-persisted for message dedup
|
|
1293
1293
|
|
|
1294
|
+
# Hydrate _LAST_SEEN_TS from mesh memory on boot so restarts skip old messages
|
|
1295
|
+
try:
|
|
1296
|
+
_ls_result = be.sb_rpc("mc_memory_get", {
|
|
1297
|
+
"p_api_key": _get_api_key(),
|
|
1298
|
+
"p_agent_name": AGENT_NAME,
|
|
1299
|
+
"p_key": "last_seen",
|
|
1300
|
+
"p_project_name": PROJECT_NAME,
|
|
1301
|
+
})
|
|
1302
|
+
if isinstance(_ls_result, dict) and _ls_result.get("ok"):
|
|
1303
|
+
_ls_val = _ls_result.get("value")
|
|
1304
|
+
if isinstance(_ls_val, dict) and _ls_val.get("_raw"):
|
|
1305
|
+
_LAST_SEEN_TS = str(_ls_val["_raw"])
|
|
1306
|
+
elif isinstance(_ls_val, str):
|
|
1307
|
+
_LAST_SEEN_TS = _ls_val
|
|
1308
|
+
if _LAST_SEEN_TS:
|
|
1309
|
+
print(f"[meshcode] Restored last_seen={_LAST_SEEN_TS} from mesh memory.", file=sys.stderr)
|
|
1310
|
+
except Exception as _e:
|
|
1311
|
+
print(f"[meshcode] Could not restore last_seen: {_e}", file=sys.stderr)
|
|
1312
|
+
|
|
1294
1313
|
|
|
1295
1314
|
def _get_pending_tasks_summary() -> Optional[List[Dict[str, str]]]:
|
|
1296
1315
|
"""Fetch open/in_progress tasks assigned to this agent. Returns compact list or None."""
|
|
@@ -1306,7 +1325,7 @@ def _get_pending_tasks_summary() -> Optional[List[Dict[str, str]]]:
|
|
|
1306
1325
|
{"id": t["id"][:8], "title": t["title"][:80], "priority": t.get("priority", "normal"), "status": t["status"]}
|
|
1307
1326
|
for t in tasks
|
|
1308
1327
|
if t.get("status") in ("open", "in_progress")
|
|
1309
|
-
and (t.get("
|
|
1328
|
+
and (t.get("assignee") in (AGENT_NAME, "*", None) or t.get("claimed_by") == AGENT_NAME)
|
|
1310
1329
|
]
|
|
1311
1330
|
return pending if pending else None
|
|
1312
1331
|
except Exception:
|
|
@@ -1404,6 +1423,17 @@ async def meshcode_wait(timeout_seconds: int = 120, include_acks: bool = False)
|
|
|
1404
1423
|
latest_ts = max((m.get("ts", "") for m in msgs), default="")
|
|
1405
1424
|
if latest_ts:
|
|
1406
1425
|
_LAST_SEEN_TS = latest_ts
|
|
1426
|
+
# Persist to mesh memory so next session resumes here
|
|
1427
|
+
try:
|
|
1428
|
+
be.sb_rpc("mc_memory_set", {
|
|
1429
|
+
"p_api_key": _get_api_key(),
|
|
1430
|
+
"p_agent_name": AGENT_NAME,
|
|
1431
|
+
"p_key": "last_seen",
|
|
1432
|
+
"p_value": {"_raw": latest_ts},
|
|
1433
|
+
"p_project_name": PROJECT_NAME,
|
|
1434
|
+
})
|
|
1435
|
+
except Exception:
|
|
1436
|
+
pass # best-effort, never block wait loop
|
|
1407
1437
|
return result
|
|
1408
1438
|
finally:
|
|
1409
1439
|
_IN_WAIT = False
|
|
@@ -1805,7 +1835,7 @@ def meshcode_auto_wake() -> Dict[str, Any]:
|
|
|
1805
1835
|
task_result = be.task_list(api_key, _PROJECT_ID, AGENT_NAME, status_filter="open")
|
|
1806
1836
|
if isinstance(task_result, dict) and task_result.get("ok"):
|
|
1807
1837
|
open_tasks = task_result.get("tasks", [])
|
|
1808
|
-
unassigned = [t for t in open_tasks if not t.get("
|
|
1838
|
+
unassigned = [t for t in open_tasks if not t.get("assignee") or t.get("assignee") == "*"]
|
|
1809
1839
|
if len(unassigned) > 3:
|
|
1810
1840
|
suggestions.append({
|
|
1811
1841
|
"title": f"Task backlog: {len(unassigned)} unassigned open tasks",
|
|
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
|