Replies: 1 comment
|
这条和 seq gap 不一样:日志结构是完整的,但仓外插件写了 dsh-session-surgeon 能做的、和不能做的:
dsh plugin --profile web add "github:xiaoshenming/dsh-session-surgeon#main"重启 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
现象
第三方插件调
session.append写入自己声明的事件类型之后,那个会话就无法再打开——不是丢失几行,是整份日志被拒绝解释。
版本:
0.1.0-rc.8。最小复现
一个十行的插件:
装上、开一个会话(
agent/session-start就会写入,不必发消息)、重启 dsh,再打开那个会话:
此后该会话一直打不开,插件仍然装着也一样。
要等进程重启后从磁盘恢复,
assertEventsSupported才会拒绝。所以在真实使用中它的形态是「写入当天没事,第二天打不开」。
机制
拒绝发生在
packages/session/session-persistence/src/coordinator.ts的assertEventsSupported:两个放行条件对仓外插件都不成立:
①
KNOWN_SESSION_EVENT_TYPES是生成的。packages/core/session/src/known-event-types.ts的文件头是GENERATED by scripts/gen-persistence-catalog.ts,内容是「EverySessionEventMapmemberdeclared in this repository」。同一段文档也写明了仓外类型的处境:
②
Session.append()不接受ignorable。它在
packages/core/session/src/index.ts里自行构造 envelope,可选参数位是T extends SurfaceEventType ? [opts: SurfaceIntent] : [],而SurfaceIntent中只有sourceEventSeqs与surfaceOp会被读出。写入方没有途径把ignorable放到 envelope 上。现有 workaround 的边界
我们在插件加载时把自己的事件类型
add进KNOWN_SESSION_EVENT_TYPES(运行时它是个真Set)。两处它覆盖不到:a) 插件卸载后,那些会话仍然打不开。
b) 它要求插件与 dsh 解析到同一个
@deepseek-ai/dsh-session模块实例。普通安装成立;dsh 从源码 checkout 用
tsx运行时不成立——两侧得到各自的模块图。同一进程内加探针实测:
背景
这个 consumer 是
dsh-swarmdrop,用session event 承载对话行与
@引用候选。需要更多细节或复现环境的话我们可以提供。
All reactions