Skip to content

fix: Capture session ID from stream headers rather than final event - #3531

Merged
ellie merged 2 commits into
mainfrom
mkt/session-id-from-header
Jun 17, 2026
Merged

fix: Capture session ID from stream headers rather than final event#3531
ellie merged 2 commits into
mainfrom
mkt/session-id-from-header

Conversation

@BinaryMuse

Copy link
Copy Markdown
Member

This allows us to ensure a cancelled request still gets its session ID set on the client, allowing the user to resume the conversation from the cut-off point.

@greptile-apps

greptile-apps Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR captures the AI server session ID earlier in the streaming flow. The main changes are:

  • Adds a SessionIdentity stream frame from x-atuin-ai-session-id response headers.
  • Converts that frame into a new FSM SessionIdReceived event.
  • Stores the header-provided session ID before the final done SSE event arrives.

Confidence Score: 3/5

This should be fixed before merging.

  • Cancelled streams can still lose the session ID after process exit.
  • Empty header values can poison the stored session ID.
  • Existing sessions can keep stale IDs when the server returns a replacement in headers.

crates/atuin-ai/src/fsm/mod.rs

Important Files Changed

Filename Overview
crates/atuin-ai/src/fsm/mod.rs Stores session IDs from the new header event, but misses persistence and validation cases.
crates/atuin-ai/src/stream.rs Emits the new session identity frame from successful stream response headers.

Reviews (1): Last reviewed commit: "fix: Capture session ID from stream head..." | Re-trigger Greptile

Comment thread crates/atuin-ai/src/fsm/mod.rs Outdated
Comment thread crates/atuin-ai/src/fsm/mod.rs
Comment thread crates/atuin-ai/src/fsm/mod.rs Outdated
@BinaryMuse
BinaryMuse requested a review from ellie June 17, 2026 00:48
@BinaryMuse

Copy link
Copy Markdown
Member Author

@ellie I think we're probably fine with those caveats but open to thoughts.

@ellie ellie left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ya i think those caveats are fine! tyty

@ellie
ellie merged commit 2203a41 into main Jun 17, 2026
25 checks passed
@ellie
ellie deleted the mkt/session-id-from-header branch June 17, 2026 11:44
taylordotfish pushed a commit that referenced this pull request Jul 9, 2026
### Bug Fixes

- *(ai)* Dispatch skills registered in the slash command registry
([#3593](#3593))
- *(ci)* Fossier install in scan workflow
([#3485](#3485))
- *(i18n)* Fix typos in Russian localization
([#3575](#3575))
- *(nu)* Use `char -u 1b` for ESC in OSC 133 sequences
([#3530](#3530))
- *(nu)* Suppress error when `ATUIN_HISTORY_ID` is missing in
`pre_prompt` hook
([#3587](#3587))
- *(pi)* Observe tool events instead of registering a bash tool
([#3557](#3557))
- *(pty-proxy)* Set `$SHELL` to the spawned shell
([#3548](#3548))
- *(search)* Fix terminal clearing with latest Ratatui
([#3578](#3578))
- *(sync)* Skip records that fail to decrypt or decode instead of
failing the whole store
([#3569](#3569))
- Atuin hangs when attempting to spawn daemon from Ctrl+R invocation
([#3502](#3502))
- Capture session ID from stream headers rather than final event
([#3531](#3531))
- Doctor resiliency fo runknown platforms + openbsd warning
([#3551](#3551))
- Double input on arrow keys in AI setup prompt on Windows
([#3552](#3552))
- Exclude AI agent commands from zsh-autosuggestions
([#3567](#3567))
- Silence shellcheck SC2016 on literal `$all-user` author filter
- Respect `store_failed` when using daemon
([#3571](#3571))


### Documentation

- Highlight `Ctrl-r` keybinding on docs page
([#3489](#3489))
- Document store purge workflow
([#3544](#3544))
- Fix command example typo in documentation
([#3536](#3536))
- Make commented-out lines in `config.toml` match real defaults
([#3583](#3583))
- Add fish shell cleanup step to uninstall instructions
([#3582](#3582))


### Features

- *(doctor)* Add whether daemon is enabled to `doctor` output
([#3572](#3572))
- *(pty-proxy)* Add `--shell` flag to override the spawned shell
([#3327](#3327))
- Setup fossier to stop bot slop prs
([#3482](#3482))
- Capture command output + expose to new `atuin_output` tool
([#3510](#3510))
- Cache user contexts on load until `/reload`
([#3525](#3525))
- Create database integration tests for atuin-server
([#3514](#3514))
- Add `/model` slash command for changing models
([#3576](#3576))
- Add mcp server for history tools and expand search filters
([#3581](#3581))
- Add status bar with model and usage information
([#3591](#3591))


### Miscellaneous Tasks

- *(rustdoc)* Fix Rustdoc warnings
([#3585](#3585))
- *(warnings)* Fix compile warnings with latest dependencies
([#3586](#3586))
- Vouch for all existing contributors
([#3486](#3486))
- Update GitHub app token format
- Update to Rust 1.96.1
([#3568](#3568))
- Adopt `derive_more` to reduce boilerplate across the codebase
([#3573](#3573))


### Performance

- *(search)* Scan history by recency until N unique
([#3553](#3553))
- Add `synchronous(Normal)` + `optimize_on_close` to record store SQLite
([#3577](#3577))
- Remove unnecessary clones in a hot path
([#3580](#3580))


### Refactor

- Implement `From<sqlx::Error>` and clean up `fix_error`
([#3484](#3484))
- Pull `fn into_utc` into `atuin-server-database` crate
([#3487](#3487))
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.

2 participants