Much work on input mode switching
This commit is contained in:
@@ -13,7 +13,7 @@ import socket
|
||||
HOST = "localhost"
|
||||
PORT = 9851
|
||||
CONNECT_TIMEOUT = 2
|
||||
READ_TIMEOUT = 120
|
||||
READ_TIMEOUT = 30
|
||||
|
||||
TOOL_DESCRIPTION = (
|
||||
"Send a command to the Unreal Editor's UE Wingman plugin. "
|
||||
@@ -91,12 +91,6 @@ def forward_to_editor(arguments):
|
||||
return send_and_receive(arguments)
|
||||
except Exception:
|
||||
disconnect()
|
||||
# Retry once in case the connection was stale
|
||||
if connect():
|
||||
try:
|
||||
return send_and_receive(arguments)
|
||||
except Exception:
|
||||
disconnect()
|
||||
return {"error": "Lost connection to Unreal Editor."}
|
||||
|
||||
|
||||
@@ -104,6 +98,28 @@ def make_jsonrpc(msg_id, result):
|
||||
return {"jsonrpc": "2.0", "id": msg_id, "result": result}
|
||||
|
||||
|
||||
def parse_editor_response(result):
|
||||
"""Parse and validate a raw editor response into an MCP content list.
|
||||
|
||||
MCP expects `content` to be a list of objects, each with at least a
|
||||
string "type" field (e.g. {"type": "text", "text": "..."}). Anything
|
||||
else is replaced with a single error item so the client sees a clear
|
||||
message instead of a schema violation.
|
||||
"""
|
||||
try:
|
||||
parsed = json.loads(result)
|
||||
except json.JSONDecodeError:
|
||||
return [{"type": "text", "text": "Malformed response from editor: invalid JSON."}]
|
||||
if not isinstance(parsed, list):
|
||||
return [{"type": "text", "text": "Malformed response from editor: expected a list."}]
|
||||
for item in parsed:
|
||||
if not isinstance(item, dict):
|
||||
return [{"type": "text", "text": "Malformed response from editor: list item is not an object."}]
|
||||
if not isinstance(item.get("type"), str):
|
||||
return [{"type": "text", "text": "Malformed response from editor: item missing string 'type' field."}]
|
||||
return parsed
|
||||
|
||||
|
||||
def handle_message(msg):
|
||||
"""Handle one JSON-RPC message from Claude Code."""
|
||||
msg_id = msg.get("id")
|
||||
@@ -130,10 +146,7 @@ def handle_message(msg):
|
||||
if isinstance(result, dict) and "error" in result:
|
||||
content = [{"type": "text", "text": result["error"]}]
|
||||
else:
|
||||
try:
|
||||
content = json.loads(result)
|
||||
except json.JSONDecodeError:
|
||||
content = [{"type": "text", "text": "Malformed response from editor."}]
|
||||
content = parse_editor_response(result)
|
||||
return make_jsonrpc(msg_id, {
|
||||
"content": content,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user