Skip to content

fix(ai-session): keep compacted Claude and Pi sessions whole when restored from sync - #4357

Merged
atuin-bot merged 1 commit into
mainfrom
ai-compaction-loop
Oct 6, 2026
Merged

atuin-bot merged 1 commit into
mainfrom
ai-compaction-loop

Conversation

@ellie

@ellie ellie commented Oct 6, 2026

Copy link
Copy Markdown
Member

No description provided.

@greptile-apps

greptile-apps Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 4/5

[Medium risk] Fixes session history reconstruction for compacted AI conversations.

The PR should not merge until cycle reconnection cannot fast-forward a copy onto an unrelated rewind branch.

Findings

  1. P1 Compaction joins the wrong branch ▶

Summary

The PR reconnects compacted Claude and Pi parent cycles during branch analysis and transcript restoration, and extends Claude boundary detection across attachments.

  • Adds regression tests for compaction cycles and clock-skewed parent links.
  • The branch-analysis fallback can connect a cycle to the wrong same-host rewind branch.

Reviews (1) · Last reviewed commit: "fix(ai-session): keep compacted Claude a..."

Comment on lines +467 to +476
let before = |same_host: bool| {
(0..earliest).rev().find(|&j| {
in_tree[j]
&& (!same_host || rows[j].host == rows[earliest].host)
&& !leads_in(Some(j))
})
};
let fallback = before(true).or_else(|| before(false));

parent[earliest] = fallback;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Compaction joins the wrong branch If a same-host rewind leaves a dead-end row timestamped just before a compaction cycle, this fallback can choose that row as the cycle’s parent even when the compaction belongs to the other branch. The dead end then appears on the restored head’s path, so sync can fast-forward the wrong local copy and refuse to fast-forward the copy on the actual continuation.

Knowledge Base Used: AI session persistence

@ellie ellie Oct 6, 2026 •

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

supeerrrrrr unlikely

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Agreed that the exact arrangement is probably rare. The concern is less its frequency than that the fallback has no branch-affinity check: it selects the newest earlier row (same host first) that does not currently lead into the cycle. An unrelated earlier dead-end can therefore satisfy the predicate and become the cycle’s parent, silently changing path_to/fast_forward rather than failing loudly.

If this heuristic is intentional, I’d treat the comment as low priority; otherwise, a regression test covering two branches, a same-host dead-end, and a later cycle would make the intended invariant explicit.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Fair — this is definitely an edge case requiring an already inconsistent or corrupted transcript. My concern is deterministic rather than probabilistic: once that cycle exists, before(true) has no branch-membership check, so any earlier same-host row that does not lead into the cycle can be selected, including a dead end from another branch.

If sync invariants guarantee that earlier same-host rows are always the intended continuation, then this fallback is safe; otherwise, the rare cycle is precisely where that assumption becomes unreliable.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Fair — this requires a malformed or partial parent graph with an earlier same-host dead end that survives the cycle check, so it’s a very unlikely sync-state edge case rather than a practical concern for normal sessions. I wouldn’t block this change on it; at most, it’s worth a regression test if the cycle-repair fallback is intended to defend against corrupted graphs.

@ellie
ellie marked this pull request as ready for review October 6, 2026 05:04
@ellie

ellie commented Oct 6, 2026

Copy link
Copy Markdown
Member Author

/merge

@atuin-bot

atuin-bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Landed as e8a2c63. GitHub shows this merged once it reaches main.

@atuin-bot
atuin-bot merged commit e8a2c63 into main Oct 6, 2026
10 checks passed
@atuin-bot
atuin-bot deleted the ai-compaction-loop branch October 6, 2026 05:25
atuin-bot pushed a commit that referenced this pull request Oct 13, 2026
### Bug Fixes

- *(ai)* Saturate file-tracker mtimes and rebuild on new migrations ([#4250](#4250))
- *(ai)* Start the daemon before ai commands if autostart is enabled ([#4269](#4269))
- *(ai)* Add MCP list cache fields and a since filter for session list ([#4294](#4294))
- *(ai)* Only look up repos for this host's sessions in the resume picker ([#4400](#4400))
- *(ai-session)* Read an unknown parent kind as None ([#4301](#4301))
- *(ai-session)* Count content-derived calls once per session lineage ([#4314](#4314))
- *(ai-session)* Keep compacted Claude and Pi sessions whole when restored from sync ([#4357](#4357))
- *(ai-session)* Link a Claude compaction that kept messages to the line before it ([#4370](#4370))
- *(ai-session)* Harden capture, sync and resume across agents ([#4387](#4387))
- *(ai-session)* Fix opencode 1.x resume capture, A→B→A catch-up, synced tail, and picker tty, keys and idle CPU ([#4398](#4398))
- *(ai-session)* Switch inside a merged run past a failed call without losing the run's earlier text ([#4402](#4402))
- *(daemon)* Recover ai sessions in the background at boot ([#4293](#4293))
- *(daemon)* Pick up ai.capture_sessions changes without a restart ([#4362](#4362))
- *(daemon)* Run the daemonized daemon from / ([#4358](#4358))
- *(daemon)* Write the record store before history.db when a command finishes ([#4361](#4361))
- *(daemon)* Time out shell hook calls to an unresponsive daemon ([#4360](#4360))
- *(daemon)* Only restart a daemon older than the client ([#4359](#4359))
- *(doctor)* Fix sqlite error in `atuin doctor` ([#4354](#4354))
- *(hook)* Write absolute executable path to agent configs ([#4044](#4044))
- *(octavo)* Strip NUL bytes from history before uploading it
- *(octavo)* Drop dead hub connections with http2 keepalive
- *(pty-proxy)* Fix forwarding of output to parent terminal under load ([#4217](#4217))
- *(pty-proxy)* Fix PTY proxy initialization in fish ([#4224](#4224))
- *(pty-proxy)* Preserve login shell status in init script ([#4271](#4271))
- *(pty-proxy)* Periodically touch the socket to prevent automatic deletion ([#4366](#4366))
- *(vendor)* Find the repository root from the script's location
- Timezone awareness during atuin search ([#3762](#3762))
- Handling of OSC 133 sequences in prompt ([#4221](#4221))
- Don't (re)start daemon on history end ([#4229](#4229))
- Fall back to saving history locally when the daemon can't be started ([#4234](#4234))
- Use github release proxy ([#4297](#4297))
- Improve "output capture disabled" message ([#4296](#4296))
- Literal out of range for usize ([#4295](#4295))
- Meaning of today in mcp since ([#4300](#4300))

### Documentation

- *(ai)* Describe continuing in another agent as carrying tool calls over ([#4403](#4403))
- Limit installation methods to those that install the latest version ([#4219](#4219))
- Remove information about dotfiles in support matrix ([#4298](#4298))

### Features

- *(ai)* List, read and richer search MCP tools for sessions ([#4280](#4280))
- *(ai)* Add `atuin ai resume`, a picker over agent sessions ([#4311](#4311))
- *(ai)* Resume sessions recorded on other machines ([#4315](#4315))
- *(ai)* Give every AI session a fixed UUIDv7 atuin id ([#4326](#4326))
- *(ai)* Show parent, root and children links as atuin ids ([#4337](#4337))
- *(ai)* Continue a session in another agent from `atuin ai resume` ([#4325](#4325))
- *(ai)* Fork a session from `atuin ai resume` ([#4340](#4340))
- *(ai)* Work out a session's heads on demand, with Codex rows linked to the row before ([#4341](#4341))
- *(ai)* Catch sessions up with sync on resume, and fork from another machine's branch ([#4345](#4345))
- *(ai)* Switch a diverged session's copy to another machine's branch on resume ([#4350](#4350))
- *(ai)* Capture tool calls as well as messages ([#4352](#4352))
- *(ai)* Capture and restore the diffs of agents' edits ([#4369](#4369))
- *(ai)* Filter session reads by query and role, rank substring history matches first ([#4367](#4367))
- *(ai)* Add `atuin resume` as short for `atuin ai resume` ([#4382](#4382))
- *(ai)* List forks as a tree under their root in the session picker, mark running forks, and name the provider in Codex rollouts ([#4399](#4399))
- *(ai)* Show the atuin id as ID and the harness's own as Harness ID in the resume picker's Inspect tab ([#4401](#4401))
- *(ai-session)* Faster sidecar rebuilds, session grouping, and one search API ([#4302](#4302))
- *(ai-session)* Fast-forward a behind transcript to its synced head ([#4344](#4344))
- *(ai-session)* Search by message role and without subagents, and know a stateless MCP caller's own session ([#4385](#4385))
- *(ai-session)* Show short session ids, and select text with the mouse in the resume picker ([#4404](#4404))
- *(ai-session)* Capture sessions from when it's turned on, and atuin config enable ai-sessions ([#4389](#4389))
- *(api-client)* Add the atuin.api.v1 protos ([#4312](#4312))
- *(common)* Add BlockingPool, a cap on concurrent blocking work ([#4242](#4242))
- *(daemon)* Store daemon socket path in pidfile ([#4253](#4253))
- *(i18n)* Localize user-facing text with Fluent ([#4233](#4233))
- *(octavo)* Move the hub protos into atuin-octavo and generate its client
- *(octavo)* Upload captured command output
- *(output)* Add command_filter to drop output but keep history ([#4268](#4268))
- *(pty-proxy)* Switch from OSC 133 to Atuin-specific sequence ([#4291](#4291))
- *(search)* Add accept-cd and return-cd keymap actions ([#4319](#4319))
- *(secrets)* Add several new known secrets formats ([#4364](#4364))
- Read login password and key from env or stdin ([#3498](#3498))
- Enable workspaces by default ([#1838](#1838))
- Capture ai agent sessions into the store ([#4212](#4212))
- Automatically open login link ([#4351](#4351))
- Send atuin register's login link to the hub's signup page ([#4353](#4353))
- Config disable ([#4349](#4349))

### Miscellaneous Tasks

- *(buildkite)* Fix the installer hang and address #4274 review ([#4275](#4275))
- *(buildkite)* Build tests once, split test jobs by timing ([#4278](#4278))
- *(nix)* Build with crane and cache to atuin.cachix.org ([#4348](#4348))
- *(nix)* Set USER so cachix runs in the CI container
- *(nix)* Use stdenv.hostPlatform.isDarwin in atuin.nix ([#4391](#4391))
- *(octavo)* Scope the buf proto rg ignore to its directory
- Sccache for codegen jobs, rust-cache for the rest ([#4214](#4214))
- Fix Clippy warning about `time::Duration` ([#4231](#4231))
- Rename `Backoff::Linear` to `Backoff::Constant` ([#4238](#4238))
- Reduce record store disk usage ([#4249](#4249))
- Run CI on Buildkite ([#4274](#4274))
- Remove the GitHub Actions workflows Buildkite replaced ([#4277](#4277))
- Use internal session ids ([#4279](#4279))
- Tell hub when main moves
- Tiny bit of CONTRIBUTING.md formatting ([#4317](#4317))
- Land pull requests with /merge
- One check per pipeline, and a merge status for /merge
- Skip CI on the update /merge makes, and keep other repos' links as text
- Keep lockfiles, vendored code and fixtures out of rg results
- Gate each deploy on its own checks and skip unchanged subtrees

### Performance

- *(ai)* Make AI session rebuilds fast ([#4343](#4343))
- *(daemon)* Load the search index with a linear history scan ([#4347](#4347))
- *(dotfiles)* Remove defunct bind feature detection for fish ([#2532](#2532))
- Build the bundled SQLite with SQLITE_DEFAULT_MEMSTATUS=0 ([#4342](#4342))

### Refactor

- *(ai-session)* Squash sidecar migrations, intern repeated message text, drop session transcript ([#4371](#4371))
- *(ai-session)* Drop compatibility with records, checkpoints and daemons from earlier builds ([#4373](#4373))
- *(deps)* Bump vmactions/omnios-vm from 1.3.4 to 1.3.6 ([#4029](#4029))
- *(deps)* Bump debian from bookworm-20260713-slim to bookworm-20260918-slim ([#4025](#4025))
- *(deps)* Bump lukemathwalker/cargo-chef from `e406ad0` to `9a2089c` ([#4026](#4026))
- *(deps)* Bump urllib3 from 2.7.0 to 2.8.0 in /docs in the uv group across 1 directory ([#4313](#4313))
- *(deps)* Bump xxhash-rust from 0.8.15 to 0.8.16 in the cargo group across 1 directory ([#4322](#4322))
- *(deps)* Bump tokio-util from 0.7.18 to 0.7.19 ([#4289](#4289))
- *(deps)* Bump rustix from 1.1.4 to 1.1.5 ([#4288](#4288))
- *(deps)* Bump colored from 2.2.0 to 3.1.1 ([#4339](#4339))
- *(deps)* Bump async-trait from 0.1.89 to 0.1.92 ([#4338](#4338))
- *(deps)* Bump mozilla-actions/sccache-action from 0.0.9 to 0.0.11 ([#4287](#4287))
- *(deps)* Bump thiserror from 2.0.19 to 2.0.21 ([#4284](#4284))
- Hold secrets in secrecy types ([#4237](#4237))
- Improve `Shell::default_shell`; fixes hanging test under Nextest ([#4267](#4267))
- Switch from `directories` to `dirs` ([#4306](#4306))
- Clean up atuin-common crate features ([#4323](#4323))

### Testing

- *(ai-session)* E2e tests for capture, sync and resume; scan new dirs in the tree watcher ([#4368](#4368))
- Deflake the e2e shell tests
atuin-bot pushed a commit that referenced this pull request Oct 14, 2026
### Bug Fixes

- *(ai)* Saturate file-tracker mtimes and rebuild on new migrations ([#4250](#4250))
- *(ai)* Start the daemon before ai commands if autostart is enabled ([#4269](#4269))
- *(ai)* Add MCP list cache fields and a since filter for session list ([#4294](#4294))
- *(ai)* Only look up repos for this host's sessions in the resume picker ([#4400](#4400))
- *(ai)* Fit the resume picker's title to the version so a prerelease isn't cut off ([#4406](#4406))
- *(ai-session)* Read an unknown parent kind as None ([#4301](#4301))
- *(ai-session)* Count content-derived calls once per session lineage ([#4314](#4314))
- *(ai-session)* Keep compacted Claude and Pi sessions whole when restored from sync ([#4357](#4357))
- *(ai-session)* Link a Claude compaction that kept messages to the line before it ([#4370](#4370))
- *(ai-session)* Harden capture, sync and resume across agents ([#4387](#4387))
- *(ai-session)* Fix opencode 1.x resume capture, A→B→A catch-up, synced tail, and picker tty, keys and idle CPU ([#4398](#4398))
- *(ai-session)* Switch inside a merged run past a failed call without losing the run's earlier text ([#4402](#4402))
- *(build)* Drop atuin's implicit arboard feature so nix builds again ([#610](#610))
- *(daemon)* Recover ai sessions in the background at boot ([#4293](#4293))
- *(daemon)* Pick up ai.capture_sessions changes without a restart ([#4362](#4362))
- *(daemon)* Run the daemonized daemon from / ([#4358](#4358))
- *(daemon)* Write the record store before history.db when a command finishes ([#4361](#4361))
- *(daemon)* Time out shell hook calls to an unresponsive daemon ([#4360](#4360))
- *(daemon)* Only restart a daemon older than the client ([#4359](#4359))
- *(doctor)* Fix sqlite error in `atuin doctor` ([#4354](#4354))
- *(hook)* Write absolute executable path to agent configs ([#4044](#4044))
- *(octavo)* Strip NUL bytes from history before uploading it
- *(octavo)* Drop dead hub connections with http2 keepalive
- *(pty-proxy)* Fix forwarding of output to parent terminal under load ([#4217](#4217))
- *(pty-proxy)* Fix PTY proxy initialization in fish ([#4224](#4224))
- *(pty-proxy)* Preserve login shell status in init script ([#4271](#4271))
- *(pty-proxy)* Periodically touch the socket to prevent automatic deletion ([#4366](#4366))
- *(vendor)* Find the repository root from the script's location
- Timezone awareness during atuin search ([#3762](#3762))
- Handling of OSC 133 sequences in prompt ([#4221](#4221))
- Don't (re)start daemon on history end ([#4229](#4229))
- Fall back to saving history locally when the daemon can't be started ([#4234](#4234))
- Use github release proxy ([#4297](#4297))
- Improve "output capture disabled" message ([#4296](#4296))
- Literal out of range for usize ([#4295](#4295))
- Meaning of today in mcp since ([#4300](#4300))


### Documentation

- *(ai)* Describe continuing in another agent as carrying tool calls over ([#4403](#4403))
- Limit installation methods to those that install the latest version ([#4219](#4219))
- Remove information about dotfiles in support matrix ([#4298](#4298))


### Features

- *(ai)* List, read and richer search MCP tools for sessions ([#4280](#4280))
- *(ai)* Add `atuin ai resume`, a picker over agent sessions ([#4311](#4311))
- *(ai)* Resume sessions recorded on other machines ([#4315](#4315))
- *(ai)* Give every AI session a fixed UUIDv7 atuin id ([#4326](#4326))
- *(ai)* Show parent, root and children links as atuin ids ([#4337](#4337))
- *(ai)* Continue a session in another agent from `atuin ai resume` ([#4325](#4325))
- *(ai)* Fork a session from `atuin ai resume` ([#4340](#4340))
- *(ai)* Work out a session's heads on demand, with Codex rows linked to the row before ([#4341](#4341))
- *(ai)* Catch sessions up with sync on resume, and fork from another machine's branch ([#4345](#4345))
- *(ai)* Switch a diverged session's copy to another machine's branch on resume ([#4350](#4350))
- *(ai)* Capture tool calls as well as messages ([#4352](#4352))
- *(ai)* Capture and restore the diffs of agents' edits ([#4369](#4369))
- *(ai)* Filter session reads by query and role, rank substring history matches first ([#4367](#4367))
- *(ai)* Add `atuin resume` as short for `atuin ai resume` ([#4382](#4382))
- *(ai)* List forks as a tree under their root in the session picker, mark running forks, and name the provider in Codex rollouts ([#4399](#4399))
- *(ai)* Show the atuin id as ID and the harness's own as Harness ID in the resume picker's Inspect tab ([#4401](#4401))
- *(ai)* Session picker reader pane, two-line rows grouped by day, visible scopes, per-session actions and an in-list resume chooser ([#4383](#4383))
- *(ai)* Show atuin's MCP tool calls as 🐢 atuin <tool> in the session reader ([&#35;4411](#4411))
- *(ai-session)* Faster sidecar rebuilds, session grouping, and one search API ([&#35;4302](#4302))
- *(ai-session)* Fast-forward a behind transcript to its synced head ([&#35;4344](#4344))
- *(ai-session)* Search by message role and without subagents, and know a stateless MCP caller's own session ([&#35;4385](#4385))
- *(ai-session)* Show short session ids, and select text with the mouse in the resume picker ([&#35;4404](#4404))
- *(ai-session)* Capture sessions from when it's turned on, and atuin config enable ai-sessions ([&#35;4389](#4389))
- *(api-client)* Add the atuin.api.v1 protos ([&#35;4312](#4312))
- *(common)* Add BlockingPool, a cap on concurrent blocking work ([&#35;4242](#4242))
- *(daemon)* Store daemon socket path in pidfile ([&#35;4253](#4253))
- *(i18n)* Localize user-facing text with Fluent ([&#35;4233](#4233))
- *(octavo)* Move the hub protos into atuin-octavo and generate its client
- *(octavo)* Upload captured command output
- *(output)* Add command_filter to drop output but keep history ([&#35;4268](#4268))
- *(pty-proxy)* Switch from OSC 133 to Atuin-specific sequence ([&#35;4291](#4291))
- *(search)* Add accept-cd and return-cd keymap actions ([&#35;4319](#4319))
- *(secrets)* Add several new known secrets formats ([&#35;4364](#4364))
- Read login password and key from env or stdin ([&#35;3498](#3498))
- Enable workspaces by default ([&#35;1838](#1838))
- Capture ai agent sessions into the store ([&#35;4212](#4212))
- Automatically open login link ([&#35;4351](#4351))
- Send atuin register's login link to the hub's signup page ([&#35;4353](#4353))
- Config disable ([&#35;4349](#4349))
- Unify all data in `~/.atuin` (customizable with `ATUIN_HOME`) ([&#35;4380](#4380))


### Miscellaneous Tasks

- *(buildkite)* Fix the installer hang and address #4274 review ([&#35;4275](#4275))
- *(buildkite)* Build tests once, split test jobs by timing ([&#35;4278](#4278))
- *(nix)* Build with crane and cache to atuin.cachix.org ([&#35;4348](#4348))
- *(nix)* Set USER so cachix runs in the CI container
- *(nix)* Use stdenv.hostPlatform.isDarwin in atuin.nix ([&#35;4391](#4391))
- *(octavo)* Scope the buf proto rg ignore to its directory
- Sccache for codegen jobs, rust-cache for the rest ([&#35;4214](#4214))
- Fix Clippy warning about `time::Duration` ([&#35;4231](#4231))
- Rename `Backoff::Linear` to `Backoff::Constant` ([&#35;4238](#4238))
- Reduce record store disk usage ([&#35;4249](#4249))
- Run CI on Buildkite ([&#35;4274](#4274))
- Remove the GitHub Actions workflows Buildkite replaced ([&#35;4277](#4277))
- Use internal session ids ([&#35;4279](#4279))
- Tell hub when main moves
- Tiny bit of CONTRIBUTING.md formatting ([&#35;4317](#4317))
- Land pull requests with /merge
- One check per pipeline, and a merge status for /merge
- Skip CI on the update /merge makes, and keep other repos' links as text
- Keep lockfiles, vendored code and fixtures out of rg results
- Gate each deploy on its own checks and skip unchanged subtrees


### Performance

- *(ai)* Make AI session rebuilds fast ([&#35;4343](#4343))
- *(ai-session)* Import existing sessions in batches, off the daemon's runtime ([&#35;4408](#4408))
- *(daemon)* Load the search index with a linear history scan ([&#35;4347](#4347))
- *(dotfiles)* Remove defunct bind feature detection for fish ([&#35;2532](#2532))
- Build the bundled SQLite with SQLITE_DEFAULT_MEMSTATUS=0 ([&#35;4342](#4342))


### Refactor

- *(ai-session)* Squash sidecar migrations, intern repeated message text, drop session transcript ([&#35;4371](#4371))
- *(ai-session)* Drop compatibility with records, checkpoints and daemons from earlier builds ([&#35;4373](#4373))
- *(deps)* Bump vmactions/omnios-vm from 1.3.4 to 1.3.6 ([&#35;4029](#4029))
- *(deps)* Bump debian from bookworm-20260713-slim to bookworm-20260918-slim ([&#35;4025](#4025))
- *(deps)* Bump lukemathwalker/cargo-chef from `e406ad0` to `9a2089c` ([&#35;4026](#4026))
- *(deps)* Bump urllib3 from 2.7.0 to 2.8.0 in /docs in the uv group across 1 directory ([&#35;4313](#4313))
- *(deps)* Bump xxhash-rust from 0.8.15 to 0.8.16 in the cargo group across 1 directory ([&#35;4322](#4322))
- *(deps)* Bump tokio-util from 0.7.18 to 0.7.19 ([&#35;4289](#4289))
- *(deps)* Bump rustix from 1.1.4 to 1.1.5 ([&#35;4288](#4288))
- *(deps)* Bump colored from 2.2.0 to 3.1.1 ([&#35;4339](#4339))
- *(deps)* Bump async-trait from 0.1.89 to 0.1.92 ([&#35;4338](#4338))
- *(deps)* Bump mozilla-actions/sccache-action from 0.0.9 to 0.0.11 ([&#35;4287](#4287))
- *(deps)* Bump thiserror from 2.0.19 to 2.0.21 ([&#35;4284](#4284))
- *(deps)* Bump libc from 0.2.186 to 0.2.190 ([&#35;4397](#4397))
- *(deps)* Bump lukemathwalker/cargo-chef from `9a2089c` to `b4b459d` ([&#35;4394](#4394))
- *(deps)* Bump debian from bookworm-20260918-slim to bookworm-20261005-slim ([&#35;4393](#4393))
- Hold secrets in secrecy types ([&#35;4237](#4237))
- Improve `Shell::default_shell`; fixes hanging test under Nextest ([&#35;4267](#4267))
- Switch from `directories` to `dirs` ([&#35;4306](#4306))
- Clean up atuin-common crate features ([&#35;4323](#4323))
- Add `PathBufExt::joined` to avoid unnecessary cloning of `PathBuf`s ([&#35;4409](#4409))


### Testing

- *(ai-session)* E2e tests for capture, sync and resume; scan new dirs in the tree watcher ([&#35;4368](#4368))
- Deflake the e2e shell tests
atuin-bot pushed a commit that referenced this pull request Oct 15, 2026
### Bug Fixes

- *(ai)* Saturate file-tracker mtimes and rebuild on new migrations ([&#35;4250](#4250))
- *(ai)* Start the daemon before ai commands if autostart is enabled ([&#35;4269](#4269))
- *(ai)* Add MCP list cache fields and a since filter for session list ([&#35;4294](#4294))
- *(ai)* Only look up repos for this host's sessions in the resume picker ([&#35;4400](#4400))
- *(ai)* Fit the resume picker's title to the version so a prerelease isn't cut off ([&#35;4406](#4406))
- *(ai)* Correct large-file read guidance ([&#35;4355](#4355))
- *(ai-session)* Read an unknown parent kind as None ([&#35;4301](#4301))
- *(ai-session)* Count content-derived calls once per session lineage ([&#35;4314](#4314))
- *(ai-session)* Keep compacted Claude and Pi sessions whole when restored from sync ([&#35;4357](#4357))
- *(ai-session)* Link a Claude compaction that kept messages to the line before it ([&#35;4370](#4370))
- *(ai-session)* Harden capture, sync and resume across agents ([&#35;4387](#4387))
- *(ai-session)* Fix opencode 1.x resume capture, A→B→A catch-up, synced tail, and picker tty, keys and idle CPU ([&#35;4398](#4398))
- *(ai-session)* Switch inside a merged run past a failed call without losing the run's earlier text ([&#35;4402](#4402))
- *(build)* Drop atuin's implicit arboard feature so nix builds again ([&#35;610](#610))
- *(config)* Don't let a default ~/.atuin/config.toml hide the legacy config, and warn when one does ([&#35;4420](#4420))
- *(config)* Avoid shadowing data dir, fix gaps in avoidance logic ([&#35;4421](#4421))
- *(daemon)* Recover ai sessions in the background at boot ([&#35;4293](#4293))
- *(daemon)* Pick up ai.capture_sessions changes without a restart ([&#35;4362](#4362))
- *(daemon)* Run the daemonized daemon from / ([&#35;4358](#4358))
- *(daemon)* Write the record store before history.db when a command finishes ([&#35;4361](#4361))
- *(daemon)* Time out shell hook calls to an unresponsive daemon ([&#35;4360](#4360))
- *(daemon)* Only restart a daemon older than the client ([&#35;4359](#4359))
- *(doctor)* Fix sqlite error in `atuin doctor` ([&#35;4354](#4354))
- *(hook)* Write absolute executable path to agent configs ([&#35;4044](#4044))
- *(pty-proxy)* Fix forwarding of output to parent terminal under load ([&#35;4217](#4217))
- *(pty-proxy)* Fix PTY proxy initialization in fish ([&#35;4224](#4224))
- *(pty-proxy)* Preserve login shell status in init script ([&#35;4271](#4271))
- *(pty-proxy)* Periodically touch the socket to prevent automatic deletion ([&#35;4366](#4366))
- *(scripts)* Correct shebang prefix handling ([&#35;4416](#4416))
- *(sync)* Give sync errors their full cause and HTTP status, and flag a non-Atuin `sync_address` ([&#35;4423](#4423))
- *(systemd)* Stop pulling in systemd-networkd-wait-online ([&#35;4415](#4415))
- *(vendor)* Find the repository root from the script's location
- Timezone awareness during atuin search ([&#35;3762](#3762))
- Handling of OSC 133 sequences in prompt ([&#35;4221](#4221))
- Don't (re)start daemon on history end ([&#35;4229](#4229))
- Fall back to saving history locally when the daemon can't be started ([&#35;4234](#4234))
- Use github release proxy ([&#35;4297](#4297))
- Improve "output capture disabled" message ([&#35;4296](#4296))
- Literal out of range for usize ([&#35;4295](#4295))
- Meaning of today in mcp since ([&#35;4300](#4300))
- Atuin update --prerelease ([&#35;4429](#4429))

### Documentation

- *(ai)* Describe continuing in another agent as carrying tool calls over ([&#35;4403](#4403))
- *(zinit)* Fix bpick pattern, add wait/lucid ices ([&#35;3492](#3492))
- Limit installation methods to those that install the latest version ([&#35;4219](#4219))
- Remove information about dotfiles in support matrix ([&#35;4298](#4298))

### Features

- *(ai)* List, read and richer search MCP tools for sessions ([&#35;4280](#4280))
- *(ai)* Add `atuin ai resume`, a picker over agent sessions ([&#35;4311](#4311))
- *(ai)* Resume sessions recorded on other machines ([&#35;4315](#4315))
- *(ai)* Give every AI session a fixed UUIDv7 atuin id ([&#35;4326](#4326))
- *(ai)* Show parent, root and children links as atuin ids ([&#35;4337](#4337))
- *(ai)* Continue a session in another agent from `atuin ai resume` ([&#35;4325](#4325))
- *(ai)* Fork a session from `atuin ai resume` ([&#35;4340](#4340))
- *(ai)* Work out a session's heads on demand, with Codex rows linked to the row before ([&#35;4341](#4341))
- *(ai)* Catch sessions up with sync on resume, and fork from another machine's branch ([&#35;4345](#4345))
- *(ai)* Switch a diverged session's copy to another machine's branch on resume ([&#35;4350](#4350))
- *(ai)* Capture tool calls as well as messages ([&#35;4352](#4352))
- *(ai)* Capture and restore the diffs of agents' edits ([&#35;4369](#4369))
- *(ai)* Filter session reads by query and role, rank substring history matches first ([&#35;4367](#4367))
- *(ai)* Add `atuin resume` as short for `atuin ai resume` ([&#35;4382](#4382))
- *(ai)* List forks as a tree under their root in the session picker, mark running forks, and name the provider in Codex rollouts ([&#35;4399](#4399))
- *(ai)* Show the atuin id as ID and the harness's own as Harness ID in the resume picker's Inspect tab ([&#35;4401](#4401))
- *(ai)* Session picker reader pane, two-line rows grouped by day, visible scopes, per-session actions and an in-list resume chooser ([&#35;4383](#4383))
- *(ai)* Show atuin's MCP tool calls as 🐢 atuin <tool> in the session reader ([&#35;4411](#4411))
- *(ai)* Rename AI sessions to threads: atuin threads, [threads] and threads.db ([&#35;4418](#4418))
- *(ai-session)* Faster sidecar rebuilds, session grouping, and one search API ([&#35;4302](#4302))
- *(ai-session)* Fast-forward a behind transcript to its synced head ([&#35;4344](#4344))
- *(ai-session)* Search by message role and without subagents, and know a stateless MCP caller's own session ([&#35;4385](#4385))
- *(ai-session)* Show short session ids, and select text with the mouse in the resume picker ([&#35;4404](#4404))
- *(ai-session)* Capture sessions from when it's turned on, and atuin config enable ai-sessions ([&#35;4389](#4389))
- *(api-client)* Add the atuin.api.v1 protos ([&#35;4312](#4312))
- *(common)* Add BlockingPool, a cap on concurrent blocking work ([&#35;4242](#4242))
- *(daemon)* Store daemon socket path in pidfile ([&#35;4253](#4253))
- *(i18n)* Localize user-facing text with Fluent ([&#35;4233](#4233))
- *(mcp)* Add `atuin mcp install <agent>` and per-agent setup docs ([&#35;4417](#4417))
- *(output)* Add command_filter to drop output but keep history ([&#35;4268](#4268))
- *(pty-proxy)* Switch from OSC 133 to Atuin-specific sequence ([&#35;4291](#4291))
- *(search)* Add accept-cd and return-cd keymap actions ([&#35;4319](#4319))
- *(secrets)* Add several new known secrets formats ([&#35;4364](#4364))
- *(server)* Read the database password from db_password_file ([&#35;4425](#4425))
- Read login password and key from env or stdin ([&#35;3498](#3498))
- Enable workspaces by default ([&#35;1838](#1838))
- Capture ai agent sessions into the store ([&#35;4212](#4212))
- Automatically open login link ([&#35;4351](#4351))
- Send atuin register's login link to the hub's signup page ([&#35;4353](#4353))
- Config disable ([&#35;4349](#4349))
- Unify all data in `~/.atuin` (customizable with `ATUIN_HOME`) ([&#35;4380](#4380))

### Miscellaneous Tasks

- *(buildkite)* Fix the installer hang and address #4274 review ([&#35;4275](#4275))
- *(buildkite)* Build tests once, split test jobs by timing ([&#35;4278](#4278))
- *(nix)* Build with crane and cache to atuin.cachix.org ([&#35;4348](#4348))
- *(nix)* Set USER so cachix runs in the CI container
- *(nix)* Use stdenv.hostPlatform.isDarwin in atuin.nix ([&#35;4391](#4391))
- Sccache for codegen jobs, rust-cache for the rest ([&#35;4214](#4214))
- Fix Clippy warning about `time::Duration` ([&#35;4231](#4231))
- Rename `Backoff::Linear` to `Backoff::Constant` ([&#35;4238](#4238))
- Reduce record store disk usage ([&#35;4249](#4249))
- Run CI on Buildkite ([&#35;4274](#4274))
- Remove the GitHub Actions workflows Buildkite replaced ([&#35;4277](#4277))
- Use internal session ids ([&#35;4279](#4279))
- Tell hub when main moves
- Tiny bit of CONTRIBUTING.md formatting ([&#35;4317](#4317))
- Land pull requests with /merge
- One check per pipeline, and a merge status for /merge
- Skip CI on the update /merge makes, and keep other repos' links as text
- Keep lockfiles, vendored code and fixtures out of rg results
- Gate each deploy on its own checks and skip unchanged subtrees

### Performance

- *(ai)* Make AI session rebuilds fast ([&#35;4343](#4343))
- *(ai-session)* Import existing sessions in batches, off the daemon's runtime ([&#35;4408](#4408))
- *(daemon)* Load the search index with a linear history scan ([&#35;4347](#4347))
- *(dotfiles)* Remove defunct bind feature detection for fish ([&#35;2532](#2532))
- Build the bundled SQLite with SQLITE_DEFAULT_MEMSTATUS=0 ([&#35;4342](#4342))
- Share Settings through Arc instead of deep-cloning it ([&#35;4410](#4410))

### Refactor

- *(ai-session)* Squash sidecar migrations, intern repeated message text, drop session transcript ([&#35;4371](#4371))
- *(ai-session)* Drop compatibility with records, checkpoints and daemons from earlier builds ([&#35;4373](#4373))
- *(deps)* Bump vmactions/omnios-vm from 1.3.4 to 1.3.6 ([&#35;4029](#4029))
- *(deps)* Bump debian from bookworm-20260713-slim to bookworm-20260918-slim ([&#35;4025](#4025))
- *(deps)* Bump lukemathwalker/cargo-chef from `e406ad0` to `9a2089c` ([&#35;4026](#4026))
- *(deps)* Bump urllib3 from 2.7.0 to 2.8.0 in /docs in the uv group across 1 directory ([&#35;4313](#4313))
- *(deps)* Bump xxhash-rust from 0.8.15 to 0.8.16 in the cargo group across 1 directory ([&#35;4322](#4322))
- *(deps)* Bump tokio-util from 0.7.18 to 0.7.19 ([&#35;4289](#4289))
- *(deps)* Bump rustix from 1.1.4 to 1.1.5 ([&#35;4288](#4288))
- *(deps)* Bump colored from 2.2.0 to 3.1.1 ([&#35;4339](#4339))
- *(deps)* Bump async-trait from 0.1.89 to 0.1.92 ([&#35;4338](#4338))
- *(deps)* Bump mozilla-actions/sccache-action from 0.0.9 to 0.0.11 ([&#35;4287](#4287))
- *(deps)* Bump thiserror from 2.0.19 to 2.0.21 ([&#35;4284](#4284))
- *(deps)* Bump libc from 0.2.186 to 0.2.190 ([&#35;4397](#4397))
- *(deps)* Bump lukemathwalker/cargo-chef from `9a2089c` to `b4b459d` ([&#35;4394](#4394))
- *(deps)* Bump debian from bookworm-20260918-slim to bookworm-20261005-slim ([&#35;4393](#4393))
- Hold secrets in secrecy types ([&#35;4237](#4237))
- Improve `Shell::default_shell`; fixes hanging test under Nextest ([&#35;4267](#4267))
- Switch from `directories` to `dirs` ([&#35;4306](#4306))
- Clean up atuin-common crate features ([&#35;4323](#4323))
- Add `PathBufExt::joined` to avoid unnecessary cloning of `PathBuf`s ([&#35;4409](#4409))

### Testing

- *(ai-session)* E2e tests for capture, sync and resume; scan new dirs in the tree watcher ([&#35;4368](#4368))
- Deflake the e2e shell tests
josephcourtney pushed a commit to josephcourtney/atuin that referenced this pull request Oct 16, 2026
josephcourtney pushed a commit to josephcourtney/atuin that referenced this pull request Oct 16, 2026
### Bug Fixes

- *(ai)* Saturate file-tracker mtimes and rebuild on new migrations ([&atuinsh#35;4250](atuinsh#4250))
- *(ai)* Start the daemon before ai commands if autostart is enabled ([&atuinsh#35;4269](atuinsh#4269))
- *(ai)* Add MCP list cache fields and a since filter for session list ([&atuinsh#35;4294](atuinsh#4294))
- *(ai)* Only look up repos for this host's sessions in the resume picker ([&atuinsh#35;4400](atuinsh#4400))
- *(ai-session)* Read an unknown parent kind as None ([&atuinsh#35;4301](atuinsh#4301))
- *(ai-session)* Count content-derived calls once per session lineage ([&atuinsh#35;4314](atuinsh#4314))
- *(ai-session)* Keep compacted Claude and Pi sessions whole when restored from sync ([&atuinsh#35;4357](atuinsh#4357))
- *(ai-session)* Link a Claude compaction that kept messages to the line before it ([&atuinsh#35;4370](atuinsh#4370))
- *(ai-session)* Harden capture, sync and resume across agents ([&atuinsh#35;4387](atuinsh#4387))
- *(ai-session)* Fix opencode 1.x resume capture, A→B→A catch-up, synced tail, and picker tty, keys and idle CPU ([&atuinsh#35;4398](atuinsh#4398))
- *(ai-session)* Switch inside a merged run past a failed call without losing the run's earlier text ([&atuinsh#35;4402](atuinsh#4402))
- *(daemon)* Recover ai sessions in the background at boot ([&atuinsh#35;4293](atuinsh#4293))
- *(daemon)* Pick up ai.capture_sessions changes without a restart ([&atuinsh#35;4362](atuinsh#4362))
- *(daemon)* Run the daemonized daemon from / ([&atuinsh#35;4358](atuinsh#4358))
- *(daemon)* Write the record store before history.db when a command finishes ([&atuinsh#35;4361](atuinsh#4361))
- *(daemon)* Time out shell hook calls to an unresponsive daemon ([&atuinsh#35;4360](atuinsh#4360))
- *(daemon)* Only restart a daemon older than the client ([&atuinsh#35;4359](atuinsh#4359))
- *(doctor)* Fix sqlite error in `atuin doctor` ([&atuinsh#35;4354](atuinsh#4354))
- *(hook)* Write absolute executable path to agent configs ([&atuinsh#35;4044](atuinsh#4044))
- *(octavo)* Strip NUL bytes from history before uploading it
- *(octavo)* Drop dead hub connections with http2 keepalive
- *(pty-proxy)* Fix forwarding of output to parent terminal under load ([&atuinsh#35;4217](atuinsh#4217))
- *(pty-proxy)* Fix PTY proxy initialization in fish ([&atuinsh#35;4224](atuinsh#4224))
- *(pty-proxy)* Preserve login shell status in init script ([&atuinsh#35;4271](atuinsh#4271))
- *(pty-proxy)* Periodically touch the socket to prevent automatic deletion ([&atuinsh#35;4366](atuinsh#4366))
- *(vendor)* Find the repository root from the script's location
- Timezone awareness during atuin search ([&atuinsh#35;3762](atuinsh#3762))
- Handling of OSC 133 sequences in prompt ([&atuinsh#35;4221](atuinsh#4221))
- Don't (re)start daemon on history end ([&atuinsh#35;4229](atuinsh#4229))
- Fall back to saving history locally when the daemon can't be started ([&atuinsh#35;4234](atuinsh#4234))
- Use github release proxy ([&atuinsh#35;4297](atuinsh#4297))
- Improve "output capture disabled" message ([&atuinsh#35;4296](atuinsh#4296))
- Literal out of range for usize ([&atuinsh#35;4295](atuinsh#4295))
- Meaning of today in mcp since ([&atuinsh#35;4300](atuinsh#4300))

### Documentation

- *(ai)* Describe continuing in another agent as carrying tool calls over ([&atuinsh#35;4403](atuinsh#4403))
- Limit installation methods to those that install the latest version ([&atuinsh#35;4219](atuinsh#4219))
- Remove information about dotfiles in support matrix ([&atuinsh#35;4298](atuinsh#4298))

### Features

- *(ai)* List, read and richer search MCP tools for sessions ([&atuinsh#35;4280](atuinsh#4280))
- *(ai)* Add `atuin ai resume`, a picker over agent sessions ([&atuinsh#35;4311](atuinsh#4311))
- *(ai)* Resume sessions recorded on other machines ([&atuinsh#35;4315](atuinsh#4315))
- *(ai)* Give every AI session a fixed UUIDv7 atuin id ([&atuinsh#35;4326](atuinsh#4326))
- *(ai)* Show parent, root and children links as atuin ids ([&atuinsh#35;4337](atuinsh#4337))
- *(ai)* Continue a session in another agent from `atuin ai resume` ([&atuinsh#35;4325](atuinsh#4325))
- *(ai)* Fork a session from `atuin ai resume` ([&atuinsh#35;4340](atuinsh#4340))
- *(ai)* Work out a session's heads on demand, with Codex rows linked to the row before ([&atuinsh#35;4341](atuinsh#4341))
- *(ai)* Catch sessions up with sync on resume, and fork from another machine's branch ([&atuinsh#35;4345](atuinsh#4345))
- *(ai)* Switch a diverged session's copy to another machine's branch on resume ([&atuinsh#35;4350](atuinsh#4350))
- *(ai)* Capture tool calls as well as messages ([&atuinsh#35;4352](atuinsh#4352))
- *(ai)* Capture and restore the diffs of agents' edits ([&atuinsh#35;4369](atuinsh#4369))
- *(ai)* Filter session reads by query and role, rank substring history matches first ([&atuinsh#35;4367](atuinsh#4367))
- *(ai)* Add `atuin resume` as short for `atuin ai resume` ([&atuinsh#35;4382](atuinsh#4382))
- *(ai)* List forks as a tree under their root in the session picker, mark running forks, and name the provider in Codex rollouts ([&atuinsh#35;4399](atuinsh#4399))
- *(ai)* Show the atuin id as ID and the harness's own as Harness ID in the resume picker's Inspect tab ([&atuinsh#35;4401](atuinsh#4401))
- *(ai-session)* Faster sidecar rebuilds, session grouping, and one search API ([&atuinsh#35;4302](atuinsh#4302))
- *(ai-session)* Fast-forward a behind transcript to its synced head ([&atuinsh#35;4344](atuinsh#4344))
- *(ai-session)* Search by message role and without subagents, and know a stateless MCP caller's own session ([&atuinsh#35;4385](atuinsh#4385))
- *(ai-session)* Show short session ids, and select text with the mouse in the resume picker ([&atuinsh#35;4404](atuinsh#4404))
- *(ai-session)* Capture sessions from when it's turned on, and atuin config enable ai-sessions ([&atuinsh#35;4389](atuinsh#4389))
- *(api-client)* Add the atuin.api.v1 protos ([&atuinsh#35;4312](atuinsh#4312))
- *(common)* Add BlockingPool, a cap on concurrent blocking work ([&atuinsh#35;4242](atuinsh#4242))
- *(daemon)* Store daemon socket path in pidfile ([&atuinsh#35;4253](atuinsh#4253))
- *(i18n)* Localize user-facing text with Fluent ([&atuinsh#35;4233](atuinsh#4233))
- *(octavo)* Move the hub protos into atuin-octavo and generate its client
- *(octavo)* Upload captured command output
- *(output)* Add command_filter to drop output but keep history ([&atuinsh#35;4268](atuinsh#4268))
- *(pty-proxy)* Switch from OSC 133 to Atuin-specific sequence ([&atuinsh#35;4291](atuinsh#4291))
- *(search)* Add accept-cd and return-cd keymap actions ([&atuinsh#35;4319](atuinsh#4319))
- *(secrets)* Add several new known secrets formats ([&atuinsh#35;4364](atuinsh#4364))
- Read login password and key from env or stdin ([&atuinsh#35;3498](atuinsh#3498))
- Enable workspaces by default ([&atuinsh#35;1838](atuinsh#1838))
- Capture ai agent sessions into the store ([&atuinsh#35;4212](atuinsh#4212))
- Automatically open login link ([&atuinsh#35;4351](atuinsh#4351))
- Send atuin register's login link to the hub's signup page ([&atuinsh#35;4353](atuinsh#4353))
- Config disable ([&atuinsh#35;4349](atuinsh#4349))

### Miscellaneous Tasks

- *(buildkite)* Fix the installer hang and address atuinsh#4274 review ([&atuinsh#35;4275](atuinsh#4275))
- *(buildkite)* Build tests once, split test jobs by timing ([&atuinsh#35;4278](atuinsh#4278))
- *(nix)* Build with crane and cache to atuin.cachix.org ([&atuinsh#35;4348](atuinsh#4348))
- *(nix)* Set USER so cachix runs in the CI container
- *(nix)* Use stdenv.hostPlatform.isDarwin in atuin.nix ([&atuinsh#35;4391](atuinsh#4391))
- *(octavo)* Scope the buf proto rg ignore to its directory
- Sccache for codegen jobs, rust-cache for the rest ([&atuinsh#35;4214](atuinsh#4214))
- Fix Clippy warning about `time::Duration` ([&atuinsh#35;4231](atuinsh#4231))
- Rename `Backoff::Linear` to `Backoff::Constant` ([&atuinsh#35;4238](atuinsh#4238))
- Reduce record store disk usage ([&atuinsh#35;4249](atuinsh#4249))
- Run CI on Buildkite ([&atuinsh#35;4274](atuinsh#4274))
- Remove the GitHub Actions workflows Buildkite replaced ([&atuinsh#35;4277](atuinsh#4277))
- Use internal session ids ([&atuinsh#35;4279](atuinsh#4279))
- Tell hub when main moves
- Tiny bit of CONTRIBUTING.md formatting ([&atuinsh#35;4317](atuinsh#4317))
- Land pull requests with /merge
- One check per pipeline, and a merge status for /merge
- Skip CI on the update /merge makes, and keep other repos' links as text
- Keep lockfiles, vendored code and fixtures out of rg results
- Gate each deploy on its own checks and skip unchanged subtrees

### Performance

- *(ai)* Make AI session rebuilds fast ([&atuinsh#35;4343](atuinsh#4343))
- *(daemon)* Load the search index with a linear history scan ([&atuinsh#35;4347](atuinsh#4347))
- *(dotfiles)* Remove defunct bind feature detection for fish ([&atuinsh#35;2532](atuinsh#2532))
- Build the bundled SQLite with SQLITE_DEFAULT_MEMSTATUS=0 ([&atuinsh#35;4342](atuinsh#4342))

### Refactor

- *(ai-session)* Squash sidecar migrations, intern repeated message text, drop session transcript ([&atuinsh#35;4371](atuinsh#4371))
- *(ai-session)* Drop compatibility with records, checkpoints and daemons from earlier builds ([&atuinsh#35;4373](atuinsh#4373))
- *(deps)* Bump vmactions/omnios-vm from 1.3.4 to 1.3.6 ([&atuinsh#35;4029](atuinsh#4029))
- *(deps)* Bump debian from bookworm-20260713-slim to bookworm-20260918-slim ([&atuinsh#35;4025](atuinsh#4025))
- *(deps)* Bump lukemathwalker/cargo-chef from `e406ad0` to `9a2089c` ([&atuinsh#35;4026](atuinsh#4026))
- *(deps)* Bump urllib3 from 2.7.0 to 2.8.0 in /docs in the uv group across 1 directory ([&atuinsh#35;4313](atuinsh#4313))
- *(deps)* Bump xxhash-rust from 0.8.15 to 0.8.16 in the cargo group across 1 directory ([&atuinsh#35;4322](atuinsh#4322))
- *(deps)* Bump tokio-util from 0.7.18 to 0.7.19 ([&atuinsh#35;4289](atuinsh#4289))
- *(deps)* Bump rustix from 1.1.4 to 1.1.5 ([&atuinsh#35;4288](atuinsh#4288))
- *(deps)* Bump colored from 2.2.0 to 3.1.1 ([&atuinsh#35;4339](atuinsh#4339))
- *(deps)* Bump async-trait from 0.1.89 to 0.1.92 ([&atuinsh#35;4338](atuinsh#4338))
- *(deps)* Bump mozilla-actions/sccache-action from 0.0.9 to 0.0.11 ([&atuinsh#35;4287](atuinsh#4287))
- *(deps)* Bump thiserror from 2.0.19 to 2.0.21 ([&atuinsh#35;4284](atuinsh#4284))
- Hold secrets in secrecy types ([&atuinsh#35;4237](atuinsh#4237))
- Improve `Shell::default_shell`; fixes hanging test under Nextest ([&atuinsh#35;4267](atuinsh#4267))
- Switch from `directories` to `dirs` ([&atuinsh#35;4306](atuinsh#4306))
- Clean up atuin-common crate features ([&atuinsh#35;4323](atuinsh#4323))

### Testing

- *(ai-session)* E2e tests for capture, sync and resume; scan new dirs in the tree watcher ([&atuinsh#35;4368](atuinsh#4368))
- Deflake the e2e shell tests
josephcourtney pushed a commit to josephcourtney/atuin that referenced this pull request Oct 16, 2026
### Bug Fixes

- *(ai)* Saturate file-tracker mtimes and rebuild on new migrations ([&atuinsh#35;4250](atuinsh#4250))
- *(ai)* Start the daemon before ai commands if autostart is enabled ([&atuinsh#35;4269](atuinsh#4269))
- *(ai)* Add MCP list cache fields and a since filter for session list ([&atuinsh#35;4294](atuinsh#4294))
- *(ai)* Only look up repos for this host's sessions in the resume picker ([&atuinsh#35;4400](atuinsh#4400))
- *(ai)* Fit the resume picker's title to the version so a prerelease isn't cut off ([&atuinsh#35;4406](atuinsh#4406))
- *(ai-session)* Read an unknown parent kind as None ([&atuinsh#35;4301](atuinsh#4301))
- *(ai-session)* Count content-derived calls once per session lineage ([&atuinsh#35;4314](atuinsh#4314))
- *(ai-session)* Keep compacted Claude and Pi sessions whole when restored from sync ([&atuinsh#35;4357](atuinsh#4357))
- *(ai-session)* Link a Claude compaction that kept messages to the line before it ([&atuinsh#35;4370](atuinsh#4370))
- *(ai-session)* Harden capture, sync and resume across agents ([&atuinsh#35;4387](atuinsh#4387))
- *(ai-session)* Fix opencode 1.x resume capture, A→B→A catch-up, synced tail, and picker tty, keys and idle CPU ([&atuinsh#35;4398](atuinsh#4398))
- *(ai-session)* Switch inside a merged run past a failed call without losing the run's earlier text ([&atuinsh#35;4402](atuinsh#4402))
- *(build)* Drop atuin's implicit arboard feature so nix builds again ([&atuinsh#35;610](atuinsh#610))
- *(daemon)* Recover ai sessions in the background at boot ([&atuinsh#35;4293](atuinsh#4293))
- *(daemon)* Pick up ai.capture_sessions changes without a restart ([&atuinsh#35;4362](atuinsh#4362))
- *(daemon)* Run the daemonized daemon from / ([&atuinsh#35;4358](atuinsh#4358))
- *(daemon)* Write the record store before history.db when a command finishes ([&atuinsh#35;4361](atuinsh#4361))
- *(daemon)* Time out shell hook calls to an unresponsive daemon ([&atuinsh#35;4360](atuinsh#4360))
- *(daemon)* Only restart a daemon older than the client ([&atuinsh#35;4359](atuinsh#4359))
- *(doctor)* Fix sqlite error in `atuin doctor` ([&atuinsh#35;4354](atuinsh#4354))
- *(hook)* Write absolute executable path to agent configs ([&atuinsh#35;4044](atuinsh#4044))
- *(octavo)* Strip NUL bytes from history before uploading it
- *(octavo)* Drop dead hub connections with http2 keepalive
- *(pty-proxy)* Fix forwarding of output to parent terminal under load ([&atuinsh#35;4217](atuinsh#4217))
- *(pty-proxy)* Fix PTY proxy initialization in fish ([&atuinsh#35;4224](atuinsh#4224))
- *(pty-proxy)* Preserve login shell status in init script ([&atuinsh#35;4271](atuinsh#4271))
- *(pty-proxy)* Periodically touch the socket to prevent automatic deletion ([&atuinsh#35;4366](atuinsh#4366))
- *(vendor)* Find the repository root from the script's location
- Timezone awareness during atuin search ([&atuinsh#35;3762](atuinsh#3762))
- Handling of OSC 133 sequences in prompt ([&atuinsh#35;4221](atuinsh#4221))
- Don't (re)start daemon on history end ([&atuinsh#35;4229](atuinsh#4229))
- Fall back to saving history locally when the daemon can't be started ([&atuinsh#35;4234](atuinsh#4234))
- Use github release proxy ([&atuinsh#35;4297](atuinsh#4297))
- Improve "output capture disabled" message ([&atuinsh#35;4296](atuinsh#4296))
- Literal out of range for usize ([&atuinsh#35;4295](atuinsh#4295))
- Meaning of today in mcp since ([&atuinsh#35;4300](atuinsh#4300))


### Documentation

- *(ai)* Describe continuing in another agent as carrying tool calls over ([&atuinsh#35;4403](atuinsh#4403))
- Limit installation methods to those that install the latest version ([&atuinsh#35;4219](atuinsh#4219))
- Remove information about dotfiles in support matrix ([&atuinsh#35;4298](atuinsh#4298))


### Features

- *(ai)* List, read and richer search MCP tools for sessions ([&atuinsh#35;4280](atuinsh#4280))
- *(ai)* Add `atuin ai resume`, a picker over agent sessions ([&atuinsh#35;4311](atuinsh#4311))
- *(ai)* Resume sessions recorded on other machines ([&atuinsh#35;4315](atuinsh#4315))
- *(ai)* Give every AI session a fixed UUIDv7 atuin id ([&atuinsh#35;4326](atuinsh#4326))
- *(ai)* Show parent, root and children links as atuin ids ([&atuinsh#35;4337](atuinsh#4337))
- *(ai)* Continue a session in another agent from `atuin ai resume` ([&atuinsh#35;4325](atuinsh#4325))
- *(ai)* Fork a session from `atuin ai resume` ([&atuinsh#35;4340](atuinsh#4340))
- *(ai)* Work out a session's heads on demand, with Codex rows linked to the row before ([&atuinsh#35;4341](atuinsh#4341))
- *(ai)* Catch sessions up with sync on resume, and fork from another machine's branch ([&atuinsh#35;4345](atuinsh#4345))
- *(ai)* Switch a diverged session's copy to another machine's branch on resume ([&atuinsh#35;4350](atuinsh#4350))
- *(ai)* Capture tool calls as well as messages ([&atuinsh#35;4352](atuinsh#4352))
- *(ai)* Capture and restore the diffs of agents' edits ([&atuinsh#35;4369](atuinsh#4369))
- *(ai)* Filter session reads by query and role, rank substring history matches first ([&atuinsh#35;4367](atuinsh#4367))
- *(ai)* Add `atuin resume` as short for `atuin ai resume` ([&atuinsh#35;4382](atuinsh#4382))
- *(ai)* List forks as a tree under their root in the session picker, mark running forks, and name the provider in Codex rollouts ([&atuinsh#35;4399](atuinsh#4399))
- *(ai)* Show the atuin id as ID and the harness's own as Harness ID in the resume picker's Inspect tab ([&atuinsh#35;4401](atuinsh#4401))
- *(ai)* Session picker reader pane, two-line rows grouped by day, visible scopes, per-session actions and an in-list resume chooser ([&atuinsh#35;4383](atuinsh#4383))
- *(ai)* Show atuin's MCP tool calls as 🐢 atuin <tool> in the session reader ([&atuinsh#35;4411](atuinsh#4411))
- *(ai-session)* Faster sidecar rebuilds, session grouping, and one search API ([&atuinsh#35;4302](atuinsh#4302))
- *(ai-session)* Fast-forward a behind transcript to its synced head ([&atuinsh#35;4344](atuinsh#4344))
- *(ai-session)* Search by message role and without subagents, and know a stateless MCP caller's own session ([&atuinsh#35;4385](atuinsh#4385))
- *(ai-session)* Show short session ids, and select text with the mouse in the resume picker ([&atuinsh#35;4404](atuinsh#4404))
- *(ai-session)* Capture sessions from when it's turned on, and atuin config enable ai-sessions ([&atuinsh#35;4389](atuinsh#4389))
- *(api-client)* Add the atuin.api.v1 protos ([&atuinsh#35;4312](atuinsh#4312))
- *(common)* Add BlockingPool, a cap on concurrent blocking work ([&atuinsh#35;4242](atuinsh#4242))
- *(daemon)* Store daemon socket path in pidfile ([&atuinsh#35;4253](atuinsh#4253))
- *(i18n)* Localize user-facing text with Fluent ([&atuinsh#35;4233](atuinsh#4233))
- *(octavo)* Move the hub protos into atuin-octavo and generate its client
- *(octavo)* Upload captured command output
- *(output)* Add command_filter to drop output but keep history ([&atuinsh#35;4268](atuinsh#4268))
- *(pty-proxy)* Switch from OSC 133 to Atuin-specific sequence ([&atuinsh#35;4291](atuinsh#4291))
- *(search)* Add accept-cd and return-cd keymap actions ([&atuinsh#35;4319](atuinsh#4319))
- *(secrets)* Add several new known secrets formats ([&atuinsh#35;4364](atuinsh#4364))
- Read login password and key from env or stdin ([&atuinsh#35;3498](atuinsh#3498))
- Enable workspaces by default ([&atuinsh#35;1838](atuinsh#1838))
- Capture ai agent sessions into the store ([&atuinsh#35;4212](atuinsh#4212))
- Automatically open login link ([&atuinsh#35;4351](atuinsh#4351))
- Send atuin register's login link to the hub's signup page ([&atuinsh#35;4353](atuinsh#4353))
- Config disable ([&atuinsh#35;4349](atuinsh#4349))
- Unify all data in `~/.atuin` (customizable with `ATUIN_HOME`) ([&atuinsh#35;4380](atuinsh#4380))


### Miscellaneous Tasks

- *(buildkite)* Fix the installer hang and address atuinsh#4274 review ([&atuinsh#35;4275](atuinsh#4275))
- *(buildkite)* Build tests once, split test jobs by timing ([&atuinsh#35;4278](atuinsh#4278))
- *(nix)* Build with crane and cache to atuin.cachix.org ([&atuinsh#35;4348](atuinsh#4348))
- *(nix)* Set USER so cachix runs in the CI container
- *(nix)* Use stdenv.hostPlatform.isDarwin in atuin.nix ([&atuinsh#35;4391](atuinsh#4391))
- *(octavo)* Scope the buf proto rg ignore to its directory
- Sccache for codegen jobs, rust-cache for the rest ([&atuinsh#35;4214](atuinsh#4214))
- Fix Clippy warning about `time::Duration` ([&atuinsh#35;4231](atuinsh#4231))
- Rename `Backoff::Linear` to `Backoff::Constant` ([&atuinsh#35;4238](atuinsh#4238))
- Reduce record store disk usage ([&atuinsh#35;4249](atuinsh#4249))
- Run CI on Buildkite ([&atuinsh#35;4274](atuinsh#4274))
- Remove the GitHub Actions workflows Buildkite replaced ([&atuinsh#35;4277](atuinsh#4277))
- Use internal session ids ([&atuinsh#35;4279](atuinsh#4279))
- Tell hub when main moves
- Tiny bit of CONTRIBUTING.md formatting ([&atuinsh#35;4317](atuinsh#4317))
- Land pull requests with /merge
- One check per pipeline, and a merge status for /merge
- Skip CI on the update /merge makes, and keep other repos' links as text
- Keep lockfiles, vendored code and fixtures out of rg results
- Gate each deploy on its own checks and skip unchanged subtrees


### Performance

- *(ai)* Make AI session rebuilds fast ([&atuinsh#35;4343](atuinsh#4343))
- *(ai-session)* Import existing sessions in batches, off the daemon's runtime ([&atuinsh#35;4408](atuinsh#4408))
- *(daemon)* Load the search index with a linear history scan ([&atuinsh#35;4347](atuinsh#4347))
- *(dotfiles)* Remove defunct bind feature detection for fish ([&atuinsh#35;2532](atuinsh#2532))
- Build the bundled SQLite with SQLITE_DEFAULT_MEMSTATUS=0 ([&atuinsh#35;4342](atuinsh#4342))


### Refactor

- *(ai-session)* Squash sidecar migrations, intern repeated message text, drop session transcript ([&atuinsh#35;4371](atuinsh#4371))
- *(ai-session)* Drop compatibility with records, checkpoints and daemons from earlier builds ([&atuinsh#35;4373](atuinsh#4373))
- *(deps)* Bump vmactions/omnios-vm from 1.3.4 to 1.3.6 ([&atuinsh#35;4029](atuinsh#4029))
- *(deps)* Bump debian from bookworm-20260713-slim to bookworm-20260918-slim ([&atuinsh#35;4025](atuinsh#4025))
- *(deps)* Bump lukemathwalker/cargo-chef from `e406ad0` to `9a2089c` ([&atuinsh#35;4026](atuinsh#4026))
- *(deps)* Bump urllib3 from 2.7.0 to 2.8.0 in /docs in the uv group across 1 directory ([&atuinsh#35;4313](atuinsh#4313))
- *(deps)* Bump xxhash-rust from 0.8.15 to 0.8.16 in the cargo group across 1 directory ([&atuinsh#35;4322](atuinsh#4322))
- *(deps)* Bump tokio-util from 0.7.18 to 0.7.19 ([&atuinsh#35;4289](atuinsh#4289))
- *(deps)* Bump rustix from 1.1.4 to 1.1.5 ([&atuinsh#35;4288](atuinsh#4288))
- *(deps)* Bump colored from 2.2.0 to 3.1.1 ([&atuinsh#35;4339](atuinsh#4339))
- *(deps)* Bump async-trait from 0.1.89 to 0.1.92 ([&atuinsh#35;4338](atuinsh#4338))
- *(deps)* Bump mozilla-actions/sccache-action from 0.0.9 to 0.0.11 ([&atuinsh#35;4287](atuinsh#4287))
- *(deps)* Bump thiserror from 2.0.19 to 2.0.21 ([&atuinsh#35;4284](atuinsh#4284))
- *(deps)* Bump libc from 0.2.186 to 0.2.190 ([&atuinsh#35;4397](atuinsh#4397))
- *(deps)* Bump lukemathwalker/cargo-chef from `9a2089c` to `b4b459d` ([&atuinsh#35;4394](atuinsh#4394))
- *(deps)* Bump debian from bookworm-20260918-slim to bookworm-20261005-slim ([&atuinsh#35;4393](atuinsh#4393))
- Hold secrets in secrecy types ([&atuinsh#35;4237](atuinsh#4237))
- Improve `Shell::default_shell`; fixes hanging test under Nextest ([&atuinsh#35;4267](atuinsh#4267))
- Switch from `directories` to `dirs` ([&atuinsh#35;4306](atuinsh#4306))
- Clean up atuin-common crate features ([&atuinsh#35;4323](atuinsh#4323))
- Add `PathBufExt::joined` to avoid unnecessary cloning of `PathBuf`s ([&atuinsh#35;4409](atuinsh#4409))


### Testing

- *(ai-session)* E2e tests for capture, sync and resume; scan new dirs in the tree watcher ([&atuinsh#35;4368](atuinsh#4368))
- Deflake the e2e shell tests
josephcourtney pushed a commit to josephcourtney/atuin that referenced this pull request Oct 16, 2026
### Bug Fixes

- *(ai)* Saturate file-tracker mtimes and rebuild on new migrations ([&atuinsh#35;4250](atuinsh#4250))
- *(ai)* Start the daemon before ai commands if autostart is enabled ([&atuinsh#35;4269](atuinsh#4269))
- *(ai)* Add MCP list cache fields and a since filter for session list ([&atuinsh#35;4294](atuinsh#4294))
- *(ai)* Only look up repos for this host's sessions in the resume picker ([&atuinsh#35;4400](atuinsh#4400))
- *(ai)* Fit the resume picker's title to the version so a prerelease isn't cut off ([&atuinsh#35;4406](atuinsh#4406))
- *(ai)* Correct large-file read guidance ([&atuinsh#35;4355](atuinsh#4355))
- *(ai-session)* Read an unknown parent kind as None ([&atuinsh#35;4301](atuinsh#4301))
- *(ai-session)* Count content-derived calls once per session lineage ([&atuinsh#35;4314](atuinsh#4314))
- *(ai-session)* Keep compacted Claude and Pi sessions whole when restored from sync ([&atuinsh#35;4357](atuinsh#4357))
- *(ai-session)* Link a Claude compaction that kept messages to the line before it ([&atuinsh#35;4370](atuinsh#4370))
- *(ai-session)* Harden capture, sync and resume across agents ([&atuinsh#35;4387](atuinsh#4387))
- *(ai-session)* Fix opencode 1.x resume capture, A→B→A catch-up, synced tail, and picker tty, keys and idle CPU ([&atuinsh#35;4398](atuinsh#4398))
- *(ai-session)* Switch inside a merged run past a failed call without losing the run's earlier text ([&atuinsh#35;4402](atuinsh#4402))
- *(build)* Drop atuin's implicit arboard feature so nix builds again ([&atuinsh#35;610](atuinsh#610))
- *(config)* Don't let a default ~/.atuin/config.toml hide the legacy config, and warn when one does ([&atuinsh#35;4420](atuinsh#4420))
- *(config)* Avoid shadowing data dir, fix gaps in avoidance logic ([&atuinsh#35;4421](atuinsh#4421))
- *(daemon)* Recover ai sessions in the background at boot ([&atuinsh#35;4293](atuinsh#4293))
- *(daemon)* Pick up ai.capture_sessions changes without a restart ([&atuinsh#35;4362](atuinsh#4362))
- *(daemon)* Run the daemonized daemon from / ([&atuinsh#35;4358](atuinsh#4358))
- *(daemon)* Write the record store before history.db when a command finishes ([&atuinsh#35;4361](atuinsh#4361))
- *(daemon)* Time out shell hook calls to an unresponsive daemon ([&atuinsh#35;4360](atuinsh#4360))
- *(daemon)* Only restart a daemon older than the client ([&atuinsh#35;4359](atuinsh#4359))
- *(doctor)* Fix sqlite error in `atuin doctor` ([&atuinsh#35;4354](atuinsh#4354))
- *(hook)* Write absolute executable path to agent configs ([&atuinsh#35;4044](atuinsh#4044))
- *(pty-proxy)* Fix forwarding of output to parent terminal under load ([&atuinsh#35;4217](atuinsh#4217))
- *(pty-proxy)* Fix PTY proxy initialization in fish ([&atuinsh#35;4224](atuinsh#4224))
- *(pty-proxy)* Preserve login shell status in init script ([&atuinsh#35;4271](atuinsh#4271))
- *(pty-proxy)* Periodically touch the socket to prevent automatic deletion ([&atuinsh#35;4366](atuinsh#4366))
- *(scripts)* Correct shebang prefix handling ([&atuinsh#35;4416](atuinsh#4416))
- *(sync)* Give sync errors their full cause and HTTP status, and flag a non-Atuin `sync_address` ([&atuinsh#35;4423](atuinsh#4423))
- *(systemd)* Stop pulling in systemd-networkd-wait-online ([&atuinsh#35;4415](atuinsh#4415))
- *(vendor)* Find the repository root from the script's location
- Timezone awareness during atuin search ([&atuinsh#35;3762](atuinsh#3762))
- Handling of OSC 133 sequences in prompt ([&atuinsh#35;4221](atuinsh#4221))
- Don't (re)start daemon on history end ([&atuinsh#35;4229](atuinsh#4229))
- Fall back to saving history locally when the daemon can't be started ([&atuinsh#35;4234](atuinsh#4234))
- Use github release proxy ([&atuinsh#35;4297](atuinsh#4297))
- Improve "output capture disabled" message ([&atuinsh#35;4296](atuinsh#4296))
- Literal out of range for usize ([&atuinsh#35;4295](atuinsh#4295))
- Meaning of today in mcp since ([&atuinsh#35;4300](atuinsh#4300))
- Atuin update --prerelease ([&atuinsh#35;4429](atuinsh#4429))

### Documentation

- *(ai)* Describe continuing in another agent as carrying tool calls over ([&atuinsh#35;4403](atuinsh#4403))
- *(zinit)* Fix bpick pattern, add wait/lucid ices ([&atuinsh#35;3492](atuinsh#3492))
- Limit installation methods to those that install the latest version ([&atuinsh#35;4219](atuinsh#4219))
- Remove information about dotfiles in support matrix ([&atuinsh#35;4298](atuinsh#4298))

### Features

- *(ai)* List, read and richer search MCP tools for sessions ([&atuinsh#35;4280](atuinsh#4280))
- *(ai)* Add `atuin ai resume`, a picker over agent sessions ([&atuinsh#35;4311](atuinsh#4311))
- *(ai)* Resume sessions recorded on other machines ([&atuinsh#35;4315](atuinsh#4315))
- *(ai)* Give every AI session a fixed UUIDv7 atuin id ([&atuinsh#35;4326](atuinsh#4326))
- *(ai)* Show parent, root and children links as atuin ids ([&atuinsh#35;4337](atuinsh#4337))
- *(ai)* Continue a session in another agent from `atuin ai resume` ([&atuinsh#35;4325](atuinsh#4325))
- *(ai)* Fork a session from `atuin ai resume` ([&atuinsh#35;4340](atuinsh#4340))
- *(ai)* Work out a session's heads on demand, with Codex rows linked to the row before ([&atuinsh#35;4341](atuinsh#4341))
- *(ai)* Catch sessions up with sync on resume, and fork from another machine's branch ([&atuinsh#35;4345](atuinsh#4345))
- *(ai)* Switch a diverged session's copy to another machine's branch on resume ([&atuinsh#35;4350](atuinsh#4350))
- *(ai)* Capture tool calls as well as messages ([&atuinsh#35;4352](atuinsh#4352))
- *(ai)* Capture and restore the diffs of agents' edits ([&atuinsh#35;4369](atuinsh#4369))
- *(ai)* Filter session reads by query and role, rank substring history matches first ([&atuinsh#35;4367](atuinsh#4367))
- *(ai)* Add `atuin resume` as short for `atuin ai resume` ([&atuinsh#35;4382](atuinsh#4382))
- *(ai)* List forks as a tree under their root in the session picker, mark running forks, and name the provider in Codex rollouts ([&atuinsh#35;4399](atuinsh#4399))
- *(ai)* Show the atuin id as ID and the harness's own as Harness ID in the resume picker's Inspect tab ([&atuinsh#35;4401](atuinsh#4401))
- *(ai)* Session picker reader pane, two-line rows grouped by day, visible scopes, per-session actions and an in-list resume chooser ([&atuinsh#35;4383](atuinsh#4383))
- *(ai)* Show atuin's MCP tool calls as 🐢 atuin <tool> in the session reader ([&atuinsh#35;4411](atuinsh#4411))
- *(ai)* Rename AI sessions to threads: atuin threads, [threads] and threads.db ([&atuinsh#35;4418](atuinsh#4418))
- *(ai-session)* Faster sidecar rebuilds, session grouping, and one search API ([&atuinsh#35;4302](atuinsh#4302))
- *(ai-session)* Fast-forward a behind transcript to its synced head ([&atuinsh#35;4344](atuinsh#4344))
- *(ai-session)* Search by message role and without subagents, and know a stateless MCP caller's own session ([&atuinsh#35;4385](atuinsh#4385))
- *(ai-session)* Show short session ids, and select text with the mouse in the resume picker ([&atuinsh#35;4404](atuinsh#4404))
- *(ai-session)* Capture sessions from when it's turned on, and atuin config enable ai-sessions ([&atuinsh#35;4389](atuinsh#4389))
- *(api-client)* Add the atuin.api.v1 protos ([&atuinsh#35;4312](atuinsh#4312))
- *(common)* Add BlockingPool, a cap on concurrent blocking work ([&atuinsh#35;4242](atuinsh#4242))
- *(daemon)* Store daemon socket path in pidfile ([&atuinsh#35;4253](atuinsh#4253))
- *(i18n)* Localize user-facing text with Fluent ([&atuinsh#35;4233](atuinsh#4233))
- *(mcp)* Add `atuin mcp install <agent>` and per-agent setup docs ([&atuinsh#35;4417](atuinsh#4417))
- *(output)* Add command_filter to drop output but keep history ([&atuinsh#35;4268](atuinsh#4268))
- *(pty-proxy)* Switch from OSC 133 to Atuin-specific sequence ([&atuinsh#35;4291](atuinsh#4291))
- *(search)* Add accept-cd and return-cd keymap actions ([&atuinsh#35;4319](atuinsh#4319))
- *(secrets)* Add several new known secrets formats ([&atuinsh#35;4364](atuinsh#4364))
- *(server)* Read the database password from db_password_file ([&atuinsh#35;4425](atuinsh#4425))
- Read login password and key from env or stdin ([&atuinsh#35;3498](atuinsh#3498))
- Enable workspaces by default ([&atuinsh#35;1838](atuinsh#1838))
- Capture ai agent sessions into the store ([&atuinsh#35;4212](atuinsh#4212))
- Automatically open login link ([&atuinsh#35;4351](atuinsh#4351))
- Send atuin register's login link to the hub's signup page ([&atuinsh#35;4353](atuinsh#4353))
- Config disable ([&atuinsh#35;4349](atuinsh#4349))
- Unify all data in `~/.atuin` (customizable with `ATUIN_HOME`) ([&atuinsh#35;4380](atuinsh#4380))

### Miscellaneous Tasks

- *(buildkite)* Fix the installer hang and address atuinsh#4274 review ([&atuinsh#35;4275](atuinsh#4275))
- *(buildkite)* Build tests once, split test jobs by timing ([&atuinsh#35;4278](atuinsh#4278))
- *(nix)* Build with crane and cache to atuin.cachix.org ([&atuinsh#35;4348](atuinsh#4348))
- *(nix)* Set USER so cachix runs in the CI container
- *(nix)* Use stdenv.hostPlatform.isDarwin in atuin.nix ([&atuinsh#35;4391](atuinsh#4391))
- Sccache for codegen jobs, rust-cache for the rest ([&atuinsh#35;4214](atuinsh#4214))
- Fix Clippy warning about `time::Duration` ([&atuinsh#35;4231](atuinsh#4231))
- Rename `Backoff::Linear` to `Backoff::Constant` ([&atuinsh#35;4238](atuinsh#4238))
- Reduce record store disk usage ([&atuinsh#35;4249](atuinsh#4249))
- Run CI on Buildkite ([&atuinsh#35;4274](atuinsh#4274))
- Remove the GitHub Actions workflows Buildkite replaced ([&atuinsh#35;4277](atuinsh#4277))
- Use internal session ids ([&atuinsh#35;4279](atuinsh#4279))
- Tell hub when main moves
- Tiny bit of CONTRIBUTING.md formatting ([&atuinsh#35;4317](atuinsh#4317))
- Land pull requests with /merge
- One check per pipeline, and a merge status for /merge
- Skip CI on the update /merge makes, and keep other repos' links as text
- Keep lockfiles, vendored code and fixtures out of rg results
- Gate each deploy on its own checks and skip unchanged subtrees

### Performance

- *(ai)* Make AI session rebuilds fast ([&atuinsh#35;4343](atuinsh#4343))
- *(ai-session)* Import existing sessions in batches, off the daemon's runtime ([&atuinsh#35;4408](atuinsh#4408))
- *(daemon)* Load the search index with a linear history scan ([&atuinsh#35;4347](atuinsh#4347))
- *(dotfiles)* Remove defunct bind feature detection for fish ([&atuinsh#35;2532](atuinsh#2532))
- Build the bundled SQLite with SQLITE_DEFAULT_MEMSTATUS=0 ([&atuinsh#35;4342](atuinsh#4342))
- Share Settings through Arc instead of deep-cloning it ([&atuinsh#35;4410](atuinsh#4410))

### Refactor

- *(ai-session)* Squash sidecar migrations, intern repeated message text, drop session transcript ([&atuinsh#35;4371](atuinsh#4371))
- *(ai-session)* Drop compatibility with records, checkpoints and daemons from earlier builds ([&atuinsh#35;4373](atuinsh#4373))
- *(deps)* Bump vmactions/omnios-vm from 1.3.4 to 1.3.6 ([&atuinsh#35;4029](atuinsh#4029))
- *(deps)* Bump debian from bookworm-20260713-slim to bookworm-20260918-slim ([&atuinsh#35;4025](atuinsh#4025))
- *(deps)* Bump lukemathwalker/cargo-chef from `e406ad0` to `9a2089c` ([&atuinsh#35;4026](atuinsh#4026))
- *(deps)* Bump urllib3 from 2.7.0 to 2.8.0 in /docs in the uv group across 1 directory ([&atuinsh#35;4313](atuinsh#4313))
- *(deps)* Bump xxhash-rust from 0.8.15 to 0.8.16 in the cargo group across 1 directory ([&atuinsh#35;4322](atuinsh#4322))
- *(deps)* Bump tokio-util from 0.7.18 to 0.7.19 ([&atuinsh#35;4289](atuinsh#4289))
- *(deps)* Bump rustix from 1.1.4 to 1.1.5 ([&atuinsh#35;4288](atuinsh#4288))
- *(deps)* Bump colored from 2.2.0 to 3.1.1 ([&atuinsh#35;4339](atuinsh#4339))
- *(deps)* Bump async-trait from 0.1.89 to 0.1.92 ([&atuinsh#35;4338](atuinsh#4338))
- *(deps)* Bump mozilla-actions/sccache-action from 0.0.9 to 0.0.11 ([&atuinsh#35;4287](atuinsh#4287))
- *(deps)* Bump thiserror from 2.0.19 to 2.0.21 ([&atuinsh#35;4284](atuinsh#4284))
- *(deps)* Bump libc from 0.2.186 to 0.2.190 ([&atuinsh#35;4397](atuinsh#4397))
- *(deps)* Bump lukemathwalker/cargo-chef from `9a2089c` to `b4b459d` ([&atuinsh#35;4394](atuinsh#4394))
- *(deps)* Bump debian from bookworm-20260918-slim to bookworm-20261005-slim ([&atuinsh#35;4393](atuinsh#4393))
- Hold secrets in secrecy types ([&atuinsh#35;4237](atuinsh#4237))
- Improve `Shell::default_shell`; fixes hanging test under Nextest ([&atuinsh#35;4267](atuinsh#4267))
- Switch from `directories` to `dirs` ([&atuinsh#35;4306](atuinsh#4306))
- Clean up atuin-common crate features ([&atuinsh#35;4323](atuinsh#4323))
- Add `PathBufExt::joined` to avoid unnecessary cloning of `PathBuf`s ([&atuinsh#35;4409](atuinsh#4409))

### Testing

- *(ai-session)* E2e tests for capture, sync and resume; scan new dirs in the tree watcher ([&atuinsh#35;4368](atuinsh#4368))
- Deflake the e2e shell tests
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