Skip to content

【升级到 dsh 0.1.3-alpha.2+ 后】新建会话失败、历史会话发消息无响应:persona 插件配置字段改名导致预设装配失败 #101

Open

Description

@BrokenReflection

问题现象

升级(dsh-v0.1.2-rc.1 → 0.1.3-alpha.2+)并重新 build 后,Web UI 界面无任何报错:

  1. 点击「新会话」无法创建会话;
  2. 历史会话发送消息后无响应(会话日志零追加)。

问题根因

DSH的提交 40792330c0 将 @deepseek-ai/dsh-persona 插件的配置字段 text 改名为 prefix(必填,fail-loud 校验)。

自定义 Agent 预设(agent.cordis.yml)中的 persona 行仍用旧字段 text,导致预设装配失败;而装配失败会阻断所有消费者:

  • session/create 需先装配默认预设 → 被 agent-preset/invalid 拒绝;
  • session/prompt 需按会话存储的预设装配 Agent → 同样被拒。

错误只在 RPC 响应体里(result.ok: false),UI 不展示,故表现为「无响应」。

解决方式

预设里 persona 行改用新字段名(agent.cordis.yml):

- id: persona
  name: '@deepseek-ai/dsh-persona'
  config:
    prefix: ...   # 旧字段名 text

Activity

  1. added a commit that references this issue on Sep 8, 2026
    02ac43e
  2. xrk-hhh commented on Sep 9, 2026

    @xrk-hhh

    补充一条同根因、但现象更严重的实测记录(dsh 0.1.5-alpha.1,Windows 11,源码构建),供一并排查。

    除「无响应」外,还会把 CPU 打满

    用户侧感受是「dsh 卡顿,设置里的功能也卡」:node 进程持续占用 ~100% 单核(实测 10 秒墙钟消耗 9.5 秒 CPU),而界面并不报错。

    机制(插桩实测)

    打开的会话页会对该会话持续重试 resume(约 25 次/秒)。每次重试都走完整链路:

    session-controller.resumeObserved → composeAgent → preset.resolve() → list() → discoverPresets()

    而 discoverPresets() 无缓存:每次都重新读取并对所有预设的每一行做一次 existsSync 体检。CPU profile 中 existsSync 占 37%、unresolvableRows 占 35%。

    插桩日志(resumeObserved 内捕获):

    [RESUME-ERR] agent-presets: preset "router-standard" failed to mount:
      failed to apply loader entry persona (@deepseek-ai/dsh-persona): invalid config:
      - $.prefix missing required value (at prefix)
      (.dsh/.agent-presets/router-standard/agent.cordis.yml)
    

    即:装配失败 → 客户端重试 → 每次重试触发全量预设体检 → CPU 打满 → 整个 UI(含设置页)卡顿。失败与重试之间没有任何退避。

    受影响范围

    本机 0.1.5-alpha.1 实测:router-standard / router-spec / router-react 三个预设的 persona 行均为 text:,全部无法装配;仓库内 preset/router-*/agent.cordis.yml 同步确认(截至 e3f00b2)。

    临时修复与效果

    persona 行 text: → prefix:(已装目录 + 仓库副本各一处),改完:

    修复前 修复后
    CPU 100% 单核(持续) 0.5%
    装配错误 ~25 次/秒 0
    预设挂载 失败循环 正常

    另

    harness 侧的「体检无缓存 + 失败无退避」已在官方 Discussions 单独反馈(含 profile 数据):
    deepseek-ai/deepseek-harness#6012

  3. limpidautumn commented on Sep 10, 2026

    @limpidautumn

    遇到了相同问题,今天还没修。

    临时补丁脚本:

    Windows

    gci "$(if($env:DSH_HOME){$env:DSH_HOME}else{"$HOME\.dsh"})\.agent-presets\*\agent.cordis.yml" | %{[IO.File]::WriteAllText($_.FullName,([IO.File]::ReadAllText($_.FullName) -replace '(?m)^    text:','    prefix:'))}

    Linux

    DSH_HOME=${DSH_HOME:-$HOME/.dsh}; sed -i.bak 's/^    text:/    prefix:/' "$DSH_HOME"/.agent-presets/*/agent.cordis.yml
  4. zhou-dingkun commented on Sep 12, 2026

    @zhou-dingkun

    补充:同现象的另一根因——agent-presets.default 悬空(不是 persona 字段问题)

    本机在 dsh 0.1.5-rc.1(Windows 11)出现与主帖完全相同的现象,但排查后确认根因不同,记录在此供对照。

    现象

    • Web UI 无任何报错;点「新会话」不创建会话
    • 历史会话发消息无响应
    • 已在运行中的会话仍然正常(当时正用一个旧会话,全程可用)

    先排除主帖的根因

    • 逐行检查 ~/.dsh/profiles/node_modules/@deepseek-ai/dsh-agent-presets/presets/*/agent.cordis.yml:内置预设用的都是新字段 prefix:,不存在 text:
    • 本机未安装 routing-suite(profile 插件清单里没有、磁盘上也没有 router-* 预设)

    → 主帖的 persona 字段改名机制在本机不成立。

    定位过程

    1. 会话 header 在 ~/.dsh/sessions/<workspace>/<session>/session.jsonl.zstd,用 Node 内置 zstd 解压统计:
    const fs=require('fs'),path=require('path'),zlib=require('zlib');
    const t={};
    (function w(d){for(const e of fs.readdirSync(d,{withFileTypes:true})){const p=path.join(d,e.name);
      if(e.isDirectory())w(p);
      else if(e.name==='session.jsonl.zstd'){try{
        const s=zlib.zstdDecompressSync(fs.readFileSync(p)).toString('utf8');
        const m=s.match(/"agentPreset":"([^"]*)"/); const k=m?m[1]:'(none)'; t[k]=(t[k]||0)+1;
      }catch{}}}})(process.argv[2]);
    for(const [k,v] of Object.entries(t).sort((a,b)=>b[1]-a[1])) console.log(v,'',k);

    结果:20 / 20 个会话的 agentPreset 都是 "code"。

    1. 读 @deepseek-ai/dsh-agent-presets/lib/index.js:

      • SETTINGS_NAMESPACE = "agent-presets";get defaultId() 每次现取 settings.get().default ?? config.default
      • resolve(id):roster 里找不到即抛 agent-preset/not-found(错误里带 available: …)
      • list() → discoverPresets(),无缓存,每次调用重新扫描
      • 内置根 SHIPPED_PRESET_ROOT 只有 cordis / minimal / ptc / standard
      • 用户根为 <dshHome>/.agent-presets(includeUserRoot 默认 true)
      • dsh-web-app/cordis.patch.yml 中部署默认是 default: standard
    2. 本机 ~/.dsh/settings.yaml:

    agent-presets:
      default: code

    而 ~/.dsh/.agent-presets 整个目录不存在 → 新建会话装配默认预设时 resolve("code") 必然 not-found。

    根因

    settings.yaml 里的默认预设 code 是一个悬空引用(指向已不存在的预设)。新建会话必须装配默认预设,于是被 agent-preset/not-found 拒绝;而该错误只存在于 RPC 响应体里,UI 不展示,故表现为「点了没反应」。

    一个关键佐证(也解释了为什么只有"新会话"坏)

    源码中 remove(id) 删除本地预设时,若用户默认值恰好指向它,会一并清除该默认值,注释写得很明确:"留着会让所有未显式指定的新会话无法启动"。

    本机的默认值仍然指向 code,说明 .agent-presets 是在 DSH 之外被删除的(手工删除 / 覆盖安装 / 清理脚本),绕过了这层兜底。

    这也印证了设计语义:"运行中的会话停留在它当初据以组装的 preset 上",所以已开会话照常工作,只有此后新建的会话受影响。

    修复(本机已验证)

    按预设发现规则补回用户预设(目录名即预设 id):

    ~/.dsh/.agent-presets/code/agent.cordis.yml   # 以内置 standard 为蓝本(SHA256 与内置 standard 逐字节相同)
    ~/.dsh/.agent-presets/code/preset.yml         # name / description / order
    

    生效条件(源码确认):

    • id 需匹配 PRESET_ID = /^[a-z0-9][a-z0-9-]*$/
    • 预设目录必须是用户根下的一级子目录,且直接含 agent.cordis.yml(不要多套一层)
    • 用户根由 includeUserRoot(默认 true)自动加入,无需额外配置
    • list() 无缓存 + settings 热重载 → 无需重启即可对新建会话生效

    给遇到同现象的人:先查默认值

    出现「新建会话没反应 / 历史会话无响应」时,先查 settings.yaml 的 agent-presets.default 是否指向一个真实存在的预设——这比 persona 字段更常见,也更容易被忽略。逐项确认:

    1. settings.yaml 中 agent-presets.default 的值
    2. 该 id 是否存在:~/.dsh/.agent-presets/<id>/,或属于内置的 cordis / minimal / ptc / standard
    3. 该目录内是否直接有 agent.cordis.yml

    另:不要把手工删除 ~/.dsh/.agent-presets/<id> 当作常规手段。请用 GUI 的删除(会同步清掉悬空默认值),或删完手动把 default 改回内置值(如 standard)。

    顺带:harness 侧可改进项(与主帖评论方向一致)

    1. 预设解析失败只在 RPC 响应体,UI 不提示 → 用户只能看到"没反应",无法自助定位
    2. discoverPresets() 无缓存 + 失败无退避 → 打开会话页会高频重试(主帖评论实测 ~25 次/秒、单核打满)
    3. 写入悬空默认值时不报错,直到某次 resolve() 才失败 → 建议写入时校验,或解析失败时把 available 列表透出到 UI
  5. zhangweijian97 commented on Sep 12, 2026

    @zhangweijian97

    确认:该问题在 dsh 0.1.5-rc.1 上仍会复现。

    现象与本 issue 一致——选工作区后闪回、无法新建会话;浏览器控制台可见:

    session create failed: agent-preset/invalid: agent-presets: preset "router-standard" failed to mount:
    failed to apply loader entry persona (@deepseek-ai/dsh-persona): invalid config:
      - $.prefix missing required value (at prefix) (.../agent.cordis.yml)
    

    本地把 router-standard / router-spec / router-react 的 persona 行 text: 改成 prefix: 后,预设挂载与 session.create 均恢复正常。

    已有修复 PR:

    建议优先合 #110(或先合 #109 止血)。本条评论仅作版本复现确认,不另开重复 PR。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions