feat: better tool ui (#2669)

This commit is contained in:
yetone
2025-09-01 22:52:54 +08:00
committed by GitHub
parent 15d19518b1
commit 8794356cf4

View File

@@ -25,6 +25,52 @@ local function text_to_lines(text, decoration)
return lines return lines
end end
---Converts text into format suitable for UI
---@param text string
---@param decoration string | nil
---@param truncate boolean | nil
---@return avante.ui.Line[]
local function text_to_truncated_lines(text, decoration, truncate)
local text_lines = vim.split(text, "\n")
local lines = {}
for _, text_line in ipairs(text_lines) do
if truncate and #lines > 3 then
table.insert(
lines,
Line:new({
{ decoration },
{ string.format("... (Result truncated, remaining %d lines not shown)", #text_lines - #lines + 1) },
})
)
break
end
table.insert(lines, Line:new({ { decoration }, { text_line } }))
end
return lines
end
---@param lines avante.ui.Line[]
---@param decoration string | nil
---@param truncate boolean | nil
---@return avante.ui.Line[]
local function lines_to_truncated_lines(lines, decoration, truncate)
local truncated_lines = {}
for idx, line in ipairs(lines) do
if truncate and #truncated_lines > 3 then
table.insert(
truncated_lines,
Line:new({
{ decoration },
{ string.format("... (Result truncated, remaining %d lines not shown)", #lines - idx + 1) },
})
)
break
end
table.insert(truncated_lines, line)
end
return truncated_lines
end
---Converts "thinking" item into format suitable for UI ---Converts "thinking" item into format suitable for UI
---@param item AvanteLLMMessageContentItem ---@param item AvanteLLMMessageContentItem
---@return avante.ui.Line[] ---@return avante.ui.Line[]
@@ -142,7 +188,6 @@ function M.get_content_lines(content, decoration, truncate)
end end
if type(content_obj) == "table" then if type(content_obj) == "table" then
if islist(content_obj) then if islist(content_obj) then
local line_count = 0
local all_lines = {} local all_lines = {}
for _, content_item in ipairs(content_obj) do for _, content_item in ipairs(content_obj) do
if type(content_item) == "string" then if type(content_item) == "string" then
@@ -150,38 +195,34 @@ function M.get_content_lines(content, decoration, truncate)
all_lines = vim.list_extend(all_lines, lines_) all_lines = vim.list_extend(all_lines, lines_)
end end
end end
for idx, line in ipairs(all_lines) do local lines_ = lines_to_truncated_lines(all_lines, decoration, truncate)
if truncate and line_count > 3 then lines = vim.list_extend(lines, lines_)
table.insert(
lines,
Line:new({
{ decoration },
{ string.format("... (Result truncated, remaining %d lines not shown)", #all_lines - idx + 1) },
})
)
break
end
line_count = line_count + 1
table.insert(lines, line)
end
end end
if type(content_obj.content) == "string" then if type(content_obj.content) == "string" then
local line_count = 0 local lines_ = text_to_truncated_lines(content_obj.content, decoration, truncate)
local lines_ = text_to_lines(content_obj.content, decoration) lines = vim.list_extend(lines, lines_)
for idx, line in ipairs(lines_) do end
if truncate and line_count > 3 then if islist(content_obj.content) then
table.insert( local all_lines = {}
lines, for _, content_item in ipairs(content_obj.content) do
Line:new({ if type(content_item) == "string" then
{ decoration }, local lines_ = text_to_lines(content_item, decoration)
{ string.format("... (Result truncated, remaining %d lines not shown)", #lines_ - idx + 1) }, all_lines = vim.list_extend(all_lines, lines_)
})
)
break
end end
line_count = line_count + 1
table.insert(lines, line)
end end
local lines_ = lines_to_truncated_lines(all_lines, decoration, truncate)
lines = vim.list_extend(lines, lines_)
end
if islist(content_obj.matches) then
local all_lines = {}
for _, content_item in ipairs(content_obj.matches) do
if type(content_item) == "string" then
local lines_ = text_to_lines(content_item, decoration)
all_lines = vim.list_extend(all_lines, lines_)
end
end
local lines_ = lines_to_truncated_lines(all_lines, decoration, truncate)
lines = vim.list_extend(lines, lines_)
end end
end end
if type(content_obj) == "string" then if type(content_obj) == "string" then
@@ -202,6 +243,9 @@ function M.get_content_lines(content, decoration, truncate)
table.insert(lines, line) table.insert(lines, line)
end end
end end
if type(content_obj) == "number" then
table.insert(lines, Line:new({ { decoration }, { tostring(content_obj) } }))
end
if islist(content) then if islist(content) then
for _, content_item in ipairs(content) do for _, content_item in ipairs(content) do
local line_count = 0 local line_count = 0
@@ -265,7 +309,7 @@ function M.get_tool_display_name(message)
local pieces = vim.split(param, "\n") local pieces = vim.split(param, "\n")
if #pieces > 1 then param = pieces[1] .. "..." end if #pieces > 1 then param = pieces[1] .. "..." end
end end
if path then if not param and path then
local relative_path = Utils.relative_path(path) local relative_path = Utils.relative_path(path)
param = relative_path param = relative_path
end end
@@ -409,7 +453,7 @@ function M.message_to_lines(message, messages)
if message.displayed_content then return text_to_lines(message.displayed_content) end if message.displayed_content then return text_to_lines(message.displayed_content) end
local content = message.message.content local content = message.message.content
if type(content) == "string" then return text_to_lines(content) end if type(content) == "string" then return text_to_lines(content) end
if vim.islist(content) then if islist(content) then
local lines = {} local lines = {}
for _, item in ipairs(content) do for _, item in ipairs(content) do
local item_lines = message_content_item_to_lines(item, message, messages) local item_lines = message_content_item_to_lines(item, message, messages)
@@ -437,7 +481,7 @@ end
function M.message_to_text(message, messages) function M.message_to_text(message, messages)
local content = message.message.content local content = message.message.content
if type(content) == "string" then return content end if type(content) == "string" then return content end
if vim.islist(content) then if islist(content) then
return vim return vim
.iter(content) .iter(content)
:map(function(item) return message_content_item_to_text(item, message, messages) end) :map(function(item) return message_content_item_to_text(item, message, messages) end)