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 具体版本如有需要可以补充。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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