π¦ New version release - #541
Merged
Merged
Conversation
brentrager
force-pushed
the
changeset-release/main
branch
from
August 23, 2026 02:24
c569057 to
dbcd281
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@smooai/smooth-operator@1.57.2
Patch Changes
72b35b6: fix: make
cancelledterminal on the servers, and bound a .NET turn on the clientTwo terminal states that were not terminal.
cancelledwas advisory, not terminal (th-8628bf). Cancellation is cooperativeeverywhere:
JoinHandle::abort(),contextcancellation andCancellationTokenalltake effect at the next yield point, not immediately. A turn that is executing rather
than suspended keeps running β and an
awaiton an already-completed future does notyield either β so work kept happening after the client had been sent the terminal
cancelled(499).ui/confirmpark both caughtasyncio.CancelledErroralongside their own timeout andreturned normally. asyncio only treats a task as cancelled if the
CancelledErrorpropagates out of it, so that un-cancelled the turn: it resumed, ran the next model
call, persisted an assistant reply and emitted an
eventual_responsefor a requestIdthe client had been told ended at 499. Both sites now re-raise; their own
TimeoutErrorβ a genuinely different thing β still degrades to "no answer".frame passes through. Per-emit-site checks could not do this: frames leave a turn from
the runner's stream loop, from inside a raise tool, from the write-confirmation gate
and from the turn tail. The spawned turn also carries a cancelled flag, raised before
the abort and before
cancelledgoes out, that its tail re-reads immediately beforeeach side effect β including the OTP dispatch, which is not a frame and so cannot be
covered by the writer gate.
sink()straight from inside
Execute, on the engine's goroutine, with no context check of itsown.
offerOtpalso moved from the connection's context to the turn's, and re-checksimmediately before dispatching β a host
OtpServiceis under no obligation to honorthe context, and this is a real code to a real person. The outbound persist re-checks
too, because a store may ignore the context (the in-memory one takes it as
_).A .NET turn had no timeout (th-10ff63).
SmoothAgentClientOptionsexposed onlyRequestTimeout, with no counterpart to TypeScript'sturnTimeout, Go'sDefaultTurnTimeoutor Python'sturn_timeout. A turn the server accepted but neverterminated hung for the life of the process β no error, no diagnostic, and a leaked entry
in the client's turn table.
TurnTimeoutnow defaults to the same 120s and faults theturn with a
TurnTimeoutException;Timeout.InfiniteTimeSpandisables it.The same file's
_ = _transport.SendAsync(...)sat inside a try/catch that could neverrun:
SendAsyncis async, so a send failure faults the returned task instead of throwingat the call site, and the discarded task was never observed. The turn was therefore never
aborted and leaked with no error. It is now awaited on a helper that aborts the turn.
@smooai/smooth-operator-web-chat-example@0.0.112
Patch Changes