Files
deepseek-harness/apps/web/tests/snapshots/onboarding-deepseek-config/models.expected.md
Yichen Jiang d247c50c6f fix(web): return every service a host row injects, and run the browser lane
The browser e2e lane had been failing wholesale since this stack moved the
agent plane into presets, and nothing caught it: 34 of 48 files. Two of the
causes are product defects, not test breakage.

`bashEnv` goes back to the host plane. `apps/cli/src/web.ts` injects it to
publish `DSH_WEB_URL`/`DSH_WEB_MODE`, so the earlier note that "nothing outside
the agent plane injects bashEnv" was simply wrong — behind a preset's `shell`
realm those variables reached no shell at all, and a `dsh web` agent could not
find the address of its own interface. This is the same criterion that returned
`subagents`: a host row that injects a service resolves before any session
exists and has no agent to key by, so the service is host-plane. `tool-bash`
consumes the host registry from inside the preset, which works because an
agent context chains to the host; only the reverse is invisible.

`tool-subagent-report` goes back with it. It is not a tool this agent calls: it
registers a continuable SETUP on the host `subagents` singleton, and that list
is not scope-aware. One copy per mounted preset meant every child was handed
`report` once per live session, so the second registration threw and a cold
subagent resume failed with `subagent-not-resumable` — a diagnostic three
layers removed from the cause.

The lane's own composition facts follow. Skill roots resolve inside a preset
now, a subtree include patches cannot reach, so the scaffold pins the roots'
documented environment fallback for its whole lifetime rather than for the boot
— presets mount per session. Without it the developer's real `~/.dsh/skills`
enters replay requests and goldens while CI sees none. The `apps/cli`
composition test pins `storage-json` for the same reason: unpinned it wrote,
and then read back, the developer's own `~/.dsh/storages/`.

Three tests now address through an agent what they used to read off the root
context, because that is where the thing lives: the tool catalog, the skill
registry, and the token meter. The seeded-history projection baseline asserts
the opposite of what it did — a detached session yields a preset-plane
projection only from a durable checkpoint written while it was live, and this
seed was written straight to persistence and never ran.

Goldens re-recorded for the hero's preset chip and the settings nav entry.
2026-08-07 00:42:25 +08:00

2.3 KiB

  • dialog "设置":
    • navigation:
      • text: 设置
      • button "通用设置":
        • img
        • text: 通用设置
      • button "模型":
        • img
        • text: 模型
      • button "Agent 预设":
        • img
        • text: Agent 预设
    • button "打开配置文件"
    • button "关闭":
      • img
      • text: 关闭
    • heading "模型" [level=2]
    • paragraph: 填入各提供方的 API 密钥即可使用其模型。
    • list:
      • listitem:
        • text: DeepSeek
        • button "编辑"
        • text: DeepSeek deepseek-official API 密钥
        • textbox "API 密钥":
          • /placeholder: 已配置——输入新值可替换
        • group:
          • text: 自定义设置 API 地址
          • textbox "API 地址":
          • text: 推理强度
          • combobox "推理强度":
            • option "默认" [selected]
            • option "off"
            • option "high"
            • option "max"
          • region "模型目录":
            • text: 模型目录 已自定义模型目录
            • button "恢复默认模型"
            • textbox "模型 ID 1":
              • /placeholder: 模型 ID
              • text: deepseek-v4-pro
            • textbox "显示名称 1":
              • /placeholder: 显示名称
              • text: DeepSeek-V4-Pro
            • button "容量 1":
              • img
            • button "删除模型 1":
              • img
            • textbox "模型 ID 2":
              • /placeholder: 模型 ID
              • text: private-preview
            • textbox "显示名称 2":
              • /placeholder: 显示名称
              • text: Private Preview
            • button "容量 2" [expanded]:
              • img
            • button "删除模型 2":
              • img
            • text: 上下文窗口
            • textbox "上下文窗口 2":
              • /placeholder: 1M
              • text: "131072"
            • text: 最大输出 token 数
            • textbox "最大输出 token 数 2":
              • /placeholder: 256K
              • text: 64K
            • button "添加模型":
              • img
              • text: 添加模型
        • button "取消"
        • button "保存"
    • button "添加提供方":
      • img
      • text: 添加提供方
    • button "添加自定义提供方":
      • img
      • text: 添加自定义提供方