feat: keep the history content in the resp buffer (#807)
This commit is contained in:
parent
0aa2659580
commit
9fbe0256f2
@ -1,5 +1,6 @@
|
|||||||
local fn, api = vim.fn, vim.api
|
local fn, api = vim.fn, vim.api
|
||||||
local Utils = require("avante.utils")
|
local Utils = require("avante.utils")
|
||||||
|
local LRUCache = require("avante.utils.lru_cache")
|
||||||
local Path = require("plenary.path")
|
local Path = require("plenary.path")
|
||||||
local Scan = require("plenary.scandir")
|
local Scan = require("plenary.scandir")
|
||||||
local Config = require("avante.config")
|
local Config = require("avante.config")
|
||||||
@ -27,6 +28,8 @@ end
|
|||||||
---@param mode LlmMode
|
---@param mode LlmMode
|
||||||
H.get_mode_file = function(mode) return string.format("custom.%s.avanterules", mode) end
|
H.get_mode_file = function(mode) return string.format("custom.%s.avanterules", mode) end
|
||||||
|
|
||||||
|
local history_file_cache = LRUCache:new(12)
|
||||||
|
|
||||||
-- History path
|
-- History path
|
||||||
local History = {}
|
local History = {}
|
||||||
|
|
||||||
@ -39,11 +42,16 @@ History.get = function(bufnr) return Path:new(Config.history.storage_path):joinp
|
|||||||
---@param bufnr integer
|
---@param bufnr integer
|
||||||
History.load = function(bufnr)
|
History.load = function(bufnr)
|
||||||
local history_file = History.get(bufnr)
|
local history_file = History.get(bufnr)
|
||||||
|
local cached_key = tostring(history_file:absolute())
|
||||||
|
local cached_value = history_file_cache:get(cached_key)
|
||||||
|
if cached_value ~= nil then return cached_value end
|
||||||
|
local value = {}
|
||||||
if history_file:exists() then
|
if history_file:exists() then
|
||||||
local content = history_file:read()
|
local content = history_file:read()
|
||||||
return content ~= nil and vim.json.decode(content) or {}
|
value = content ~= nil and vim.json.decode(content) or {}
|
||||||
end
|
end
|
||||||
return {}
|
history_file_cache:set(cached_key, value)
|
||||||
|
return value
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Saves the chat history for the given buffer.
|
-- Saves the chat history for the given buffer.
|
||||||
@ -51,7 +59,9 @@ end
|
|||||||
---@param history table
|
---@param history table
|
||||||
History.save = vim.schedule_wrap(function(bufnr, history)
|
History.save = vim.schedule_wrap(function(bufnr, history)
|
||||||
local history_file = History.get(bufnr)
|
local history_file = History.get(bufnr)
|
||||||
|
local cached_key = tostring(history_file:absolute())
|
||||||
history_file:write(vim.json.encode(history), "w")
|
history_file:write(vim.json.encode(history), "w")
|
||||||
|
history_file_cache:set(cached_key, history)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
P.history = History
|
P.history = History
|
||||||
|
@ -1022,10 +1022,14 @@ local function delete_last_n_chars(bufnr, n)
|
|||||||
end
|
end
|
||||||
|
|
||||||
---@param content string concatenated content of the buffer
|
---@param content string concatenated content of the buffer
|
||||||
---@param opts? {focus?: boolean, stream?: boolean, scroll?: boolean, backspace?: integer, callback?: fun(): nil} whether to focus the result view
|
---@param opts? {focus?: boolean, scroll?: boolean, backspace?: integer, ignore_history?: boolean, callback?: fun(): nil} whether to focus the result view
|
||||||
function Sidebar:update_content(content, opts)
|
function Sidebar:update_content(content, opts)
|
||||||
if not self.result or not self.result.bufnr then return end
|
if not self.result or not self.result.bufnr then return end
|
||||||
opts = vim.tbl_deep_extend("force", { focus = true, scroll = true, stream = false, callback = nil }, opts or {})
|
opts = vim.tbl_deep_extend("force", { focus = true, scroll = true, stream = false, callback = nil }, opts or {})
|
||||||
|
if not opts.ignore_history then
|
||||||
|
local chat_history = Path.history.load(self.code.bufnr)
|
||||||
|
content = self:get_history_content(chat_history) .. "---\n\n" .. content
|
||||||
|
end
|
||||||
if opts.stream then
|
if opts.stream then
|
||||||
local scroll_to_bottom = function()
|
local scroll_to_bottom = function()
|
||||||
local last_line = api.nvim_buf_line_count(self.result.bufnr)
|
local last_line = api.nvim_buf_line_count(self.result.bufnr)
|
||||||
@ -1117,7 +1121,7 @@ function Sidebar:get_layout()
|
|||||||
return vim.tbl_contains({ "left", "right" }, calculate_config_window_position()) and "vertical" or "horizontal"
|
return vim.tbl_contains({ "left", "right" }, calculate_config_window_position()) and "vertical" or "horizontal"
|
||||||
end
|
end
|
||||||
|
|
||||||
function Sidebar:update_content_with_history(history)
|
function Sidebar:get_history_content(history)
|
||||||
local content = ""
|
local content = ""
|
||||||
for idx, entry in ipairs(history) do
|
for idx, entry in ipairs(history) do
|
||||||
local prefix =
|
local prefix =
|
||||||
@ -1126,7 +1130,12 @@ function Sidebar:update_content_with_history(history)
|
|||||||
content = content .. entry.response .. "\n\n"
|
content = content .. entry.response .. "\n\n"
|
||||||
if idx < #history then content = content .. "---\n\n" end
|
if idx < #history then content = content .. "---\n\n" end
|
||||||
end
|
end
|
||||||
self:update_content(content)
|
return content
|
||||||
|
end
|
||||||
|
|
||||||
|
function Sidebar:update_content_with_history(history)
|
||||||
|
local content = self:get_history_content(history)
|
||||||
|
self:update_content(content, { ignore_history = true })
|
||||||
end
|
end
|
||||||
|
|
||||||
---@return string, integer
|
---@return string, integer
|
||||||
@ -1344,11 +1353,11 @@ function Sidebar:create_input(opts)
|
|||||||
local cur_displayed_response = generate_display_content(transformed)
|
local cur_displayed_response = generate_display_content(transformed)
|
||||||
if is_first_chunk then
|
if is_first_chunk then
|
||||||
is_first_chunk = false
|
is_first_chunk = false
|
||||||
self:update_content(content_prefix .. chunk, { stream = false, scroll = true })
|
self:update_content(content_prefix .. chunk, { scroll = true })
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local suffix = get_display_content_suffix(transformed)
|
local suffix = get_display_content_suffix(transformed)
|
||||||
self:update_content(content_prefix .. cur_displayed_response .. suffix, { stream = false, scroll = true })
|
self:update_content(content_prefix .. cur_displayed_response .. suffix, { scroll = true })
|
||||||
vim.schedule(function() vim.cmd("redraw") end)
|
vim.schedule(function() vim.cmd("redraw") end)
|
||||||
displayed_response = cur_displayed_response
|
displayed_response = cur_displayed_response
|
||||||
end
|
end
|
||||||
@ -1356,16 +1365,23 @@ function Sidebar:create_input(opts)
|
|||||||
---@type AvanteCompleteParser
|
---@type AvanteCompleteParser
|
||||||
local on_complete = function(err)
|
local on_complete = function(err)
|
||||||
if err ~= nil then
|
if err ~= nil then
|
||||||
self:update_content("\n\nError: " .. vim.inspect(err), { stream = true, scroll = true })
|
self:update_content(
|
||||||
|
content_prefix .. displayed_response .. "\n\nError: " .. vim.inspect(err),
|
||||||
|
{ scroll = true }
|
||||||
|
)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Execute when the stream request is actually completed
|
-- Execute when the stream request is actually completed
|
||||||
self:update_content("\n\n**Generation complete!** Please review the code suggestions above.\n", {
|
self:update_content(
|
||||||
stream = true,
|
content_prefix
|
||||||
scroll = true,
|
.. displayed_response
|
||||||
callback = function() api.nvim_exec_autocmds("User", { pattern = VIEW_BUFFER_UPDATED_PATTERN }) end,
|
.. "\n\n**Generation complete!** Please review the code suggestions above.\n",
|
||||||
})
|
{
|
||||||
|
scroll = true,
|
||||||
|
callback = function() api.nvim_exec_autocmds("User", { pattern = VIEW_BUFFER_UPDATED_PATTERN }) end,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
vim.defer_fn(function()
|
vim.defer_fn(function()
|
||||||
if self.result and self.result.winid and api.nvim_win_is_valid(self.result.winid) then
|
if self.result and self.result.winid and api.nvim_win_is_valid(self.result.winid) then
|
||||||
|
Loading…
x
Reference in New Issue
Block a user