Summary
The chat UI does not render agent responses when the response is a message-kind event containing data parts (structured JSON). The message is received by the inspector but nothing is displayed.
Root Cause
In frontend/src/script.ts, the case 'message' handler inside the socket.on('agent_response', ...) listener only looks for text parts:
const textPart = event.parts?.find(p => p.text);
if (textPart && textPart.text) {
// render text
}
If all parts are data parts (i.e. kind: 'data', data: {...}), textPart is undefined and nothing is rendered — the message arrives but is silently dropped in the UI.
The processPart helper function already handles data parts correctly (renders as formatted <pre><code> JSON), but it is only called in the task, status-update, and artifact-update cases — not in the message case.
Steps to Reproduce
- Connect the inspector to an A2A v1.0 agent that returns an immediate Message response (i.e. uses the synchronous workflow — enqueues a
Message object rather than a Task with artifacts)
- Send any message
- The agent's response arrives (visible in the Debug Console) but the chat window remains empty
Expected Behaviour
Structured data returned in a message-kind response should be rendered as formatted JSON in the chat window, consistent with how data parts are rendered in artifact-update responses.
Proposed Fix
Replace the text-only lookup with a loop over all parts using the existing processPart helper:
case 'message': {
const allContent: string[] = [];
event.parts?.forEach(p => {
const content = processPart(p);
if (content) allContent.push(content);
});
if (allContent.length > 0) {
const combinedContent = allContent.join('');
const messageHtml = `<span class="kind-chip kind-chip-message">${event.kind}</span> ${combinedContent}`;
appendMessage('agent', messageHtml, displayMessageId, true, validationErrors);
}
break;
}
This renders text, data, and file parts in message responses using the same logic already used for artifacts.
Context
Discovered while validating a Google Maps A2A v1.0 agent (a2a-sdk based) that uses the immediate Message response pattern for synchronous skill calls.
Summary
The chat UI does not render agent responses when the response is a
message-kind event containingdataparts (structured JSON). The message is received by the inspector but nothing is displayed.Root Cause
In
frontend/src/script.ts, thecase 'message'handler inside thesocket.on('agent_response', ...)listener only looks fortextparts:If all parts are
dataparts (i.e.kind: 'data',data: {...}),textPartisundefinedand nothing is rendered — the message arrives but is silently dropped in the UI.The
processParthelper function already handlesdataparts correctly (renders as formatted<pre><code>JSON), but it is only called in thetask,status-update, andartifact-updatecases — not in themessagecase.Steps to Reproduce
Messageobject rather than aTaskwith artifacts)Expected Behaviour
Structured data returned in a
message-kind response should be rendered as formatted JSON in the chat window, consistent with howdataparts are rendered inartifact-updateresponses.Proposed Fix
Replace the text-only lookup with a loop over all parts using the existing
processParthelper:This renders
text,data, andfileparts in message responses using the same logic already used for artifacts.Context
Discovered while validating a Google Maps A2A v1.0 agent (
a2a-sdkbased) that uses the immediate Message response pattern for synchronous skill calls.