Bug Description
OpenCode 插件 memcommit 在空 session_id 时没有回退当前会话映射
问题
OpenViking OpenCode 统一插件的 memcommit 工具在用户不希望显式指定 OpenViking session 时,可能因为调用层传入空字符串 session_id: "" 而无法使用当前 OpenCode session 的映射。
实际表现包括:
- 当前 OpenCode session 已经存在有效映射,例如
ses_xxx -> d4293f5f-...。
- 直接调用
memcommit 期望提交当前会话,却返回未绑定错误。
- 如果误把
OPENCODE_RUN_ID 当作 session_id 传入,会绕过映射并请求不存在的 OpenViking session,导致 404。
示例错误:
Error: No OpenViking session is associated with the current OpenCode session. Start or resume a normal OpenCode session first, or pass session_id.
以及:
{
"code": "NOT_FOUND",
"message": "Session not found: 3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b"
}
影响
- 用户明明已有 OpenCode 到 OpenViking 的 session 映射,仍可能无法通过
memcommit 提交当前会话。
- 空字符串参数会被当作显式 session ID,而不是“未传参”。
- 用户容易误用
OPENCODE_RUN_ID,把 OpenCode run id 当成 OpenViking session id,导致 404。
根因
examples/opencode-plugin/lib/memory-tools.mjs 中 memcommit 的 session 解析使用了 nullish coalescing:
const sessionId = args.session_id ?? (context.sessionID ? sessionManager.getMappedSessionId(context.sessionID) : undefined)
这只会在 args.session_id 为 null 或 undefined 时回退映射。空字符串 "" 不是 nullish,因此不会回退当前 OpenCode session 映射。
同时,显式传入的 session_id 被定义为 OpenViking session ID。如果传入的是 OPENCODE_RUN_ID,插件会直接请求 /api/v1/sessions/{OPENCODE_RUN_ID}/commit,而该 session 在 OpenViking 中不存在。
修复建议
在解析 args.session_id 时先规范化空白字符串,将空字符串视为未传参:
const explicitSessionId = args.session_id?.trim() || undefined
const sessionId = explicitSessionId ?? (context.sessionID ? sessionManager.getMappedSessionId(context.sessionID) : undefined)
这样可以保留显式传入有效 OpenViking session ID 的能力,同时让 ""、空白字符串和未传参都回退到当前 OpenCode session 映射。
进一步建议
- 在
memcommit 日志中记录 requested_session_id、resolved_session_id 和 opencode_session_id,便于排查参数来源。
- 在显式 session ID 404 时提示“该参数应为 OpenViking session ID,不是 OpenCode run id”。
- 为
session_id: "" 增加回归测试,确保它和未传参行为一致。
Steps to Reproduce
- 启动openviking server
- opencode.json 中 加入 openviking-opencode-plugin
- 启动opencode
- 增加一条记录: 中文描述
Expected Behavior
memcommit 正常提交
Actual Behavior
提交失败, session not found
Minimal Reproducible Example
Error Logs
{"timestamp":"2026-06-03T06:44:10.131Z","level":"ERROR","tool":"session","message":"Failed to start OpenViking commit","data":{"openviking_session":"3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b","opencode_session":"ses_173db18deffe7SlHuAgEcl43AL","error":"Request failed (404): {\"code\":\"NOT_FOUND\",\"message\":\"Session not found: 3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b\",\"details\":{\"type\":\"session\",\"resource\":\"3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b\"}}"}}
{"timestamp":"2026-06-03T06:44:10.139Z","level":"ERROR","tool":"memcommit","message":"Commit failed","data":{"error":"Failed to start OpenViking session commit","session_id":"3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b"}}
这个日志可能不是刚好memcommit最开始那个错误, agent自己再尝试改变memcommit的参数调用方式
OpenViking Version
0.3.22
Python Version
3.11.15
Operating System
Windows
Model Backend
OpenAI
Additional Context
使用的最新版opencode-plugin
Bug Description
OpenCode 插件 memcommit 在空 session_id 时没有回退当前会话映射
问题
OpenViking OpenCode 统一插件的
memcommit工具在用户不希望显式指定 OpenViking session 时,可能因为调用层传入空字符串session_id: ""而无法使用当前 OpenCode session 的映射。实际表现包括:
ses_xxx -> d4293f5f-...。memcommit期望提交当前会话,却返回未绑定错误。OPENCODE_RUN_ID当作session_id传入,会绕过映射并请求不存在的 OpenViking session,导致 404。示例错误:
以及:
{ "code": "NOT_FOUND", "message": "Session not found: 3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b" }影响
memcommit提交当前会话。OPENCODE_RUN_ID,把 OpenCode run id 当成 OpenViking session id,导致 404。根因
examples/opencode-plugin/lib/memory-tools.mjs中memcommit的 session 解析使用了 nullish coalescing:这只会在
args.session_id为null或undefined时回退映射。空字符串""不是 nullish,因此不会回退当前 OpenCode session 映射。同时,显式传入的
session_id被定义为 OpenViking session ID。如果传入的是OPENCODE_RUN_ID,插件会直接请求/api/v1/sessions/{OPENCODE_RUN_ID}/commit,而该 session 在 OpenViking 中不存在。修复建议
在解析
args.session_id时先规范化空白字符串,将空字符串视为未传参:这样可以保留显式传入有效 OpenViking session ID 的能力,同时让
""、空白字符串和未传参都回退到当前 OpenCode session 映射。进一步建议
memcommit日志中记录requested_session_id、resolved_session_id和opencode_session_id,便于排查参数来源。session_id: ""增加回归测试,确保它和未传参行为一致。Steps to Reproduce
Expected Behavior
memcommit 正常提交
Actual Behavior
提交失败, session not found
Minimal Reproducible Example
Error Logs
{"timestamp":"2026-06-03T06:44:10.131Z","level":"ERROR","tool":"session","message":"Failed to start OpenViking commit","data":{"openviking_session":"3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b","opencode_session":"ses_173db18deffe7SlHuAgEcl43AL","error":"Request failed (404): {\"code\":\"NOT_FOUND\",\"message\":\"Session not found: 3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b\",\"details\":{\"type\":\"session\",\"resource\":\"3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b\"}}"}} {"timestamp":"2026-06-03T06:44:10.139Z","level":"ERROR","tool":"memcommit","message":"Commit failed","data":{"error":"Failed to start OpenViking session commit","session_id":"3c9e48df-c8ec-4ac9-b9bb-19164fee6a1b"}} 这个日志可能不是刚好memcommit最开始那个错误, agent自己再尝试改变memcommit的参数调用方式OpenViking Version
0.3.22
Python Version
3.11.15
Operating System
Windows
Model Backend
OpenAI
Additional Context
使用的最新版opencode-plugin