Repository navigation
Replies: 2 comments 1 reply
|
定位对的,但你建议的降级形态恰好是 v4 现在拒绝的那一种,按它改会把"v2→v3 迁移中止"换成"v4 读不出来"。 白名单确实在源码里
const SOURCE_KINDS = new Set(['user', 'plugin', 'model', 'tool', 'agent-instructions', 'session-reference', 'team-message', 'goal', 'skill-invocation', 'skill-catalog', 'coordinator', 'subagent-report', 'subagent-settled', 'webhook', 'agent-message'])15 个,确实没有 (你引的是 为什么"包一层 plugin"不行 v2→v3 的白名单里有 if (!isSessionFormatJsonObject(value) || typeof value['kind'] !== 'string' || value['kind'].length === 0 || value['kind'] === 'plugin') {
throw new SessionFormatError('format v4 message requires a producer-owned source kind')
}判据只有三条:是对象、 所以 更小也更一致的改法 不要降级,把白名单放宽。v4 的规则是"任意非空字符串,除了 这样改还有两个附带好处:一是与你引的那份文档里"不可读子会话不再阻断健康父历史"的原则同向 —— 单条未知 kind 不再能否决整份 artifact;二是它把"哪些 kind 合法"收敛到一个规则上,而不是维护三份各自演进的名单。 一处残留风险要说清: |
|
补一段同一个病在另一处的表现(原常用文件夹需要反复提权审批),供后来搜到这条讨论的人参考。 |
Uh oh!
There was an error while loading. Please reload this page.
环境:dsh 0.2.0-rc.2(Windows),从 0.1.1-rc.2 升级上来。
现象:升级后有一个老会话打不开。迁移链在
dsh-session-format-v2-to-v3/lib/index.js:123-125 的 assertSource() 抛
SessionFormatUnsupportedMigrationError: "cannot safely transform unclassified
message source",整份迁移中止,该会话永久无法加载(日志内容完好、帧结构完整)。
根因:这份日志的 header 是 version 0(老代际),但里面混有若干条
source.kind="dsh-knowledge" —— 那是 dsh-knowledge 0.5.x 在 v4 下写的
"生产者自有 kind"(对 v4 合法),而 v2→v3 的 SOURCE_KINDS 白名单
(同文件 L14-30)里没有它。
建议:迁移器对"不认识的 source.kind"改成逐条降级(例如包一层
{kind:"plugin", plugin:<原 kind>})并记 warning,而不是整份拒绝;
否则一条历史消息就让整个会话永久不可读。这也符合官方文档
2026-08-31-released-session-format-migrations.zh.md 里
"不可读子会话不再阻断健康父历史"的同一条原则。
补充(手工修复路径,供参考):
把该 kind 改回 {kind:"plugin", plugin:"dsh-knowledge"},并按原帧边界重压 ——
第一帧必须只装 header 一行,若把整个日志压成单帧会被判
"corrupt Zstandard session log: first frame is not exactly one header line"。
相关:dsh-knowledge 0.5.0 CHANGELOG 的 "use a producer-owned dsh-knowledge
source for auto-retrieval messages, avoiding DSH v4's rejection of legacy
plugin wrappers" 修好了 v4 侧,但老代际会话仍会被 v2→v3 白名单卡住。
All reactions