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.
- {meshcode-2.10.83 → meshcode-2.10.84}/PKG-INFO +1 -1
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/__init__.py +1 -1
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/server.py +29 -14
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.10.83 → meshcode-2.10.84}/pyproject.toml +1 -1
- {meshcode-2.10.83 → meshcode-2.10.84}/README.md +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/ascii_art.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/cli.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/comms_v4.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/compat.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/error_hints.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/exceptions.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/invites.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/launcher.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/launcher_install.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/preferences.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/quickstart.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/run_agent.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/secrets.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/self_update.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/setup_clients.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/supervisor.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode/upload.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/setup.cfg +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_core.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_cross_agent_messaging.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_esc_deaf_state.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_exceptions.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_mark_read_batch.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_migration_integrity.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_realtime_event_freshness.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_rls_cross_tenant.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_rpc_migrations.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_security_regressions.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_sentinel.py +0 -0
- {meshcode-2.10.83 → meshcode-2.10.84}/tests/test_status_enum_coverage.py +0 -0
|
@@ -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=
|
|
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
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2777
|
-
|
|
2778
|
-
|
|
2779
|
-
|
|
2780
|
-
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2784
|
-
|
|
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
|
|
|
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
|