This release fixes issues for SREs watching stability and regressions.
✓ No known CVEs patched in this version
Topics
+1 more
Affected surfaces
Summary
AI summaryFixes persistToS2 error handling, SSE reconnect logic, and TanStack AI chat hang on HTTP 204.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Bugfix | Medium |
`persistToS2` invokes `onSeqNumMismatch` when a SeqNumMismatchError occurs after producer close. `persistToS2` invokes `onSeqNumMismatch` when a SeqNumMismatchError occurs after producer close. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
SSE reconnect fails fast on permanent HTTP errors (401/403/404) instead of retrying forever. SSE reconnect fails fast on permanent HTTP errors (401/403/404) instead of retrying forever. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
SSE subscriptions reconnect on mid‑stream errors rather than crashing. SSE subscriptions reconnect on mid‑stream errors rather than crashing. Source: llm_adapter@2026-06-03 Confidence: high |
— |
| Bugfix | Medium |
TanStack AI chat no longer hangs when replay endpoint returns HTTP 204 (no‑body). TanStack AI chat no longer hangs when replay endpoint returns HTTP 204 (no‑body). Source: llm_adapter@2026-06-03 Confidence: low |
— |
| Bugfix | Low |
`subscribeChunks` yields a synthetic 'RUN_FINISHED' for HTTP 204 responses to avoid hanging TanStack AI chat. `subscribeChunks` yields a synthetic 'RUN_FINISHED' for HTTP 204 responses to avoid hanging TanStack AI chat. Source: granite4.1:30b@2026-06-03-audit Confidence: low |
— |
Full changelog
Patch Changes
-
a478434: fix:
persistToS2now actually invokesonSeqNumMismatch(#248)The per-record
instanceof SeqNumMismatchErrorcheck was unreachable —Producer.submit()
wraps a pump failure in a genericS2Error, so the callback never fired. The genuine
SeqNumMismatchErrorsurfaces fromproducer.close(), so the handling now runs after the
producer is closed: when the persist failure is (or contains) aSeqNumMismatchErrorand an
onSeqNumMismatchcallback was provided, it's invoked and treated as an expected
fenced/concurrent-writer condition instead of being thrown. Callers without the callback are
unaffected (the failure still throws). -
6019944: fix: SSE reconnect now fails fast on permanent HTTP errors instead of retrying forever (#232)
The auto-reconnect loop in
subscribeSseretried on every fetch error, so a permanent
failure (401/403/404) was retried indefinitely.fetchOknow throws anHttpError
carrying the status, and the loop surfaces permanent errors (4xx other than 408/429)
to the caller instead of reconnecting. Transient errors (network failures, 408, 429, 5xx)
are still retried. -
f3ec15a: fix: SSE subscriptions reconnect on mid-stream errors instead of crashing (#249)
subscribeSseonly wrapped thefetchOkcall in try/catch, not thefor await
overpipeSseFrames. When the response body errored mid-iteration, the throw
escaped before the reconnection logic could run, so the subscription crashed with
no recovery. The loop is now wrapped: it reconnects from the last cursor when
reconnectBackoffMsis set and rethrows when reconnect is disabled, matching the
TanStacksubscribeChunkspath. This restores behavior dropped in #241. -
b4499c6: fix: TanStack AI chat no longer hangs when the replay endpoint returns HTTP 204 (#250)
subscribeChunksreturned an empty stream on a 204/no-body replay response, so
TanStack's subscription loop ended without a terminal chunk andstreamResponse()
hung forever onprocessingComplete. It now yields a syntheticRUN_FINISHEDso
the subscription terminates cleanly. This restores the behavior dropped in #241.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About s2-streamstore/s2-sdk-typescript
Official MCP server for the S2.dev serverless stream platform.
Related context
Related tools
Earlier breaking changes
- v@s2-dev/[email protected] Removes generated API.BasinScope as spec no longer defines it.
- v@s2-dev/[email protected] Removes root export BasinScope; introduces LocationName instead.
- v@s2-dev/[email protected] Replaces BasinInfo.scope with location field.
- v@s2-dev/[email protected] Replaces EnsureBasinInput.scope with location field.
- v@s2-dev/[email protected] Replaces CreateBasinInput.scope with location field.
Beta — feedback welcome: [email protected]