feat: better tool ui (#2669)
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user