fix: compatible with zed claude code acp (#2676)

This commit is contained in:
yetone
2025-09-03 00:12:49 +08:00
committed by GitHub
parent ebed32d7e3
commit 9f0bb4bfb9
2 changed files with 38 additions and 9 deletions

View File

@@ -11,16 +11,19 @@ local islist = vim.islist or vim.tbl_islist
---Converts text into format suitable for UI
---@param text string
---@param decoration string | nil
---@param filter? fun(text_line: string, idx: integer, len: integer): boolean
---@return avante.ui.Line[]
local function text_to_lines(text, decoration)
local function text_to_lines(text, decoration, filter)
local text_lines = vim.split(text, "\n")
local lines = {}
for _, text_line in ipairs(text_lines) do
for idx, text_line in ipairs(text_lines) do
if filter and not filter(text_line, idx, #text_lines) then goto continue end
if decoration then
table.insert(lines, Line:new({ { decoration }, { text_line } }))
else
table.insert(lines, Line:new({ { text_line } }))
end
::continue::
end
return lines
end
@@ -263,7 +266,11 @@ function M.get_content_lines(content, decoration, truncate)
local line_count = 0
if content_item.type == "content" then
if content_item.content.type == "text" then
local lines_ = text_to_lines(content_item.content.text, decoration)
local lines_ = text_to_lines(content_item.content.text, decoration, function(text_line, idx, len)
if idx == 1 and text_line:match("^%s*```%s*$") then return false end
if idx == len and text_line:match("^%s*```%s*$") then return false end
return true
end)
for idx, line in ipairs(lines_) do
if truncate and line_count > 3 then
table.insert(
@@ -416,12 +423,20 @@ local function tool_to_lines(item, message, messages)
vim.list_extend(lines, diff_lines)
end
end
if result and result.content then
local result_content = result.content
if result_content then
local content_lines = M.get_content_lines(result_content, decoration, true)
if message.acp_tool_call and message.acp_tool_call.content then
local content = message.acp_tool_call.content
if content then
local content_lines = M.get_content_lines(content, decoration, true)
vim.list_extend(lines, content_lines)
end
else
if result and result.content then
local result_content = result.content
if result_content then
local content_lines = M.get_content_lines(result_content, decoration, true)
vim.list_extend(lines, content_lines)
end
end
end
if #lines <= 1 then table.insert(lines, Line:new({ { decoration }, { "completed" } })) end
local last_line = lines[#lines]

View File

@@ -800,6 +800,7 @@ end
---@param opts AvanteLLMStreamOptions
function M._stream_acp(opts)
Utils.debug("use ACP", Config.provider)
local Render = require("avante.history.render")
---@type table<string, avante.HistoryMessage>
local tool_call_messages = {}
@@ -903,8 +904,12 @@ function M._stream_acp(opts)
id = update.toolCallId,
name = "",
})
tool_call_messages[update.toolCallId] = tool_call_message
tool_call_message.acp_tool_call = update
end
if tool_call_message.acp_tool_call then
tool_call_message.acp_tool_call = vim.tbl_deep_extend("force", tool_call_message.acp_tool_call, update)
end
tool_call_message.tool_use_logs = tool_call_message.tool_use_logs or {}
tool_call_message.tool_use_log_lines = tool_call_message.tool_use_log_lines or {}
local tool_result_message
@@ -917,7 +922,7 @@ function M._stream_acp(opts)
tool_result_message = History.Message:new("assistant", {
type = "tool_result",
tool_use_id = update.toolCallId,
content = update.content,
content = nil,
is_error = update.status == "failed",
is_user_declined = update.status == "cancelled",
})
@@ -928,7 +933,16 @@ function M._stream_acp(opts)
end
end,
on_request_permission = function(tool_call, options, callback)
local message = add_tool_call_message(tool_call)
local message = tool_call_messages[tool_call.toolCallId]
if not message then
add_tool_call_message(tool_call)
else
if message.acp_tool_call then
message.acp_tool_call = vim.tbl_deep_extend("force", message.acp_tool_call, tool_call)
tool_call = message.acp_tool_call
end
end
---@cast tool_call avante.acp.ToolCall
local items = vim
.iter(options)
:map(