aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-client/src/sync.rs (unfollow)
Commit message (Collapse)Author
5 dayschore: Move everything into one big crateBenedikt Peetz
That helps remove duplicated code and rustc/cargo will now also show dead code correctly.
2026-03-11feat: Allow authenticating with Atuin Hub (#3237)Michelle Tilley
## Summary This PR enables the Atuin CLI to authenticate with Atuin Hub, unifying authentication across CLI sync and Hub features (AI, runbooks, etc.). ### Key Changes - **Dual auth support**: New `AuthToken` enum supports both `Bearer` (Hub) and `Token` (legacy CLI) authentication - **Smart protocol selection**: New `sync_protocol` setting (`auto`/`hub`/`legacy`) determines auth method. By default, `api.atuin.sh` uses Hub auth; custom sync addresses use legacy auth - **Hub login flow**: `atuin login` now initiates an OAuth-like flow for Hub users—generates a code, user authorizes in browser, CLI polls for completion - **Account linking**: After Hub auth, silently attempts to link existing CLI sync account to Hub account for seamless migration - **Graceful fallback**: `sync_auth_token()` prefers Hub token when available, falls back to CLI session token ### Auth Flow 1. User runs `atuin login` (with default sync address) 2. CLI requests auth code from Hub, displays URL 3. User opens URL, logs in/registers on Hub 4. Hub attaches API token to code 5. CLI polls, receives token, saves as hub session 6. If user had existing CLI sync account, it's automatically linked ### Backward Compatibility - Existing self-hosted users: unaffected (legacy auth via `Token` header) - Existing `api.atuin.sh` users: continue working with CLI session until they run `atuin login` - New users: go through Hub flow automatically ## Test Plan - [ ] New user registration via Hub flow - [ ] Existing CLI user can still sync without changes - [ ] `atuin login` links CLI account to Hub account - [ ] Self-hosted users unaffected by changes - [ ] AI commands work after Hub auth --------- Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
2026-02-04feat: replace several files with a sqlite db (#3128)Ellie Huxtable
These files have been known to have corruption issues. SQLite will perform better across filesystems for reads/writes across threads, and will lock as expected. I've also put the session file in there, though I'm 50/50 on it - I'll be replacing it with keyring storage asap anyway. The key file is _not_ included. It should ~never be changed, and should be easy for the user to secure + manage themselves In the future, instead of creating more files, we can just use this as a kv store Resolves https://github.com/atuinsh/atuin/issues/2336, resolves https://github.com/atuinsh/atuin/issues/1650 ## Checks - [ ] I am happy for maintainers to push small adjustments to this PR, to speed up the review cycle - [ ] I have checked that there are no existing pull requests for the same thing
2025-09-10fix: clippy warnings I don't have on my version of clippyRay Kohler
2025-03-25fix: typeerror in client sync code (#2647)Ellie Huxtable
* fix: typeerror in client sync code Fixes #2645 This is really weird 1. I have not touched this code in _years_. It has not changed. In recent rust versions, it has a typeerror (see linked issue) 2. This does not occur when running `cargo build`, in release mode or otherwise. It only occurs with `cargo install` 3. I can't find any other occurences of this typeerror online - unsure if it is a compiler regression? The code here is not very complex at all. * chore(clippy): remove unused imports
2025-03-19chore: migrate to rust 2024 (#2635)Ellie Huxtable
* chore: upgrade to 2024 edition * ugh unsafe * format * nixxxxxxxxxxx why
2024-05-21fix(daemon): do not try to sync if logged out (#2037)Ellie Huxtable
* fix(daemon): do not try to sync if logged out I've also added Settings::logged_in, as there are a few places where we switch on login state. * make session_token a function
2024-05-02fix(dotfiles): allow clearing aliases, disable import (#1995)Ellie Huxtable
* fix(dotfiles): allow clearing aliases, disable import At the moment there are far too many edge cases to handle importing aliases. 1. We need an interactive shell to print aliases. Without it, most shells won't report much. 2. Many people have their shells print things on startup (graphics, fortunes, etc). This could be detected as an attempt to set an alias. Rather than spend the next year finding import edge cases, I'm disabling it for now. There's probably a better way we can do this? * clippy
2024-04-18chore: move crates into crates/ dir (#1958)Ellie Huxtable
I'd like to tidy up the root a little, and it's nice to have all the rust crates in one place
2024-01-15fix(sync): save sync time when it starts, not ends (#1573)Ellie Huxtable
Imagine the scenario where a sync fails. The function touched here will never save the sync time. That means that external to this function, the sync never happened. The next command will try and start one immediately. The happy scenario is that this succeeds. The unhappy scenario is that this fails. Fails, and isn't saved, so we try again... Should add proper backoff but this is a good start.
2024-01-06refactor: String -> HistoryId (#1512)Ellie Huxtable
2023-10-08clear history id (#1263)Conrad Ludgate
* clear history id * fix nu
2023-10-04Fix/1207 deleted entries shown in interactive search (#1272)Dieter Eickstaedt
2023-09-26handle missing entries (fixes #1236) (#1253)Conrad Ludgate
* fix #1236 * lints
2023-09-18Add connect timeout and overall timeout (#1238)Ellie Huxtable
* Add connect timeout and overall timeout * Make it configurable * Fix test * Add docs
2023-09-11replace chrono with time (#806)Conrad Ludgate
* replace chrono with time * Fix test chrono usage --------- Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
2023-08-18Update dependencies (#1181)Conrad Ludgate
2023-06-21remove decryption from api-client (#1063)Conrad Ludgate
2023-05-21Allow server configured page size (#994)Ellie Huxtable
* Allow server configured page size * Backwards compat via semver checks * Correct header name
2023-04-05Fix deleting history that doesn't exist yet (#844)Ellie Huxtable
This can occur if history has been added + then deleted on a machine before it has a chance to be synced to a new one.
2023-03-24Delete all instances of a command (#797)Ellie Huxtable
* Delete all instances of a command Our search command will de-dupe results by default. But... This isn't great for deleting! You don't want to run it over-and-over-and-over until all commands are deleted. Loop the query, and keep on deleting what it returns until they are all gone. * Optimize delete upload It was running a request for every element, on every sync lol Only push a delete if needed Future: push all deletes in one request
2023-03-20Add history deletion (#791)Ellie Huxtable
* Drop events. I'd still like to do them, but differently * Start adding delete api stuff * Set mailmap * Delete delete delete * Fix tests * Make clippy happy
2022-11-04Add local event log storage (#390)Ellie Huxtable
* Add event data structures This adds the data structures required to start syncing events, rather than syncing history directly. Adjust event Fix Add event data structure to client * Add server event table sql * Add client event table migration Adjust migration * Insert into event table from client * Add event merge function Right now this just ensures we have the right amount of events given the history we have BUT it will also be used to merge CREATE/DELETE events, resulting in history being deleted :) * Make CI happy * Adjust * we don't limit history length any more * Update atuin-client/src/database.rs Co-authored-by: Conrad Ludgate <conradludgate@gmail.com> * fix usage * Fix typo * New Rust, new clippy stuff Co-authored-by: Conrad Ludgate <conradludgate@gmail.com>
2022-09-13Release v11 (#529)Ellie Huxtable
2022-04-28ignore JetBrains IDEs, tidy-up imports (#348)Jakub Panek
* ignore JB IDEs * tidy-up imports * add rustfmt config
2022-04-25history list (#340)Conrad Ludgate
2022-04-12goodbye warp, hello axum (#296)Conrad Ludgate
2021-05-09Fix sync (#95)Ellie Huxtable
The data part of the add history request is actually a string. I don't want to introduce any structure here, and would rather keep it as "just a blob". Even if that blob has structure secretly! My fault for missing this in the last review
2021-05-09some changes :shrug: (#83)Conrad Ludgate
* make everything a cow * fmt + clippy
2021-04-26Support bash, resolves #3Ellie Huxtable
2021-04-25Revert to storing history as nanosEllie Huxtable
2021-04-25Update docs, unify on SQLx, bugfixes (#40)Ellie Huxtable
* Begin moving to sqlx for local too * Stupid scanners should just have a nice cup of tea Random internet shit searching for /.env or whatever * Remove diesel and rusqlite fully
2021-04-21Bugfixes, show time ago, perf improvementsEllie Huxtable
Also allow unique listing and more ergonomic cwd usage
2021-04-20Use cargo workspaces (#37)Ellie Huxtable
* Switch to Cargo workspaces Breaking things into "client", "server" and "common" makes managing the codebase much easier! client - anything running on a user's machine for adding history server - handles storing/syncing history and running a HTTP server common - request/response API definitions, common utils, etc * Update dockerfile
2021-04-20Switch to Warp + SQLx, use async, switch to Rust stable (#36)Ellie Huxtable
* Switch to warp + sql, use async and stable rust * Update CI to use stable
2021-04-13Add history sync, resolves #13 (#31)Ellie Huxtable
* Add encryption * Add login and register command * Add count endpoint * Write initial sync push * Add single sync command Confirmed working for one client only * Automatically sync on a configurable frequency * Add key command, key arg to login * Only load session if it exists * Use sync and history timestamps for download * Bind other key code Seems like some systems have this code for up arrow? I'm not sure why, and it's not an easy one to google. * Simplify upload * Try and fix download sync loop * Change sync order to avoid uploading what we just downloaded * Multiline import fix * Fix time parsing * Fix importing history with no time * Add hostname to sync * Use hostname to filter sync * Fixes * Add binding * Stuff from yesterday * Set cursor modes * Make clippy happy * Bump version