问题描述
在 Memory Forge 中管理 OpenCode 会话时,普通文本消息可以正常擦除,但消息里的工具调用记录无法擦除。这个问题在用户拒绝工具调用后尤其明显:点击对应消息的“擦除”并刷新会话后,被拒绝的工具调用、工具输入或错误/拒绝信息仍然保留。
复现步骤
- 在 OpenCode 中开始一个会话。
- 让助手发起一次工具调用。
- 拒绝该工具调用。
- 完全退出 OpenCode。
- 使用 Memory Forge 打开该会话。
- 对包含该工具调用的消息点击“擦除”。
- 刷新或重新打开该会话。
实际结果
普通文本可能被清空,但工具调用记录仍然存在,导致这一段聊天无法被完整删除。
预期结果
“擦除”应当能够删除所选消息关联的工具调用记录,包括工具的 input、output、error 和状态;或者为每个工具调用提供单独的“擦除工具调用”操作。
可能原因
从当前 OpenCode 适配代码看:
get_session_detail() 会把 tool part 附加到前一个 TimelineBlock;
- 前端对消息执行“擦除”时,目标通常是该消息的
text / reasoning part,而不是附加的 tool part;
update_message() 即使收到 tool part,也只会修改 payload["state"]["output"],不会清除 state.input、state.error、状态或删除整个 tool part;
- 被拒绝的工具调用很可能将可见信息保存在
state.error,因此把 state.output 设置为空字符串不会生效。
相关文件:
src-tauri/src/platforms/opencode.rs
src/features/session/session-detail.tsx
建议
可以考虑:
- 给每个
ToolCallBlock 增加独立的擦除按钮,并使用 tool part 自己的 ID;
- 擦除工具调用时删除完整的 tool part,或同时清理其
input、output、error 和状态;
- 区分“清空文本”“删除所选 part”和“删除整条消息/整轮对话”;
- 如果直接删除 SQLite 记录,建议在事务中处理相关 part/message,避免破坏 OpenCode 会话结构。
环境
- OS:Windows 11
- 平台:OpenCode
- Memory Forge / OpenCode 具体版本如有需要可以补充。
问题描述
在 Memory Forge 中管理 OpenCode 会话时,普通文本消息可以正常擦除,但消息里的工具调用记录无法擦除。这个问题在用户拒绝工具调用后尤其明显:点击对应消息的“擦除”并刷新会话后,被拒绝的工具调用、工具输入或错误/拒绝信息仍然保留。
复现步骤
实际结果
普通文本可能被清空,但工具调用记录仍然存在,导致这一段聊天无法被完整删除。
预期结果
“擦除”应当能够删除所选消息关联的工具调用记录,包括工具的
input、output、error和状态;或者为每个工具调用提供单独的“擦除工具调用”操作。可能原因
从当前 OpenCode 适配代码看:
get_session_detail()会把toolpart 附加到前一个TimelineBlock;text/reasoningpart,而不是附加的toolpart;update_message()即使收到toolpart,也只会修改payload["state"]["output"],不会清除state.input、state.error、状态或删除整个 tool part;state.error,因此把state.output设置为空字符串不会生效。相关文件:
src-tauri/src/platforms/opencode.rssrc/features/session/session-detail.tsx建议
可以考虑:
ToolCallBlock增加独立的擦除按钮,并使用 tool part 自己的 ID;input、output、error和状态;环境