From b102f673c48ede2ace0d1f8a30c4d8b176bc0a63 Mon Sep 17 00:00:00 2001 From: Maddison Hellstrom Date: Fri, 13 Dec 2024 06:59:09 -0800 Subject: [PATCH] feat(AvanteClear): accept args to clear history, memory or cache (#930) * chore: extract sidebar clear history/memory functions * feat(AvanteClear): accept args to clear history, memory or cache Usage: ``` :AvanteClear [history|memory|cache] ``` - changed default behavior from clearing the cache to clearing history. - added args to clear history, memory or cache. - added confirm dialog before clearing cache. --- lua/avante/sidebar.lua | 70 ++++++++++++++++++++++-------------------- plugin/avante.lua | 31 ++++++++++++++++++- 2 files changed, 67 insertions(+), 34 deletions(-) diff --git a/lua/avante/sidebar.lua b/lua/avante/sidebar.lua index ec9c9bc..1fa613a 100644 --- a/lua/avante/sidebar.lua +++ b/lua/avante/sidebar.lua @@ -1356,6 +1356,41 @@ function Sidebar:get_content_between_separators() return content, start_line end +function Sidebar:clear_history(args, cb) + local chat_history = Path.history.load(self.code.bufnr) + if next(chat_history) ~= nil then + chat_history = {} + Path.history.save(self.code.bufnr, chat_history) + self:update_content("Chat history cleared", { focus = false, scroll = false }) + if cb then cb(args) end + else + self:update_content("Chat history is already empty", { focus = false, scroll = false }) + end +end + +function Sidebar:reset_memory(args, cb) + local chat_history = Path.history.load(self.code.bufnr) + if next(chat_history) ~= nil then + table.insert(chat_history, { + timestamp = get_timestamp(), + provider = Config.provider, + model = Config.get_provider(Config.provider).model, + request = "", + response = "", + original_response = "", + selected_file = nil, + selected_code = nil, + reset_memory = true, + }) + Path.history.save(self.code.bufnr, chat_history) + local history_content = self:render_history_content(chat_history) + self:update_content(history_content, { focus = false, scroll = true }) + if cb then cb(args) end + else + self:update_content("Chat history is already empty", { focus = false, scroll = false }) + end +end + ---@alias AvanteSlashCommandType "clear" | "help" | "lines" | "reset" ---@alias AvanteSlashCommandCallback fun(args: string, cb?: fun(args: string): nil): nil ---@alias AvanteSlashCommand {description: string, command: AvanteSlashCommandType, details: string, shorthelp?: string, callback?: AvanteSlashCommandCallback} @@ -1390,39 +1425,8 @@ function Sidebar:get_commands() self:update_content(help_text, { focus = false, scroll = false }) if cb then cb(args) end end, - clear = function(args, cb) - local chat_history = Path.history.load(self.code.bufnr) - if next(chat_history) ~= nil then - chat_history = {} - Path.history.save(self.code.bufnr, chat_history) - self:update_content("Chat history cleared", { focus = false, scroll = false }) - if cb then cb(args) end - else - self:update_content("Chat history is already empty", { focus = false, scroll = false }) - end - end, - reset = function(args, cb) - local chat_history = Path.history.load(self.code.bufnr) - if next(chat_history) ~= nil then - table.insert(chat_history, { - timestamp = get_timestamp(), - provider = Config.provider, - model = Config.get_provider(Config.provider).model, - request = "", - response = "", - original_response = "", - selected_file = nil, - selected_code = nil, - reset_memory = true, - }) - Path.history.save(self.code.bufnr, chat_history) - local history_content = self:render_history_content(chat_history) - self:update_content(history_content, { focus = false, scroll = true }) - if cb then cb(args) end - else - self:update_content("Chat history is already empty", { focus = false, scroll = false }) - end - end, + clear = function(args, cb) self:clear_history(args, cb) end, + reset = function(args, cb) self:reset_memory(args, cb) end, lines = function(args, cb) if cb then cb(args) end end, diff --git a/plugin/avante.lua b/plugin/avante.lua index c83f54a..3c9c9eb 100644 --- a/plugin/avante.lua +++ b/plugin/avante.lua @@ -15,6 +15,7 @@ vim.g.avante = 1 --- NOTE: We will override vim.paste if img-clip.nvim is available to work with avante.nvim internal logic paste local Clipboard = require("avante.clipboard") local Config = require("avante.config") +local Utils = require("avante.utils") local api = vim.api if Config.support_paste_image() then @@ -115,5 +116,33 @@ cmd("SwitchProvider", function(opts) require("avante.api").switch_provider(vim.t return vim.tbl_filter(function(key) return key:find(prefix, 1, true) == 1 end, Config.providers) end, }) -cmd("Clear", function() require("avante.path").clear() end, { desc = "avante: clear all chat history" }) +cmd("Clear", function(opts) + local arg = vim.trim(opts.args or "") + arg = arg == "" and "history" or arg + if arg == "history" or arg == "memory" then + local sidebar = require("avante").get() + if not sidebar then + Utils.error("No sidebar found") + return + end + if arg == "history" then + sidebar:clear_history() + else + sidebar:reset_memory() + end + elseif arg == "cache" then + local P = require("avante.path") + local history_path = P.history_path:absolute() + local cache_path = P.cache_path:absolute() + local prompt = string.format("Recursively delete %s and %s?", history_path, cache_path) + if vim.fn.confirm(prompt, "&Yes\n&No", 2) == 1 then require("avante.path").clear() end + else + Utils.error("Invalid argument. Valid arguments: 'history', 'memory', 'cache'") + return + end +end, { + desc = "avante: clear history, memory or cache", + nargs = "?", + complete = function(_, _, _) return { "history", "memory", "cache" } end, +}) cmd("ShowRepoMap", function() require("avante.repo_map").show() end, { desc = "avante: show repo map" })