Fixed
- Stabilise the AI chat transport across React renders.
useChatSetupconstructed a freshAssistantChatTransporton every render and handed it touseChatRuntime; when its identity changed mid-stream (e.g. as a side effect of a state update triggered by streamedreasoning-delta/tool-input-deltaevents), the runtime tore down the in-flight chat fetch withTypeError: network error. Envoy logged the symptom asresponse_flags: DC(downstream remote disconnect) against a healthy Backstage upstream while the SSE stream summary wassawFinish=false, last eventtool-input-delta, surfacing in the UI as a “Network error” banner even though no real network outage occurred. The transport is now memoised on the resolved API URL and the stablegetHeaders/debugFetchcallbacks, so a single transport lives for the component’s lifetime. - AI chat instrumentation: observe the caller’s
AbortSignaland log abort events with the reason inline (ABORT signaled by client at <ms> -- reason: <name>: <message>). Stream-outcome lines now annotate aborted streams with[client-aborted at Nms reason="..."]so a “Network error” banner can be classified as a deliberate client cancel (transport rebuild, unmount, manual stop) versus a real proxy / network failure (no abort signal fired, raw stream error). Read errors that fired after the caller aborted are now logged asconsole.warn(“cancelled by client AbortSignal”) rather thanconsole.error(“STREAM READ FAILED”), reserving the latter for the genuine pre-finish, non-aborted failure mode.
See ./docs/releases/v0.129.3-changelog.md for more information.