Skip to content

[Bug]:OpenCode 插件 memcommit 在空 session_id 时没有回退当前会话映射 #2412

Description

@HWliao

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.mjsmemcommit 的 session 解析使用了 nullish coalescing:

const sessionId = args.session_id ?? (context.sessionID ? sessionManager.getMappedSessionId(context.sessionID) : undefined)

这只会在 args.session_idnullundefined 时回退映射。空字符串 "" 不是 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_idresolved_session_idopencode_session_id,便于排查参数来源。
  • 在显式 session ID 404 时提示“该参数应为 OpenViking session ID,不是 OpenCode run id”。
  • session_id: "" 增加回归测试,确保它和未传参行为一致。

Steps to Reproduce

  1. 启动openviking server
  2. opencode.json 中 加入 openviking-opencode-plugin
  3. 启动opencode
  4. 增加一条记录: 中文描述

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions