Skip to content

Message-kind responses with data parts are not rendered in chat #151

Description

@dgwartney

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

  1. 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)
  2. Send any message
  3. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions