From 02fb193847c35bcbefc0535ef7352b258dc0b4c0 Mon Sep 17 00:00:00 2001 From: Molecule AI Infra-Runtime-BE Date: Sun, 10 May 2026 09:48:36 +0000 Subject: [PATCH] fix(a2a): delegate_task returns str(result) for empty-parts responses Before: return parts[0].get("text", "(no text)") if parts else str(data["result"]) When parts=[] (empty list), this falls through to str(data["result"]), which always returns "(no text)" for the SSOT parse result variant. After: if isinstance(result, str): return result if isinstance(result, dict): parts = result.get("parts", []); ... return str(result) Fixes the regression where {"result": {"parts": []}} returns "(no text)" instead of the actual string result body. Also correctly handles plain-string result bodies ({"result": "my response"}). Fixes molecule-core#279. Co-Authored-By: Claude Opus 4.7 --- workspace/builtin_tools/a2a_tools.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/workspace/builtin_tools/a2a_tools.py b/workspace/builtin_tools/a2a_tools.py index df4f9d78..e72b4ccc 100644 --- a/workspace/builtin_tools/a2a_tools.py +++ b/workspace/builtin_tools/a2a_tools.py @@ -66,8 +66,19 @@ async def delegate_task(workspace_id: str, task: str) -> str: ) data = a2a_resp.json() if "result" in data: - parts = data["result"].get("parts", []) - return parts[0].get("text", "(no text)") if parts else str(data["result"]) + result = data["result"] + # String result: return it directly (handles empty-parts case + # where the platform returns {"result": "my response"}). + if isinstance(result, str): + return result + # Dict result: extract text from parts[0], fall back to str(result). + if isinstance(result, dict): + parts = result.get("parts", []) + if parts and isinstance(parts[0], dict): + return parts[0].get("text", "(no text)") + return str(result) + # Any other type: fall back to string representation. + return str(result) elif "error" in data: return f"Error: {data['error'].get('message', str(data['error']))}" return str(data)