Skip to content

πŸ¦‹ New version release - #546

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

πŸ¦‹ New version release#546
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.58.3

Patch Changes

  • 330680e: fix(server): a storage blip is no longer reported as session '<id>' not found

    AppState::load_session hydrates a session from storage when the local
    per-pod registry misses (th-ca579c) β€” the normal path for a returning visitor
    whose WebSocket lands on a pod that has never seen their session. That read
    collapsed Err into None, so a transient Postgres failure was
    indistinguishable from a session that genuinely does not exist. Every caller
    renders None as session '<id>' not found, so a backend hiccup told a live
    visitor on smoo.ai, in the chat bubble, that their conversation was gone. Seen
    in production.

    load_session now returns anyhow::Result<Option<Session>> and
    handler::scoped_session propagates it. The three outcomes are distinct at the
    user-visible boundary:

    • Ok(Some(session)) β€” unchanged.
    • Ok(None) β€” not found, or not yours: still the identical
      SESSION_NOT_FOUND / NO_PENDING_* event, byte for byte, so there is no
      existence oracle to enumerate other users' session ids with.
    • Err(_) β€” storage could not answer: a retryable STORAGE_ERROR ("session
      lookup is temporarily unavailable, please try again"), which is not an
      existence claim and leaks nothing (a storage failure is independent of
      whether the id is real or ours). The underlying error is logged server-side,
      not sent to the client.

    All six session-id-taking actions route through the one chokepoint and switch
    together: get_session, get_conversation_messages, send_message and
    verify_otp (previously SESSION_NOT_FOUND), plus confirm_tool_action and
    submit_interaction (previously NO_PENDING_CONFIRMATION /
    NO_PENDING_INTERACTION, which for a parked turn was equally wrong β€” the park
    is still there, and a retry still resolves it).

    rust/smooth-operator-server/tests/session_storage_blip.rs drives the real
    dispatcher against a storage adapter whose get_session fails on demand and
    pins both halves: a blip is never rendered as not-found on any of the six
    actions, and a genuinely unknown id still is (a fix that made everything
    retryable would leave clients retrying an id that will never resolve).

    Host-facing API change: AppState::load_session returns
    anyhow::Result<Option<Session>> instead of Option<Session> β€” hosts calling
    it directly add a ? or a match.

@smooai/smooth-operator-web-chat-example@0.0.116

Patch Changes

  • Updated dependencies [330680e]
    • @smooai/smooth-operator@1.58.3

@brentrager
brentrager merged commit f6cbaa1 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