Skip to content

πŸ¦‹ New version release - #541

Merged
brentrager merged 1 commit into
mainfrom
changeset-release/main
Aug 23, 2026
Merged

πŸ¦‹ New version release#541
brentrager merged 1 commit into
mainfrom
changeset-release/main

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

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 cancelled terminal on the servers, and bound a .NET turn on the client

    Two terminal states that were not terminal.

    cancelled was advisory, not terminal (th-8628bf). Cancellation is cooperative
    everywhere: JoinHandle::abort(), context cancellation and CancellationToken all
    take effect at the next yield point, not immediately. A turn that is executing rather
    than suspended keeps running β€” and an await on an already-completed future does not
    yield either β€” so work kept happening after the client had been sent the terminal
    cancelled (499).

    • Python was the worst: the Rich Interaction raise tool and the SEP extension host's
      ui/confirm park both caught asyncio.CancelledError alongside their own timeout and
      returned normally. asyncio only treats a task as cancelled if the CancelledError
      propagates out of it, so that un-cancelled the turn: it resumed, ran the next model
      call, persisted an assistant reply and emitted an eventual_response for a requestId
      the client had been told ended at 499. Both sites now re-raise; their own
      TimeoutError β€” a genuinely different thing β€” still degrades to "no answer".
    • Rust now drops post-cancel frames at the connection writer, the one point every
      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 cancelled goes out, that its tail re-reads immediately before
      each side effect β€” including the OTP dispatch, which is not a frame and so cannot be
      covered by the writer gate.
    • Go gates the turn's sink once, for the same reason: a raise tool calls sink()
      straight from inside Execute, on the engine's goroutine, with no context check of its
      own. offerOtp also moved from the connection's context to the turn's, and re-checks
      immediately before dispatching β€” a host OtpService is under no obligation to honor
      the 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). SmoothAgentClientOptions exposed only
    RequestTimeout, with no counterpart to TypeScript's turnTimeout, Go's
    DefaultTurnTimeout or Python's turn_timeout. A turn the server accepted but never
    terminated hung for the life of the process β€” no error, no diagnostic, and a leaked entry
    in the client's turn table. TurnTimeout now defaults to the same 120s and faults the
    turn with a TurnTimeoutException; Timeout.InfiniteTimeSpan disables it.

    The same file's _ = _transport.SendAsync(...) sat inside a try/catch that could never
    run: SendAsync is async, so a send failure faults the returned task instead of throwing
    at 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

  • Updated dependencies [72b35b6]
    • @smooai/smooth-operator@1.57.2

@brentrager
brentrager force-pushed the changeset-release/main branch from c569057 to dbcd281 Compare August 23, 2026 02:24
@brentrager
brentrager merged commit ed51823 into main Aug 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant