Skip to content

Session 管理疑问:传入的 sessionId 在 Agent 内部似乎未被使用? #24

@panda-xinyi

Description

@panda-xinyi

Hi,在阅读 Agent 相关代码时发现一个关于 session 管理一致性 的疑问。

背景

services/agent.ts 中,createSession() 会创建一个 session 并存入 activeSessions,随后将该 sessionId 传入 agent.plan()

// services/agent.ts:155
agent.plan(prompt, {
  sessionId: session.id,
  abortController: ...
});

这里看起来是由 Service 层统一管理 session 生命周期,并通过 sessionId 贯穿调用链。


发现的问题

但在 ClaudeAgent.plan() 内部,并没有使用传入的 sessionId,而是重新创建了一个新的 session:

// ClaudeAgent.plan():1495
const session = this.createSession('planning'); // 新建 session
yield { type: 'session', sessionId: session.id };

这会导致:

  • Service 层 activeSessions 中保存的是 session A
  • Agent 内部实际使用并向前端返回的是 session B

前端最终拿到的 sessionId 与 Service 层维护的并非同一个。


潜在影响

这可能会带来一些一致性问题,例如:

  • 当前端调用 /agent/stop/:sessionId
    → 使用的是 Agent 返回的 sessionId
  • 但 Service 层的 activeSessions
    → 只存在最初创建的 sessionId

在这种情况下,是否可能导致 stop 接口无法找到对应的 session?


相关范围

类似的模式在以下方法中似乎也存在:

  • execute()
  • run()

它们内部同样会重新 createSession(),而不是复用上层传入的 sessionId


想确认的问题

  • 是否应该在 ClaudeAgent.plan / execute / run
    • 复用传入的 sessionId
    • 或建立明确的映射关系?

感谢解答 🙏

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions