dsh-survival
DeepSeek Harness 生存模式
- Stars
- 1
- Language
- JavaScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
DSH 生存模式
🍗 MC原版生存,今天吃什么?
在 DeepSeek Harness 中体验MC原版生存:MC 原版生存机制 + MC 风格 UI。
这是什么
把一次会话变成一场方块世界生存(agent 角色与标准模式完全一致,仅追加一段系统提示,告诉 agent 何时请示吃饭/睡觉):
- 新机制(宿主端引擎
survival-engine,按 MC 规则结算):- ❤️ 生命值 0-20:工具失败 / 步骤错误掉血;饱食度 ≥18 且饱和度 >0 时每回合自动回 1 HP(消耗 6.0 疲劳)。
- 🍗 饱食度 0-20 与 ✨ 饱和度 0-20(上限=饱食度):token 消耗产生疲劳,每满 4.0 疲劳先扣 1 饱和度,饱和度耗尽才扣饱食度;进食先补饱和度再补饱食度。
- ⛏️ 昼夜循环:一天 24000 tick = 20 真实分钟(白天 10min / 黄昏 1.5min / 夜晚 7min / 黎明 1.5min),时间实时流逝,UI 随相位换色。
- 🎒 物品栏与 MC 食物表;死亡掉落物品,重生补给出生点物资。
- 😴 吃饭 / 睡觉都由代理请示用户(ask_user_question):饿了问"可以吃饭吗",夜晚问"可以睡觉吗";睡觉睡到清晨 1000t 并打断当前任务(concludeTurn)。
- 📝 角色保持标准:预设不定义 persona,agent 就是标准编码 Agent;只有
survival-prompt追加一段系统提示(饱食度低时请示吃饭、夜晚请示睡觉)。
- UI 风格(
ui/survival-hud.js,动态插件,真实 MC 素材):- 输入框上方常驻状态条(
conversation.input.dock):10 颗红心(官方 HUD 贴图,满/半/空、低血闪烁)+ 10 个鸡腿(饱食度)——只显示生命与饱食度。 - 图标为 minecraft.wiki 官方 9×9 贴图(
survival/assets/*.png),base64 内嵌、像素化放大,离线可用。 - 昼夜主题循环:按 MC 相位切换四套全局配色(白天/黄昏/夜晚/黎明)。
survival工具专属卡片(聊天流内)与/survival、/mc命令(状态卡 +give补给)。
- 输入框上方常驻状态条(
素材署名:
survival/assets/*.png(红心/鸡腿 HUD 图标)来自 Minecraft Wiki,采用 CC BY-NC-SA 3.0 许可,版权归 Mojang 与 Minecraft Wiki 贡献者所有。
架构
DSH-survival/
├── survival/ # ★ 可安装的 agent 预设(复制到任意部署的 .agent-presets/)
│ ├── preset.yml # 模式元数据(名称/描述,出现在会话模式选择器)
│ ├── agent.cordis.yml # Cordis 组成:标准工具集 + 生存域(不定义人格,角色与标准一致)
│ ├── plugins/
│ │ ├── survival-engine.mjs # MC 引擎:provide 'survival' 服务,事件钩子 + settings 持久化
│ │ ├── survival-tool.mjs # survival 模型工具(status / eat / sleep / inventory / respawn)
│ │ ├── survival-command.mjs # /survival 与 /mc 命令(状态卡 / eat / sleep / give / respawn)
│ │ └── survival-prompt.mjs # 系统提示段:饱食度低请示吃饭、夜晚请示睡觉(角色不改变)
│ ├── assets/ # 官方 MC HUD 图标源文件(红心/鸡腿 9×9 PNG,minecraft.wiki)
│ └── skills/
│ └── survival-playbook/ # 随预设分发的 MC 法则技能(何时请示吃饭/睡觉)
├── ui/
│ └── survival-hud.js # 动态 Cordis 插件:MC 风格 HUD + 昼夜主题(参考实现)
└── engine-smoke.mjs # 引擎功能冒烟测试(34 项断言,零依赖)
关键设计决策
| 问题 | 决策 | 原因 |
|---|---|---|
| agent 角色 | 不定义 persona,追加 systemPrompt.section() 提示段 | 与标准模式角色完全一致;生存行为只靠一段系统提示驱动(吃饭/睡觉请示),机制由引擎自动结算 |
| 预设如何携带新代码 | agent.cordis.yml 用相对路径引用 ./plugins/*.mjs | 预设树的 loader 支持相对导入("a preset's own files travel with it"),整个模式自包含 |
| 引擎服务的作用域 | 放在 isolate: { survival: true } 的 realm 里 | 预设行发布服务必须进 isolate realm,否则第二个会话挂载同一预设会冲突 |
| 状态持久化 | settings 服务($DSH_HOME/settings.yaml),survival 命名空间按会话 id 键控 | 会话日志不允许仓库外事件类型(恢复时会拒绝整个日志);settings 是宿主的持久化 KV,且 schema 可以用普通函数代替 |
| token 消耗 → 饱食度 | 回合结算时 tokenMeter.measure(session).surfaceTokens 的增量换算疲劳 | 忠诚"随 token 消耗减少";meter 缺失时用 stepFallbackTokens 兜底 |
| 时间系统 | 状态存 absTicks + lastTickAt,20 tick/秒 按真实时间流逝 | MC 时间实时走;休眠/离线期间时间照常推进(与游戏一致) |
| 浏览器实时 UI | 动态 Cordis 插件(ui/survival-hud.js) | 平台限制:preset 无法携带 browser bundle(client 模块图在启动时静态构建),浏览器端扩展目前只能走动态插件管线;本仓库把该插件作为参考实现与文档 |
| 工具/命令如何读状态 | 注入 survival 服务 | 同一 realm 内的兄弟行通过 inject 解析 |
| 同进程热重载 | 引擎在 settings 命名空间已注册时复用现有注册 | 旧 standing 代仍存活时避免 already registered 冲突;但插件文件有 ESM 缓存,改机制后需重启 DSH 生效 |
安装(给别人装)
-
把
survival/目录复制到目标部署的预设根目录:cp -R survival "$DSH_HOME/.agent-presets/survival" # $DSH_HOME 默认 ~/.dsh或使用 DSH 的 preset 复制 API(
agentPresets.copy('standard', 'survival', ...)后替换文件)。 -
重启 / 刷新 DSH(预设由 roster 在会话启动时发现)。
-
新建会话时,在模式选择器里选 生存模式。
-
(可选)安装浏览器 HUD——当前需要通过动态插件管线加载:
# 在任意 cordis 会话里执行 cordis_define + cordis_run,代码见 ui/survival-hud.js; # 或用下方"本机开发"的脚本方式。
本机开发
# 安装(当前部署)
cp -R survival ~/.dsh/.agent-presets/survival
# 校验预设能否挂载(见编辑 Cordis 组成技能:mount-validate)
# 改动 survival/ 下的文件后重新校验即可;预设每次会话启动时重新读取
# 引擎功能冒烟测试(零依赖,直接跑)
node engine-smoke.mjs
机制参数(可调)
survival/agent.cordis.yml 里 survival-engine 行的 config 是全部规则(默认值与游戏一致):
| 参数 | 默认 | 含义 |
|---|---|---|
maxHp / maxHunger | 20 / 20 | MC 生命与饱食度上限 |
startSaturation | 5 | 出生饱和度(MC:5.0) |
startInventory | bread×3, apple×2, cooked_beef×1, carrot×2 | 初始食物 |
tokensPerExhaustion | 150 | 每 150 token → 1 点疲劳(4 点疲劳扣 1 食物值) |
stepFallbackTokens | 400 | tokenMeter 不可用时的每回合兜底 |
failHpBase / failHpByPrefix | 1 / bash,pwsh 3; edit,write 2 | 工具失败伤害 |
stepErrorHp | 4 | 步骤级错误伤害 |
healThresholdHunger / healExhaustion / healHpPerTurn | 18 / 6 / 1 | 自然回血条件与消耗(MC:≥18 且 sat>0,回 1 HP 耗 6 疲劳) |
scorePerCleanTurn / scoreDeathPenalty | 1 / 5 | 生存分 |
respawnHp / respawnHunger / respawnSaturation | 20 / 20 / 5 | 重生值(MC) |
dayTicks / ticksPerSecond | 24000 / 20 | 一天 tick 数 / 时间流速(20 min/天) |
sleepStartTick / morningTick | 12542 / 1000 | 可睡窗口(MC:time>12541)/ 睡醒时间 |
keepInventoryOnDeath | false | 死亡掉落物品(MC 默认掉落;true 保留) |
starvationHpPerTurn | 1 | hunger=0 时每回合饥饿伤害 |
historyCap | 30 | 事件历史环形上限 |
食物表(MC 数值)
| 食物 | 饱食度 | 饱和度 | 食物 | 饱食度 | 饱和度 | |
|---|---|---|---|---|---|---|
| cooked_beef | +8 | +12.8 | bread | +5 | +6.0 | |
| cooked_porkchop | +8 | +12.8 | baked_potato | +5 | +6.0 | |
| cooked_chicken | +6 | +7.2 | carrot | +3 | +3.6 | |
| golden_carrot | +6 | +14.4 | apple | +4 | +2.4 | |
| melon_slice | +2 | +1.2 | cookie | +2 | +0.4 | |
| sweet_berries | +2 | +0.4 |
进食先补饱和度(上限=当前饱食度)再补饱食度(上限 20)。用户可用 /mc give <食物> [数量] 补给。
已知限制 / 路线图
- 进程运行期间修改预设组成会导致生存会话暂时无法创建(跳回标准模式):旧 standing 代占用的
survivalsettings 命名空间与新版冲突,挂载回滚。重启 DSH 即可恢复;引擎已内置"命名空间已注册则复用"的容错,重启后不再复发。 - 机制/UI 代码更新后需重启 DSH(预设插件文件有 ESM 缓存,同进程不重新加载;动态 HUD 插件也随进程重启消失,需重新 cordis_run,已授权过则免批)
- 死亡时用
tools.guard阻止继续行动(当前死亡冻结状态,但工具仍可调用) - 把 HUD 变成随预设分发的正式 UI(需要上游支持 preset 携带 client bundle / 主题层)
- 更多 MC 机制:护甲值、饥饿时减速、疾跑消耗、药水/附魔等