Skip to content

autoSummarize never runs on DSH 0.1.2-rc.1: session.events does not exist (Session exposes snapshotEvents()) #59

Closed

Description

@JoyTTeng

问题描述

在 DSH 0.1.2-rc.1 环境下,dsh-mneme 0.7.7 的 autoSummarize(会话结束自动提炼记忆)从未真正执行过——从安装到现在从未写过任何一条 summary 类型的记忆,llm_audit_logs 表也完全为空(说明它从未发起过 LLM 调用)。

根因

src/summarize.js 的 collectMessages() 遍历的是 session.events:

function collectMessages(session) {
  const messages = [];
  for (const event of session.events ?? []) {   // <-- session.events 不存在
    ...
  }
  return messages.slice(-20);
}

但当前 DSH 0.1.2-rc.1 的 Session 对象没有 events 属性,事件只能通过 session.snapshotEvents() 方法获取。因此 session.events 恒为 undefined → ?? [] 兜底为空数组 → collectMessages 永远返回空 → summarize() 走到 if (!messages.length) return; 直接退出,从不发起 LLM 调用。

同样的写法也出现在 src/inject.js 的 lastUserQuery() 和 extractRounds()(ctx?.agent?.session?.events),同样取不到事件。

证据链

  1. 会话事件流是完整的:我解压了 DSH 的 session.jsonl.zstd,确认 turn/end、request/header(含 provider/model)、user/message 事件都存在且正常触发。
  2. request/header 的 config 里 provider/model 都在(如 {"provider":"ark-coding-plan-vision","model":"deepseek-v4-flash-ga-260731"}),所以 route 解析是能通过的——问题不在路由,而在取消息这一步。
  3. llm_audit_logs 表全空:按代码逻辑,audit 在发起 LLM 调用之前就会创建,只要真的发起过调用就必然有记录。全空 = 从未发起。
  4. autoInject(systemPrompt 注入)正常工作,说明插件本身加载没问题、peer 依赖都满足——只有依赖 session.events 的路径失效。

环境

  • DSH: 0.1.2-rc.1
  • dsh-mneme: 0.7.7
  • 平台: Windows

修复建议

将 session.events 改为 session.snapshotEvents()(DSH Session 提供的公开方法),inject.js 两处同理。改动点:

  • src/summarize.js L81: session.events → session.snapshotEvents()
  • src/inject.js L11、L37: ctx?.agent?.session?.events → 对应 snapshot 方法

如果你能确认 DSH 官方推荐的取事件方式,也请一并告知,我可以按官方写法提交 PR。

Activity

  1. self-assigned this
    on Sep 5, 2026
  2. Anans-Amarre commented on Sep 5, 2026

    @Anans-Amarre
    Collaborator

    感谢你这么详细的根因分析和完整的证据链!空白的 llm_audit_logs、完整的 request/header 配置、以及 autoInject 正常——这些都指向同一个结论:在 DSH 0.1.2-rc.1 上,session.events 这条路径确实失效了。你的诊断完全正确,这份细致程度帮了大忙。

    修复已经就位。按你的建议改用了 snapshotEvents() 方法——但用的是兼容垫片而不是硬切换:

    session.snapshotEvents?.() ?? session.events ?? []

    保留回退的原因是老版本 DSH 仍然有 .events,硬切换会把老版本用户弄坏。src/inject.js 的两处(lastUserQuery() 和 extractRounds())也用了同样的写法,三个位置全部覆盖。

    修复会随下个版本发布。发布后能否请你更新并验证一下 autoSummarize 是否真的写入 summary 记忆了(比如确认出现了 summary 类型记忆、llm_audit_logs 有数据了)?确认后我们会关闭这个 issue。

    如果你想按官方 API 自己提交 PR,也随时欢迎——无论如何,都期待继续收到你的反馈。再次感谢这份优秀的报告!

  3. deleted a comment from Anans-Amarre on Sep 5, 2026
  4. added
    bug功能异常、崩溃、数据错误(agent 诊断 → 人工确认)
    on Sep 6, 2026
  5. moved this from 📋 Backlog to 👀 Review in dsh-mneme 任务看板on Sep 6, 2026
  6. Anans-Amarre commented on Sep 9, 2026

    @Anans-Amarre
    Collaborator

    这个 bug 已经修复了:session.events → 兼容 session.snapshotEvents?.() ?? session.events 的写法,src/summarize.js 和 src/inject.js 两处(collectMessages / lastUserQuery / extractRounds)都已改,随 v0.7.12 发布。

    你报的是 0.7.7,升级到 v0.7.12+ 后 autoSummarize 应该能正常跑(llm_audit_logs 会有记录,summary 类型记忆会落库)。请升级后回测确认,确认没问题我们就可以关掉这个 issue。

  7. modusensus commented on Sep 9, 2026

    @modusensus
    Member

    跟进:该修复自 v0.7.10 起已随版本发布,当前 v0.7.29(npm latest)同样包含(session.snapshotEvents?.() ?? session.events ?? [] 兼容垫片,覆盖 summarize 与 inject 三处)。升级后若 autoSummarize 仍不触发,可反馈 llm_audit_logs 或日志,我再深入排查。issue 保持 open。

  8. moved this from 👀 Review to ✅ Done in dsh-mneme 任务看板on Sep 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bug功能异常、崩溃、数据错误(agent 诊断 → 人工确认)

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions