Skip to content

OpenCode:无法擦除工具调用记录,尤其是被拒绝的工具调用 #6

Description

@Luxciax

问题描述

在 Memory Forge 中管理 OpenCode 会话时,普通文本消息可以正常擦除,但消息里的工具调用记录无法擦除。这个问题在用户拒绝工具调用后尤其明显:点击对应消息的“擦除”并刷新会话后,被拒绝的工具调用、工具输入或错误/拒绝信息仍然保留。

复现步骤

  1. 在 OpenCode 中开始一个会话。
  2. 让助手发起一次工具调用。
  3. 拒绝该工具调用。
  4. 完全退出 OpenCode。
  5. 使用 Memory Forge 打开该会话。
  6. 对包含该工具调用的消息点击“擦除”。
  7. 刷新或重新打开该会话。

实际结果

普通文本可能被清空,但工具调用记录仍然存在,导致这一段聊天无法被完整删除。

预期结果

“擦除”应当能够删除所选消息关联的工具调用记录,包括工具的 inputoutputerror 和状态;或者为每个工具调用提供单独的“擦除工具调用”操作。

可能原因

从当前 OpenCode 适配代码看:

  • get_session_detail() 会把 tool part 附加到前一个 TimelineBlock
  • 前端对消息执行“擦除”时,目标通常是该消息的 text / reasoning part,而不是附加的 tool part;
  • update_message() 即使收到 tool part,也只会修改 payload["state"]["output"],不会清除 state.inputstate.error、状态或删除整个 tool part;
  • 被拒绝的工具调用很可能将可见信息保存在 state.error,因此把 state.output 设置为空字符串不会生效。

相关文件:

  • src-tauri/src/platforms/opencode.rs
  • src/features/session/session-detail.tsx

建议

可以考虑:

  1. 给每个 ToolCallBlock 增加独立的擦除按钮,并使用 tool part 自己的 ID;
  2. 擦除工具调用时删除完整的 tool part,或同时清理其 inputoutputerror 和状态;
  3. 区分“清空文本”“删除所选 part”和“删除整条消息/整轮对话”;
  4. 如果直接删除 SQLite 记录,建议在事务中处理相关 part/message,避免破坏 OpenCode 会话结构。

环境

  • OS:Windows 11
  • 平台:OpenCode
  • Memory Forge / OpenCode 具体版本如有需要可以补充。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions