meshcode 2.10.83__tar.gz → 2.10.84__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.83 → meshcode-2.10.84}/PKG-INFO +1 -1
  2. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/__init__.py +1 -1
  3. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/server.py +29 -14
  4. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/PKG-INFO +1 -1
  5. {meshcode-2.10.83 → meshcode-2.10.84}/pyproject.toml +1 -1
  6. {meshcode-2.10.83 → meshcode-2.10.84}/README.md +0 -0
  7. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/ascii_art.py +0 -0
  8. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/cli.py +0 -0
  9. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/comms_v4.py +0 -0
  10. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/compat.py +0 -0
  11. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/error_hints.py +0 -0
  12. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/exceptions.py +0 -0
  13. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/invites.py +0 -0
  14. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/launcher.py +0 -0
  15. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/launcher_install.py +0 -0
  16. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/__init__.py +0 -0
  17. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/__main__.py +0 -0
  18. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/backend.py +0 -0
  19. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/realtime.py +0 -0
  20. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/test_backend.py +0 -0
  21. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/test_realtime.py +0 -0
  22. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
  23. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/preferences.py +0 -0
  24. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/protocol_v2.py +0 -0
  25. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/quickstart.py +0 -0
  26. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/run_agent.py +0 -0
  27. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/secrets.py +0 -0
  28. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/self_update.py +0 -0
  29. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/setup_clients.py +0 -0
  30. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/supervisor.py +0 -0
  31. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/upload.py +0 -0
  32. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/SOURCES.txt +0 -0
  33. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/dependency_links.txt +0 -0
  34. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/entry_points.txt +0 -0
  35. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/requires.txt +0 -0
  36. {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/top_level.txt +0 -0
  37. {meshcode-2.10.83 → meshcode-2.10.84}/setup.cfg +0 -0
  38. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_core.py +0 -0
  39. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_cross_agent_messaging.py +0 -0
  40. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_esc_deaf_state.py +0 -0
  41. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_exceptions.py +0 -0
  42. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_mark_read_batch.py +0 -0
  43. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_migration_integrity.py +0 -0
  44. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_realtime_event_freshness.py +0 -0
  45. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_rls_cross_tenant.py +0 -0
  46. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_rpc_migrations.py +0 -0
  47. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_security_regressions.py +0 -0
  48. {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_sentinel.py +0 -0
  49. {meshcode-2.10.83 → meshcode-2.10.84}/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.83
3
+ Version: 2.10.84
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.83"
2
+ __version__ = "2.10.84"
3
3
 
4
4
  # Exception hierarchy — eagerly imported (lightweight, no deps)
5
5
  from meshcode.exceptions import ( # noqa: F401
@@ -2761,27 +2761,42 @@ def meshcode_init(project: str, agent: str, role: str = "") -> Dict[str, Any]:
2761
2761
 
2762
2762
  @mcp.tool()
2763
2763
  @with_working_status
2764
- def meshcode_task_create(title: str, description: str = "", assignee: str = "*",
2764
+ def meshcode_task_create(title: str, description: str = "", assignee: Optional[str] = None,
2765
2765
  priority: str = "normal", parent_task_id: Optional[str] = None) -> Dict[str, Any]:
2766
- """Create task. assignee="*" for any, priority: low/normal/high/urgent."""
2766
+ """Create task. assignee = explicit agent name OR 'auto' for round-robin
2767
+ onto the least-loaded live agent in this meshwork. priority: low/normal/high/urgent.
2768
+
2769
+ Per Samuel rule (mig 213): wildcard '*' / NULL / '' assignees are forbidden —
2770
+ every task must have a concrete owner or opt into 'auto' resolution.
2771
+ """
2767
2772
  if not title or not title.strip():
2768
2773
  return {"error": "title cannot be empty"}
2774
+ # Mirror the RPC validation client-side so the LLM gets a clear hint
2775
+ # before round-tripping. Do not silently coerce — the caller must choose.
2776
+ if assignee is None or not str(assignee).strip() or str(assignee).strip() == "*":
2777
+ return {
2778
+ "error": "assignee_required",
2779
+ "hint": "specify an explicit agent name OR pass assignee='auto' for round-robin",
2780
+ }
2769
2781
  api_key = _get_api_key()
2770
2782
  result = be.task_create(api_key, _PROJECT_ID, AGENT_NAME, title.strip(),
2771
2783
  description=description, assignee=assignee,
2772
2784
  priority=priority, parent_task_id=parent_task_id)
2773
- # Auto-notify assignee so they wake from meshcode_wait
2774
- if isinstance(result, dict) and result.get("ok") and assignee and assignee != "*" and assignee != AGENT_NAME:
2775
- try:
2776
- be.send_message(_PROJECT_ID, AGENT_NAME, assignee, {
2777
- "type": "task_assigned",
2778
- "task_id": result.get("task_id", ""),
2779
- "title": title,
2780
- "priority": priority,
2781
- "text": f"New {priority} task assigned to you: {title}",
2782
- }, msg_type="system", api_key=_get_api_key())
2783
- except Exception:
2784
- pass # best-effort notification
2785
+ # Auto-notify the resolved assignee so they wake from meshcode_wait.
2786
+ # Read result["assignee"] (server may have resolved 'auto' to a real name).
2787
+ if isinstance(result, dict) and result.get("ok"):
2788
+ resolved = result.get("assignee") or assignee
2789
+ if resolved and resolved != "*" and resolved != AGENT_NAME:
2790
+ try:
2791
+ be.send_message(_PROJECT_ID, AGENT_NAME, resolved, {
2792
+ "type": "task_assigned",
2793
+ "task_id": result.get("task_id", ""),
2794
+ "title": title,
2795
+ "priority": priority,
2796
+ "text": f"New {priority} task assigned to you: {title}",
2797
+ }, msg_type="system", api_key=_get_api_key())
2798
+ except Exception:
2799
+ pass # best-effort notification
2785
2800
  return result
2786
2801
 
2787
2802
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshcode
3
- Version: 2.10.83
3
+ Version: 2.10.84
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.83"
7
+ version = "2.10.84"
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