Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

StreamProcessor drops TEXT_MESSAGE_CHUNK events without a warning

Open
#1,531 0 comments 0 reactions 1 assignee View on GitHub

Maintainers usually reply within 1 day

@AlemTuzlak is already working on this.

Since Sep 27, 2026.

Assessment

This issue has not been assessed yet.

Description

waiting-on: maintainer
TanStack AI version

v0.61.0

Framework/Library version

React v19.2.0

Describe the bug and the steps to reproduce it

StreamProcessor has no handler for TEXT_MESSAGE_CHUNK. The event reaches
the default branch of processChunk and the processor drops it. There is no
warning.

AG-UI defines TEXT_MESSAGE_CHUNK as a short form of the
TEXT_MESSAGE_START / TEXT_MESSAGE_CONTENT / TEXT_MESSAGE_END triad. A
server can send one chunk event instead of three events. The AG-UI spec gives
the expansion job to the client stream transformer.

Two parts of this repository say that the event is supported:

  • packages/ai/src/types.ts declares TextMessageChunkEvent and puts it in
    the AGUIEvent union. That union is the exported StreamChunk type.
  • packages/ai/src/utilities/spec-event-keys.ts gives the event an allowlist
    entry, so stripToSpec keeps messageId, role, delta, and metadata
    at the top level.

The runtime does not match this. TOOL_CALL_CHUNK and
REASONING_MESSAGE_CHUNK have the same problem.

Steps to reproduce

live:
https://codesandbox.io/p/sandbox/hvf3mx

Open the sandbox. It needs no API key and makes no network calls. The AG-UI
events are constants in src/App.js.

  1. Build a StreamProcessor.
  2. Send RUN_STARTED, then one TEXT_MESSAGE_CHUNK with a messageId, a
    delta, and a metadata.error, then RUN_ERROR.
  3. Read processor.getMessages().
  4. Do the same again with the explicit triad in place of the chunk event.

Result

The chunk event loses three things that the triad keeps:

The server sent this, and the client TEXT_MESSAGE_CHUNK START / CONTENT / END
shows the text "the run failed" lost yes
keeps the message id "msg-1" lost yes
keeps metadata.error lost yes

The assistant message is not absent. It is empty, and it has a new id:

[{ "id": "msg-1790507900666-2mxf4p", "role": "assistant", "parts": [] }]

RUN_ERROR created that message. The id msg-1 from the server is gone, so a
later event that uses msg-1 cannot find the message.

Expected result
Both forms describe the same turn. Both must produce the same message.

Notes
MESSAGES_SNAPSHOT is a plain messages[], so a reload of a saved thread
shows the correct text. The fault is visible only during a live run. A unit
test that sends the triad cannot find this fault.

processChunk already has the three handlers that an expansion needs. A
case per chunk event can call them, hold the open message id, and close the
message when the id changes or when finalizeStream runs.

Related: #1465 tried this and closed without a merge. #1460 added the AG-UI 1.0
types and left the runtime out of scope.

Your Minimal, Reproducible Example - (Sandbox Highly Recommended)

https://codesandbox.io/p/sandbox/hvf3mx

Screenshots or Videos (Optional)
Image
Do you intend to try to help solve this bug with your own PR?

None

Terms & Code of Conduct
  • I agree to follow this project's Code of Conduct
  • I understand that if my bug cannot be reliable reproduced in a debuggable environment, it will probably not be fixed and this issue may even be closed.
Dominant language
TypeScript
Stars
3.1k
Forks
340
Avg merge
2d 10h
Merged PRs (30d)
174

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from TanStack/ai

All issues in TanStack/ai

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.