
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
dsh-survival-mode
Advanced tools
生存模式:整个 DSH 全局共享一条饱食度与生命。模型每次思考都消耗饱食度,吃饱了才干活,饿到归零就掉血,血空则全局工具被冻结,只有喂食才能复活。
给 DeepSeek Harness(DSH)加一条命:整个 DSH 全局共享一份饱食度与生命。
模型每思考一步就消耗饱食度,吃饱了才干活;饿到归零开始掉血;
血空了全局工具被冻结——只剩对话能力,喂食才能复活。
越flash死得越快
🍗🍗🍗🍗🍗🍗🍗🍗⬜⬜ 饱食 120/150 ❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️🖤🖤 生命 10/12
一句话概括设计意图:让"停止执行任务"和"拒绝用户说话"彻底分开。 饿死冻结的是工具,对话永远通畅。
包名:dsh-survival-mode · 仓库:X1A0BAN/dsh-survival-mode
dsh plugin --profile web add "github:X1A0BAN/dsh-survival-mode"
Windows 用户请照抄上面这条。
dsh plugin在 win32 经cmd.exe转发参数,而&是命令分隔符,所以不要写成#main&path:/...形式——那样会以ERR_PNPM_INVALID_DEPENDENCY_NAME失败。
dsh plugin --profile web add "github:X1A0BAN/dsh-survival-mode"
需要钉到某个提交时(POSIX):
dsh plugin --profile web add "github:X1A0BAN/dsh-survival-mode#<commit>&path:/"
git clone https://github.com/X1A0BAN/dsh-survival-mode
cd dsh-survival-mode && npm run build
dsh plugin --profile web add .
本仓库已把构建产物(lib/)提交入库,所以 github: 源安装不需要跑构建、也不需要任何额外的 registry 配额——这是刻意的分发选择。
dsh plugin --profile web remove dsh-survival-mode
| 机制 | 行为 |
|---|---|
| 思考计费 | 每个模型步骤(step)消耗饱食度,按 (会话, turn, step) 去重——重试不会重复扣 |
| 归零掉血 | 饱食度归零的那一刻立刻 −1 生命,之后按预设节奏持续掉血 |
| 饿死停摆 | 生命归零后,所有会话的工具调用被拒绝(survival_feed 除外);对话不受影响 |
| 喂食复活 | 面板上喂食;饿死状态下只有金苹果能复活(+饱食 / +生命),苹果面包救不回来 |
| 对话抢救 | 饿死状态下用户每发一条消息,会小幅回血并解除饿死——保证你永远不会被锁在会话之外 |
| 全局共享 | 所有会话共用一个池:多开会话会共同抽干同一条饱食度 |
面板顶部的 [简单] [普通] [困难] 一键切换整组规则(不是只改一个数字):
| 简单 | 普通 | 困难 | |
|---|---|---|---|
| 每步思考扣除 | 4 | 6 | 10 |
| 饱食度上限 | 200 | 150 | 80 |
| 满饱食可思考 | 50 步 | 25 步 | 8 步 |
| 生命上限 | 16 | 12 | 8 |
| 掉血节奏 | 6 秒/−1❤ | 4 秒/−1❤ | 2 秒/−1❤ |
| 归零后存活窗口 | 96 秒 | 48 秒 | 16 秒 |
| 消息抢救量 | +45 / +4❤ | +30 / +3❤ | +18 / +2❤ |
上限是按实际能干多少活定的:一次自主目标回合可能连续思考 30 步以上(本项目开发期间实测烧掉 32 步),所以简单模式必须明显高于这个量级,否则"简单"在长任务里名不副实。
点面板右上 ⚙ 可改四项并保存:每步思考扣除、饱食度上限、生命上限、掉血间隔(秒)。 手动改过任意一项后档位显示为「自定义」,三个预设按钮不再高亮——避免显示与真实参数不一致。
改上限不会免费送饭:抬高上限只是抬高上限,当前饱食度不会被回填;调低上限则会把当前值夹到新上限。
| 食物 | 效果 | 获取方式 |
|---|---|---|
| 🍎 苹果 | +15 饱食 | 小游戏里的树定时结出(每 20 秒 1 个,最多挂 3 个),点击收获 |
| 🍞 面包 | +45 饱食 | 小游戏里点村民概率获得(25%) |
| ✨ 金苹果 | +100 饱食、+4 生命(饿死时按钮变为「复活」) | 工作台合成:8 块金锭 + 1 个苹果;金锭由点金矿小概率(20%)挖到 |
食物都存放在全局背包里,喂食从背包消耗 1 个,没有存货的按钮会变灰。面板上「⛏ 打开 MC 采集小游戏」可打开 2D 横板场景:草地上有一棵树、一个村民和一个工作台,地下埋着金矿,底部热键栏实时显示背包数量。
| 每分钟产出 | 换算饱食 | 普通模式每分钟消耗 | |
|---|---|---|---|
| 收苹果 | 3 个(20 秒 1 个,挂满 3 个等收获) | 45 | 90 |
| 点村民 | ≈5 个(爆率 25%,冷却 500ms) | 225 | 90 |
| 挖金矿 | ≈12 块(爆率 20%,冷却 500ms) | — | 需要 8 块 / 个金苹果 |
test/host.test.mjs 的「平衡关系」用例守住,改数值时测试会拦你。state.feed 直接挡掉,不只靠按钮变灰)——留给掉饿了再吃。早期版本有一条「饱食度 ≥2 步余量就禁用苹果面包」的防误喂门槛,实测症状是饱食度 60/150 时两个按钮全灰、点了没反应,被当成"苹果和面包用不了"。防误喂的收益抵不过这个困惑,已改成只在满饱食度时禁用。同一版本里任意食物都能复活,导致面包(+45)比金苹果更划算、金苹果的合成价值归零,现在复活只认金苹果。
小游戏刚做出来时贴图是代码里手绘的 16×16 字符画(pixelTexture() 调色板拼 SVG),
方块色偏和花纹都跟原版对不上。现在场景、热键栏、合成界面、面板图标全部换成原版素材。
npm run textures # 重新生成原版贴图(默认钉在 1.21.4)
管线做的事(scripts/vanilla-textures.mjs):
downloads.client,从 piston-data.mojang.com 下客户端 jar;scripts/zip.mjs)从 jar 里取 assets/minecraft/textures/**;scripts/png.mjs)处理,产出 data URI 写进 assets/vanilla/textures.json;scripts/build.mjs 构建期把它注入 lib/client.js —— 所以运行期依旧零网络请求,产物自包含
(npm 的 files 白名单里没有 assets/,但内联后不影响安装)。三个值得记的坑:
assetIndex 只有音效/语言/字体(4000+ 条),
方块与物品贴图是直接打在客户端 jar 内的。别照着 resources.download.minecraft.net 找贴图。oak_leaves.png 是等生物群系染色的灰度图,但带有 ±4 的编码噪声
(实测 185,188,185、104,100,104)。严格 r==g==b 判定会把树叶当成彩色图、跳过染色,
结果场景里树叶发白。isGrayscale() 因此带 8 的容差。v+dz(深度)不是 v+dh;写错会让整张图各面片下移 2–6 像素,
拼出来的「村民」身体是一块灰墙。test/vanilla-textures.test.mjs 用结构性断言守住这一点。版权提醒。 原版贴图是 Mojang 的版权素材,内联进公开仓库属于再分发,官方 usage guidelines 并不允许这么做。本仓库按所有者要求保留,你若不想公开分发:把
assets/vanilla/加进.gitignore, 同时删掉test/vanilla-textures.test.mjs里依赖贴图产物的用例——src/与构建脚本一行都不用改, 客户端会自动回退到内置的手绘像素画(TEX = HAND_TEX + VANILLA_TEX,两层键集对齐)。 缺失的键(如原版没找skull贴图)由icon()逐个退回 emoji,不会出现半张图。
插件注册了一个模型可调用的工具:
survival_feed({ food }) — apple / bread / golden_apple(从背包消耗,没存货会失败)并注入两段提示词:
动态上下文永远返回字符串。提示词渲染器会把解析结果直接喂给
text.indexOf('{{'),一旦返回undefined,整个提示词装配会抛错、所有会话的回合一起失败。这是本项目开发中真实踩过的坑。
零运行时依赖,构建与测试只用 Node 内置模块(无 npm install 也能跑)。
node test/host.test.mjs # 14 个状态机行为测试
node test/host-contract.test.mjs # 真实 defineTool 编译工具 schema + 包文件清单
node scripts/build.mjs # 产出 lib/(注入 assets/vanilla/textures.json)
node scripts/verify.mjs # 产物自检 29 项(发布前必跑)
npm run textures # 拉官方客户端 jar 重新生成原版贴图(需要外网)
npm test # 上面两个测试串行跑
用
node test/host.test.mjs而不是node --test test/:后者会为每个测试文件 spawn 子进程,在受限沙箱里会以EPERM失败。
host-contract.test.mjs 会从 DSH 部署目录里找真实的 @deepseek-ai/dsh-tools,用它编译本插件的工具定义——parameters 根开放性与 output.schema 值根必填这两条规则只有让真正的编译器跑一次才能验证(本项目在这上面失败过两次)。找不到官方包时该测试会 skip,不会把机器相关路径变成硬失败。
dsh plugin --profile web add . # → + dsh-survival-mode link:…
dsh --profile web --dump-config # → 启动图内出现 id/name: dsh-survival-mode
装完后在运行中的 DSH 里实测到的事实:
survival_feed 出现在模型的工具列表中。这一点比"文件都在"有力得多——apply() 是在注册完服务、三个事件钩子与两段提示词之后才注册工具的,所以工具出现意味着前面那些调用都没有抛错。profiles/<p>/node_modules/dsh-survival-mode/lib/client.js 存在,且首行就是 window.__ModuleLoader__.load({,也就是浏览器模块系统要求的包裹形态。@deepseek-ai/dsh-tools 不在 profile 的 node_modules/@deepseek-ai/ 下,而是经 .dsh-module-fallback/node_modules 解析——所以不要把官方包写进 dependencies,那会让公开 npm 解析失败。两个容易踩的坑:
dsh plugin add 与 dsh --dump-config 都不是只读命令。 前者写 profile 的 dependencies 与 dsh.profile.bundles,后者会重写 profile 的 cordis.yml(prepareProfile → writeFileSync)。在受限沙箱/只读环境里都会以 EPERM 失败——错误信息指向 profile 目录,而不是插件本身。npm pack --dry-run 会写 npm 缓存,在这类环境里同样 EPERM。所以本仓库改用 test/host-contract.test.mjs 里的文件清单断言来复刻 npm 的 files 匹配规则,不依赖该命令。src/config.mjs 三档预设、边界、食物表
src/state.mjs 核心状态机(纯逻辑、零依赖,可直接脱离 DSH 测试)
src/tool.mjs survival_feed 工具定义(接受 defineTool,因此可被真实编译器验证)
src/index.mjs Host 半体:服务、事件钩子、提示词注入
src/client/index.js 客户端半体:shell.overlay 上的 HUD 面板 + MC 采集小游戏
scripts/build.mjs 零依赖构建器(包裹 __ModuleLoader__ 闭包工厂,注入原版贴图)
scripts/vanilla-textures.mjs 原版贴图管线(官方客户端 jar → data URI)
scripts/png.mjs 零依赖 PNG 编解码 + 栅格操作(染色 / 叠加 / 放大 / 裁切)
scripts/zip.mjs 零依赖 ZIP 读取(从客户端 jar 里取贴图)
scripts/verify.mjs 产物自检
assets/vanilla/ 原版贴图原件与产物(textures.json 入库;cache/ 是 jar,已 ignore)
lib/ 构建产物(已入库)
agent/request,不是 agent/status。 后者只在 idle ⇄ running 迁移时派发,一个 turn 只触发一次,会表现为"扣一次就不动了"。agent/request 在每步模型调用前派发,重试会重复派发,所以由状态机按 (agent, turn, step) 去重。agent/pre-step 返回 reject 来"停止任务"。 pre-step 的 messages 就是用户刚提交的输入,reject 会连人带话一起丢弃,把会话锁死到喂食为止。停摆要落在工具上(tools/pre-execute 返回 deny)。shell.overlay,这是全局浮层——如果你装了其他同样占据右下角的插件,需要拖动标题栏错开。MIT © X1A0BAN
FAQs
生存模式:整个 DSH 全局共享一条饱食度与生命。模型每次思考都消耗饱食度,吃饱了才干活,饿到归零就掉血,血空则全局工具被冻结,只有喂食才能复活。
The npm package dsh-survival-mode receives a total of 0 weekly downloads. As such, dsh-survival-mode popularity was classified as not popular.
We found that dsh-survival-mode demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.