backstage release v0.129.3

Fixed

  • Stabilise the AI chat transport across React renders. useChatSetup constructed a fresh AssistantChatTransport on every render and handed it to useChatRuntime; when its identity changed mid-stream (e.g. as a side effect of a state update triggered by streamed reasoning-delta / tool-input-delta events), the runtime tore down the in-flight chat fetch with TypeError: network error. Envoy logged the symptom as response_flags: DC (downstream remote disconnect) against a healthy Backstage upstream while the SSE stream summary was sawFinish=false, last event tool-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 stable getHeaders / debugFetch callbacks, so a single transport lives for the component’s lifetime.
  • AI chat instrumentation: observe the caller’s AbortSignal and 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 as console.warn (“cancelled by client AbortSignal”) rather than console.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.