From 33c779aa9894e1347aeaa4c73e536cf842aee684 Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Tue, 21 Apr 2026 10:53:31 -0700 Subject: feat: Implement write_file tool with overwrite safety (#3432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 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. --- crates/atuin-ai/src/tui/view/turn.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'crates/atuin-ai/src/tui/view/turn.rs') diff --git a/crates/atuin-ai/src/tui/view/turn.rs b/crates/atuin-ai/src/tui/view/turn.rs index 1c19a6b2..6c3d5c29 100644 --- a/crates/atuin-ai/src/tui/view/turn.rs +++ b/crates/atuin-ai/src/tui/view/turn.rs @@ -141,7 +141,10 @@ pub(crate) enum ToolRenderData { preview: Option, }, /// File write/create operation. - FileWrite { path: PathBuf }, + FileWrite { + path: PathBuf, + preview: Option, + }, /// Atuin history search. HistorySearch { query: String, @@ -449,6 +452,7 @@ impl<'a> TurnBuilder<'a> { }, ClientToolCall::Write(write) => ToolRenderData::FileWrite { path: write.path.clone(), + preview: tracked.write_preview.clone(), }, ClientToolCall::AtuinHistory(history) => ToolRenderData::HistorySearch { query: history.query.clone(), -- cgit v1.3.1