| Commit message (Collapse) | Author | Age |
| | |
|
| | |
|
| |
|
|
| |
A service manager should deal with that.
|
| |
|
|
| |
Otherwise, we might run migration from multiple db-connections.
|
| | |
|
| |
|
|
| |
Just a run of `cargo clippy --fix`
|
| |
|
|
| |
There are still the `clippy` warnings, but they are for a future date.
|
| | |
|
| |
|
|
| |
This commit also remove another load of unneeded features.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
| |
They will not be marked by rustc/cargo as unused, and as atuin doesn't
expose an API all of them _should_ be `pub(crate)`
|
| | |
|
| |
|
|
|
| |
That helps remove duplicated code and rustc/cargo will now also show
dead code correctly.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This PR fixes a shell hang when daemon autostart happens from the
interactive search widget.
The bash/zsh/fish integrations run `atuin search -i` under command
substitution and swap stdout/stderr so the TUI can draw to the terminal
while the selected command is captured:
```sh
3>&1 1>&2 2>&3
```
This leaves fd 3 open in the atuin search process. If search autostarts
the daemon, the spawned long-running `atuin daemon start --daemonize`
inherits fd 3, the command-substitution pipe, so the shell keeps waiting
for EOF until the daemon is killed.
The fix: close fd 3 after the swap in the non-tmux bash/zsh/fish paths:
```sh
3>&1 1>&2 2>&3 3>&-
```
Tested on zsh; I still need to confirm for bash and fish. Near as I can
tell, the other shell integrations don't need this change.
Fixes #3499
|
| |
|
|
|
|
|
| |
This PR allows overriding the Atuin AI model for feature-flagged users
with the `ATUIN_AI__MODEL` environment variable. Any OpenRouter model is
accepted; it's recommended to include an explicit `openrouter:` provider
prefix, so models with colons in their names are interpreted correctly,
e.g. `ATUIN_AI__MODEL=openrouter:deepseek/deepseek-v4-flash:free`.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The `fn into_utc` was defined in both `atuin-server-postgres` and
`atuin-server-sqlite`, with tests being in the postgres crate. This
pulls the function into the `atuin-server-database` crate along with the
tests and references it from both crates.
## Checks
- [X] I am happy for maintainers to push small adjustments to this PR,
to speed up the review cycle
- [X] I have checked that there are no existing pull requests for the
same thing
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
In the database crates for atuin-server, there is `fn fix_error`. This
PR implements `From<sqlx::Error>` on `DbError` which makes it possible
to mostly use `?` to bubble up the errors.
There are cases where `?` is not being used e.g.
```rust
async fn get_session(&self, token: &str) -> DbResult<Session> {
sqlx::query_as("select id, user_id, token from sessions where token = $1")
.bind(token)
.fetch_one(&self.pool)
.await
.map_err(fix_error)
.map(|DbSession(session)| session)
}
```
There are two options
## 1. Use `Into::into`
```rust
async fn get_session(&self, token: &str) -> DbResult<Session> {
sqlx::query_as("select id, user_id, token from sessions where token = $1")
.bind(token)
.fetch_one(&self.pool)
.await
.map_err(fix_error)
.map(|DbSession(session)| session)
}
```
## 2. Create a variable and use `?`
```rust
async fn get_session(&self, token: &str) -> DbResult<Session> {
let session = sqlx::query_as("select id, user_id, token from sessions where token = $1")
.bind(token)
.fetch_one(&self.pool)
.await
.map(|DbSession(session)| session)?;
Ok(session)
}
```
I chose to do option 1 as it was just a find/replace but say the word
and I'll convert them all to option 2
## Checks
- [X] I am happy for maintainers to push small adjustments to this PR,
to speed up the review cycle
- [X] I have checked that there are no existing pull requests for the
same thing
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
## 18.16.1
### Bug Fixes
- *(shell/xonsh)* Use os.devnull instead of hard-coded /dev/null
([#3464](https://github.com/atuinsh/atuin/issues/3464))
- Atuin update on windows
([#3453](https://github.com/atuinsh/atuin/issues/3453))
- Ensure local key matches remote data before syncing
([#3474](https://github.com/atuinsh/atuin/issues/3474))
### Documentation
- Add related projects section to README
### Features
- *(ui)* Prominent banner for wrong-key errors at login/sync
([#3475](https://github.com/atuinsh/atuin/issues/3475))
### Miscellaneous Tasks
- Generate LLM-optimized docs
([#3468](https://github.com/atuinsh/atuin/issues/3468))
- Rename 'atuin hex' to 'atuin pty-proxy'
([#3473](https://github.com/atuinsh/atuin/issues/3473))
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The wrong-key error was a long unwrapped sentence buried under
"Successfully authenticated.", and wrapped by eyre error formatting
add
- print_error(title, description) — red box-drawn bars across the
terminal width (capped at 100 cols) with bold title; word-wraps the
description; plain "Error:" header when stderr isn't a TTY.
- format_sync_error(SyncError) -> eyre::Report — intercepts WrongKey to
print the banner and exit(1) so eyre's footer never runs; forwards other
variants unchanged.
Use it from:
- account/login.rs — replaces bail\! in the wrong-key path
- command/client/sync.rs — .map_err(format_sync_error)? on sync()
- store/push.rs and store/pull.rs — .map_err on check_encryption_key
## 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
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
We rely on the user to manage their keys. This is ok, and is
intentionally part of our security model
However. If the user messes up, they corrupt their remote store. It is
possible to work around and fix, but not without difficulty. This change
ensures that if the local key does not match the remote data, no data is
synced and the user has a chance to fix it before breaking things.
## 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
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
| |
Refiles a previously-closed PR (#3463) that was closed in error after
the force-push. Same fix; new branch.
Uses inline `@(os.devnull)` per @ltrzesniewski's suggestion in #3463.
Fixes #3462.
Signed-off-by: SAY-5 <saiasish.cnp@gmail.com>
Co-authored-by: SAY-5 <saiasish.cnp@gmail.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This fixes the `atuin update` command on Windows.
Windows doesn't let you overwrite a running exe, but it lets you rename
it. This PR special-cases the official `update` plugin by renaming the
running `atuin.exe` to `atuin.old` before the update, and rolling it
back if the update fails.
Note that the `atuin.old` file is left behind on success, which
shouldn't be a problem in practice: it will be overwritten on the next
call to `atuin update` (also deleted if there's no update available),
and is located in `~/.atuin/bin`, which is an isolated location specific
to Atuin.
Fixes #3451
## Checks
- [x] I am happy for maintainers to push small adjustments to this PR,
to speed up the review cycle
- [x] I have checked that there are no existing pull requests for the
same thing
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Fixes keystroke lag in Atuin AI that scales with conversation length.
After extended use (many turns, lots of tool calls with output
viewports), pressing a key had noticeable delay before the letter
appeared.
Three layers of optimization:
- **Skip `sync_view_state` for `InputUpdated`** — every keystroke was
cloning all events, tools, and archived data even though no FSM state
changed. Uses `handle.update_tracked()` (eye_declare 0.5) to skip
rebuilds when values haven't actually changed.
- **Pre-compute turns and `has_command` on the driver thread** — the
view function was rebuilding the full turn structure from raw events and
scanning for `suggest_command` tool calls 3× per render frame. Now
computed once per FSM state change and cached in ViewState.
- **Commit-based element tree pruning** — turns that scroll into
terminal scrollback are tracked via `on_commit` and filtered from the
element tree, keeping rendering work proportional to visible content.
Turn views are now direct children of the root VStack (not nested inside
AtuinAi) so `detect_committed` can see them.
|
| |
|
| |
Adds a skills system that lets users define reusable LLM instructions as `SKILL.md` files with YAML frontmatter.
|
| |
|
|
|
|
|
|
|
|
| |
This PR adds the ability to inject user-defined content into Atuin AI
requests, a la `AGENTS.md` or `CLAUDE.md`.
* `.atuin/TERMINAL.md` (or alternatively just `TERMINAL.md`) is checked in every directory from the cwd up to the root
* `~/.config/atuin/TERMINAL.md` (or equivalent config dir) is also
checked
* Supports Claude-style ``` !`` ``` and ```` ```!...``` ```` style shell
interpolation
|
| |
|
|
|
|
|
|
|
|
| |
This PR fixes two minor issues when using Atuin with fish's vim mode(s):
1. Add support for `fish_hybrid_key_bindings`: in addition to
`fish_vi_key_bindings`, fish also provides `fish_hybrid_key_bindings`,
which is a vi-based mode with some extra keybinds; but the key bind
check for `atuin search` only checks for the former.
2. The AI keybind inserts a `?` on the command line in vim mode even
though it can only be called from normal mode, when pressing `?`
normally does nothing.
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
Replaces the tangled dispatch handler system (`tui/dispatch.rs`,
`tui/state.rs`) with a pure finite state machine + driver architecture.
The FSM handles all state transitions as explicit `(State, Event) →
(NewState, Effects)` mappings. The driver executes IO effects and
bridges the TUI to the FSM.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
## Summary
Implements the `write_file` client-side tool — creates new files or
overwrites existing ones with an explicit `overwrite` flag for safety.
- **Overwrite flag**: Writing to an existing file without `overwrite:
true` returns an error directing the LLM to set the flag or use
`edit_file` for targeted changes. Prevents accidental overwrites.
- **Snapshots**: Existing files are backed up before overwriting (same
infrastructure as `edit_file`).
- **Content preview**: Completed writes show the first 10 lines in gray
with line numbers, plus "+ N more lines" for longer files.
- **Atomic writes**: Uses `tempfile` + fsync + rename (same as
`edit_file`).
- **File tracker update**: After writing, the file is registered in the
tracker so subsequent `edit_file` calls work without a separate read.
- **Permission**: Shares the `"Write"` rule with `edit_file` — one
permission covers both tools.
|
| |
|
|
|
|
| |
Overhaul of how AI tool calls are modeled, rendered, and displayed in
the Atuin AI TUI. Fixes bugs in shell command output capture, implements
the `edit_file` tool with full safety infrastructure, and adds a diff
preview for edits.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
<!-- Thank you for making a PR! Bug fixes are always welcome, but if
you're adding a new feature or changing an existing one, we'd really
appreciate if you open an issue, post on the forum, or drop in on
Discord -->
## 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
|
| |
|
|
|
|
|
|
| |
## 18.15.2
### Bug Fixes
- Tab doesn't insert suggested command
([#3420](https://github.com/atuinsh/atuin/issues/3420))
|
| | |
|
| | |
|