【Bug】rc 原地升级 alpha.5 后所有会话历史加载失败:cache.hydratePrepared is not a function (gateway/internal) #5450
Replies: 2 comments
|
分析得非常扎实——你给出的证据链我逐层复核,全部成立(源码 + npm registry 实测)。补充几处源码级确认、一个方向性细节,和一个给上游的最小补丁方向。 1. Consumer 调用点(alpha.4 源码与你的引用逐行一致) const cache = this.ctx.get('sessionProjectionCache')
return cache === undefined
? registry.hydrate(prepared, {}, events, 0)
: cache.hydratePrepared(prepared, observation.inspection.meta, events)关键点:cache 缺席是一条一等公民路径(直接回退全量 hydrate)——崩溃只发生在「服务存在但旧形」这一种中间态。 2. semver 元组规则的 registry 实测 预发布匹配规则:候选版本只有在范围中存在同 (major,minor,patch) 元组且带预发布号的 comparator 时才被接受。 3. 值得上游注意的方向性细节:provider 是加性演化,坏在单方向 return cache?.hydratePrepared === undefined
? registry.hydrate(prepared, {}, events, 0)
: cache.hydratePrepared(prepared, observation.inspection.meta, events)这符合既有设计意图而非 shim:provider 头注释写明「The cache is a fold shortcut, never an authority」,写路径全部 fail-soft;缺席时走全量 hydrate 本就是设计内路径。旧形 cache 语义上等价于「不可用的 cache」,归入既有缺席分支即可——代价只是冷读多一段尾重放,不会错。磁盘格式零迁移:provider 文档明言 4. 分级修复建议
5. 附带事实(实测)
你的 workaround(pnpm-workspace.yaml overrides 对齐 86 包 + 插件升级)是当前唯一正确路径,验证完备。上面的一行守卫是给上游的补丁方向,用户侧无需等它。 |
|
跟进(0.1.2-rc.1 实测):根因可以进一步收窄—— 已按楼上的方向继续排查。环境更新:从 0.1.1-rc.2 原地升级到 0.1.2-rc.1(next 标签),三插件同步升到适配版(dshmarket@1.41.0 / dsh-better-sidebar@0.18.0 / @michengai/dsh-archive-manager@0.1.29),profile 依赖树用 pnpm overrides 与主程序对齐到 0.1.2-rc.1。启动干净、stdout/stderr 零报错,但模型层仍然不可用。进一步定位到硬证据: 1. 运行时实测( 设置文件可读可写、16 个命名空间全部正常注册,唯独 2. 模型目录实测( settings.yaml 里声明的 tokenrhythm(7 模型)与 opencode-go(15 模型)路由静默缺席,无任何 failure 记录。用户可感知的后果:新建会话输入框直接禁用("当前模型不可用"),唯一显示的 modlens 包装路由( 3. 配置本身无问题(已排除三个常见嫌疑):
4. 顺带修正一个表象误读: 模型设置页"添加自定义提供方"按钮呈禁用态,源码条件是 结论与请求: rc.1 的 llm-pi-ai 适配器在本机静默未完成启动注册(无报错、无 failure、schema 校验通过、bundle 已列入组合树)。为帮助定位,想请官方/其他用户确认:在干净环境(全新 profile、无第三方插件)安装 0.1.2-rc.1 后, 补充基线说明:settings.yaml 中的 |
Uh oh!
There was an error while loading. Please reload this page.
EN TL;DR: After upgrading in-place from 0.1.1-rc.2 to 0.1.2-alpha.5, every existing session fails to load with
failed to project session "...": cache.hydratePrepared is not a function (gateway/internal). Root cause: third-party profile plugins pull@deepseek-ai/dsh-session-projection-cache@0.1.0-rc.8(peer range>=0.1.0-rc.5 <0.2.0can never match the alpha line), whose old-shapedsessionProjectionCacheservice is then consumed by the alpha host'sdsh-session-query, which expects the newhydratePreparedAPI. Verified workaround included below — no rollback needed.环境
@deepseek-ai/dsh0.1.1-rc.2(latest 通道)→ 原地升级 0.1.2-alpha.5(alpha 通道)现象
升级后每个会话(旧会话与新建会话)打开即报错,无法加载历史:
原始会话日志(
session.jsonl.zstd)完好无损,仅读取/投影阶段崩溃。根因分析(本机已逐层验证)
dsh-session-query@0.1.2-alpha.5的调用点(lib/index.jsL392-393):服务不存在时会走正常回退分支(不报错);存在但是旧形时才会崩。出问题的机器属于后者。
dsh-session-projection-cache两个版本的差异:0.1.2-alpha.5定义了hydratePrepared;0.1.0-rc.8完全没有该函数(全文 0 处),只有旧 APIcachedSnapshot。插件把 rc.8 拉进了 profile 依赖树:
@michengai/dsh-archive-manager(0.1.23 与 0.1.24 均如此)声明 peer@deepseek-ai/dsh-session-projection-cache: ">=0.1.0-rc.5 <0.2.0"。按 semver 预发布规则,该范围只能命中0.1.0-rc.8,永远选不中0.1.2-alpha.x(tuple 不同)。插件加载 rc.8 副本后,旧形服务注册进共享上下文,被 alpha 主程序消费即崩。连带问题:alpha.5 家族包之间的互相依赖写成稳定范围
^0.1.2,而0.1.2稳定版从未发布,pnpm 解析直接失败(No matching version found for @deepseek-ai/dsh-client-locale@>=0.1.2 <0.2.0-0、@deepseek-ai/dsh-agent-presets@>=0.1.2 <0.2.0-0等)。另:pnpm v11 已不读 package.json 的pnpm.overrides(需写入pnpm-workspace.yaml),排查时容易绕弯路。已验证的解决方案(保留 alpha,无需回滚)
dshmarket@1.40.0、dsh-better-sidebar@0.18.0-alpha.0、@michengai/dsh-archive-manager@0.1.24(注意 archive-manager 0.1.24 的 peer 范围仍是旧的,见上)。pnpm-workspace.yaml增加 overrides,把家族包强制对齐到与主程序一致的 alpha.5(本机覆盖了 86 个@deepseek-ai/*包,关键包括dsh-session-projection-cache、dsh-client-locale、dsh-agent-presets、dsh-session等),重新pnpm install。对上游的建议
sessionProjectionCache等)能否由 host 保证提供/屏蔽 profile 内旧版副本的注册,避免"alpha 宿主 + rc 插件树"混装即崩;或在 loader 层检测版本错配并给出明确提示(比如启动时校验 profile 树内@deepseek-ai/*与宿主版本的一致性)。>=0.1.2-alpha.2,dsh-better-sidebar@0.18.0-alpha.0已是这种写法),否则在稳定版发布前,alpha 通道的 profile 依赖树无法自然解析。sourceEventSeqs区间导致 rc 读不回)同属"alpha/rc 混用无防护"问题,可统一考虑磁盘格式版本化与读取端的版本护栏。相关讨论:#5160(alpha/rc 写读格式不兼容)、#2438(pnpm 隔离布局)、#2933(web 孤儿进程)。
All reactions