deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
🌐 Language | 语言:English · 中文
在 DeepSeek Harness (DSH) Web 对话界面中,为输入框添加一个四角闪光星魔法棒按钮:点击后把用户口语化、零散、可能含错别字的输入,经独立 LLM 调用增强为更精准、更易被 AI 理解和执行的表达,回填输入框供人工确认后发送。
本功能为原创实现的通用「提示词增强」能力,不涉及任何第三方产品商标或图标。
git clone https://github.com/Kian-Oraish/dsh-prompt-enchant.git
cd dsh-prompt-enchant
./install.sh
脚本做的事:
$HOME/.dsh/profiles/web/node_modules/dsh-prompt-enhance 做成指向本仓库的符号链接(v0.7.0 起;若该位置是旧式实体副本会先备份为 .bak 再迁移);$HOME/.dsh/profiles/web/cordis.patch.yml 中注册 - insert: - id: prompt-enhance 组合行。⚠️ 改了
lib/client.js必须重启 DSH,浏览器刷新不够。客户端 bundle 在服务端按内容哈希(rev) 缓存在内存里,不重启就继续发旧字节。Host 半(路由/工具)同理。
更新 / 卸载:
launchctl kickstart -k gui/501/com.deepseek.dsh.web)即可生效,不必重跑 install.sh;./install.sh --check(只读校验链接 / 组合 / 契约哨兵,不一致时 exit 1);cordis.patch.yml 移除 id: prompt-enhance 的 insert 块,重启即可;.bak,rm -f 符号链接后 mv 回去即可。v0.6.0 起已移除「动态插件」形态(其粘贴镜像早已冻结,与 README 描述不符),本插件只提供磁盘常驻安装。
ctx.settings 落盘 settings.yaml,即选即存、重启保留;旧框架无设置服务时自动降级为「通用」。currentColor)一份文件适配明暗主题,严格纯色填充。/plan 等命令声明原样保留;API 层加固(POST-only / JSON / 跨站拒绝 / 并发上限)。【待确认:要素(候选)】,兼容无方括号变体)自动触发 DSH 官方确认卡——逐题点选候选或自定义填写,提交后答案代入原文重跑增强并回填,输出不再残留【待确认】;90 秒无应答/会话不可用时自动降级为文本标注,绝不卡死。dynamic/ 镜像自本版起冻结,提示词事实源收缩为 lib/modes.js + config/enhance-prompt.md 两源。| 设置面板 · 浅色(选中「设计」) | 设置面板 · 深色(选中「设计」) |
|---|---|
![]() |
![]() |
| 卡片细节(场景标签 / 底部状态栏) | 模式建议条(输入框上方) |
|---|---|
![]() |
![]() |
| 魔棒 · 通用模式(闪光星) | 魔棒 · 设计模式(吉祥物星) | 一键切换后 · 设计模式输出 |
|---|---|---|
![]() |
![]() |
![]() |
模式建议全流程(增强 → 建议条 → 一键切换 → 自动重跑):

引用保真、命令声明保留等安全行为的详细说明见「兼容性与安全」章节。
两段式管线(确定性代码 + 单次 LLM 自适应调用):
用户输入(可带历史上下文)
│
▼
[① 确定性] 输入解析:语言检测 · 代码围栏 · 格式记号 · 长度拦截
│
▼
[②③④ 单次 LLM] 自适应增强:四档增强度自选 + 多轮模式 + 五条硬性规则
│
▼
[⑤ 确定性] 终校验:语言一致 / 长度 / 代码块 → 失败重试一次 → 兜底(剔码/截断保围栏)
│
▼
回填输入框(可编辑)→ 用户确认 → 发送执行
架构形态:Host 半(ESM Cordis 插件)挂载于 DSH 组合,提供 /prompt-enhance/api/{enhance,modes,token} 三条鉴权路由;Client 半为预构建 web bundle,由 DSH clientModules 自动伺服与加载(URL 带内容哈希 rev,故改客户端代码后必须重启守护),经 HTTP 与 Host 通信。改写调用是独立调用,不注入、不修改 agent 自身的系统提示词。
dsh-prompt-enchant/
├── README.md / README.en.md # 中英双语文档
├── CHANGELOG.md # 版本变更记录
├── LICENSE
├── package.json # 插件包元信息(顶层 engines.dsh + dsh.bundle + dsh.client 声明)
├── cordis.patch.yml # 组合补丁:注册 id: prompt-enhance 行
├── install.sh # 一键安装(符号链接到本仓库 + 配置引用 + 提示重启;支持 --check)
├── lib/
│ ├── index.js # Host 半:增强管线、HTTP 路由、会话历史派生、自检工具
│ └── client.js # Client 半(预构建 bundle):魔法棒按钮与交互
├── config/
│ └── enhance-prompt.md # 可调优:改写系统提示词全文
├── tests/ # 离线单测(node --test)
│ ├── contract-sentinel.mjs # 框架契约哨兵(8 条断言,框架升级后跑一次)
│ ├── contract-sentinel.test.mjs
│ └── host-contract.test.mjs # 路由鉴权/令牌闸门/会话历史派生/成本闸门/错误码
└── assets/icons/ # 模式图标(随包内置;UI 用内联 SVG currentColor)
├── sparkle.svg # 通用模式 · 四角闪光星
├── design.svg # 设计模式 · 吉祥物星(evenodd)
├── genstar.svg # 设置目录 · 粒子生成星(evenodd)
├── sparkle_black.svg # 固定色黑星(兼容场景)
├── sparkle_white.svg # 固定色白星(兼容场景)
├── sparkle_black_128.png # 位图备选(亮色主题用)
└── sparkle_white_128.png # 位图备选(暗色主题用)
v0.7.0 起
/prompt-enhance/icons/*.png两条路由已删除(客户端早已改用内联 SVG,从不请求它们;它们是当时唯一绕过鉴权栅栏的路径)。assets/icons/仍随包保留备用,但不再有任何路由消费。
磁盘常驻版通过组合行 config 传参(可选,全部有默认值):
| 配置 | 默认 | 说明 |
|---|---|---|
diagFile |
空(关闭) | 诊断日志绝对路径,开启后追加写入 |
maxInputChars / maxOutputChars |
20000 / 6000 | 输入/输出长度上限 |
historySanitize |
true |
多轮历史 Markdown 记号净化开关 |
temperature |
0.3 |
增强调用的采样温度 |
| 改写提示词 | config/enhance-prompt.md |
语义资产,调优即替换 lib/index.js 中的 FLEXIBLE_SYSTEM_PROMPT |
assets/icons 下为模式图标(与 ~/.dsh 之外的图标资产指南一致的成套资产):通用模式 = sparkle.svg(四角闪光星);设计模式 = design.svg(吉祥物星,fill-rule="evenodd" 负空间细节);设置目录 = genstar.svg(粒子生成星,evenodd)。全部首选 currentColor 内联 SVG:颜色跟随按钮文字色,一份文件同时适配明暗主题(随 DSH 主题开关 body[data-ds-dark-theme]);固定色 SVG 与透明底 PNG(128×128)为兼容备选;JPEG 一律不接 UI。图标由仓库所有者使用豆包 Seedream 生成并本地处理,随仓库以 MIT 许可一并发布。
llm 服务与当前默认模型;框架契约(已在 DSH 0.1.1-rc.2 实测验证,含全部演示素材;并已按 0.1.2-alpha.2 / alpha.5 磁盘类型契约逐项核对):conversation.input.right 槽位注册(id/order/label,kind=list/scope=session)与 InputZone 标准 props;defineTool 属性映射参数;dsh.client 声明与 clientModules 预构建 bundle 格式;主题开关 body[data-ds-dark-theme];v0.3.0 起额外使用官方 ctx.settings(命名空间 prompt-enhance)与设置后台左侧一级栏目槽位 settings.section(order 19,与「提示词库」同款),均按 alpha.5 源码逐行核对。
版本兼容矩阵:
| DSH 版本 | 增强 | 多轮上下文 | @ 引用处理 | 设置后台(模式切换) |
|---|---|---|---|---|
| 0.1.1-rc.2(已实测) | ✅ | ✅(useSession 快照) |
✅ 增强后引用逐字保留、chip 状态与发送序列化注入完整保留 | ❌ 无设置入口,恒用「通用」模式 |
| 0.1.2-alpha.x(alpha.5 契约已核对) | ✅ | ⚠️ 降级为单轮(useSession 已移除,useConversation 不含消息历史) |
⚠️ 输入机改为 Lexical 编辑器,公开 API 无引用重插动词,setDraft 会把引用 chip 退化为文本提及(发送时不再注入文件内容)——因此含 @ 引用的草稿在该版本下按钮禁用(悬停可见说明),以保护引用完整性;无引用草稿正常增强 |
✅ 「设置」左侧一级栏目「提示词附魔棒」:单选模式、即选即存(当前仅「通用」;垂类模式后续随注册表扩充) |
| 0.1.6-alpha.2(v0.7.0 实测) | ✅ | ✅ 宿主侧派生历史(sessions.deriveMessages()),感知 compaction |
✅ 含 @ 引用时按钮禁用(fail-closed);见下方「v0.7.0 修复」 | ✅ 同上,并补声明 dsh-client-ui-settings |
| 更早版本(无客户端槽位系统) | ⚠️ 按钮不渲染 | — | — | — |
v0.7.0 修复(针对 0.1.6 的实测漂移):
newFramework = (typeof useSession !== 'function') && (typeof useConversation === 'function')。0.1.6-alpha.2 同时提供这两个 hook,于是该值为 false,闸门一直没生效:含 @ 引用的草稿照样被送去增强。现改为事实判定(只看 occurrence 表里是否真有引用),不再嗅探版本。SessionSnapshot 与 ConversationSnapshot 都没有 nodes 字段,三条取用分支全部落空、extractHistory 恒返回 []。现改为宿主侧用 ctx.get('sessions').get(sessionId).deriveMessages()——那是框架自己喂给模型的权威派生历史(感知 compaction、已缓存、深冻结),客户端只需发送 sessionId。dsh.engines.dsh 曾是幽灵字段:它不在官方 DshManifest schema 上(正确位置是顶层 engines.dsh),且框架内没有任何 reader。0.1.5 起就从未生效。现挪到顶层并加强断言。>=0.1.5-rc.2 <0.2.0 因 npm 的 prerelease 规则不匹配 0.1.6-alpha.2(也不匹配任何 0.1.6-alpha.x)。现为 >=0.1.6-alpha.0 <0.2.0。ctx.on('service', …) 中的 'service' 事件在 cordis 4.x 不存在(真实名 internal/service),该兜底从未生效;已换成 ctx.inject(['slots','settingsScope'], …)。dsh.client.inject 仅声明客户端模块图中实际存在的包(locale/ui-conversation;dsh-client-runtime、dsh-client-ui-slots 在新版本中已不存在,本包亦未引用,故不在注入清单);客户端 bundle 仅 require('react'),槽位服务经 ctx.get('slots') 获取。设置卡片经 ctx.get('settingsScope') 惰性挂载(不加入注入清单,旧框架/加载竞态下静默跳过,魔棒不受影响)。
【待确认】确认弹窗(v0.5.0):基于官方 ctx.userQuestions seam——客户端经槽位注入携带当前 sessionId,宿主校验其为活根 agent 后弹出官方确认卡(接管当前会话输入区);答案经同一 Promise 回流,代入原文重跑(内层抑制再弹窗,防循环);绑定失败/超时/取消/无客户端一律降级为文本标注(行为与 v0.4.0 一致)。自检工具默认抑制弹窗。验收用测试案例见 docs/测试案例.md。
设计层总公式(v0.5.1):DESIGN_LAYER 升级为「判型→定锚→译话→补槽→成型」通用公式,含图像/视频双要素槽、分镜时间轴、六子模式差异卡、白话翻译词典与渠道画幅词典;【输出格式】锁定待确认规范格式与候选字符集约束(候选间「/」、候选内禁顿号/逗号/斜杠/括号、并列「+」),保证弹窗候选可解析。自检设计用例扩至 7 个(六子模式 + 提问兜底),新增 tests/design-layer.test.mjs 关键词锁定与两源逐字一致断言;dynamic/ 粘贴镜像冻结(停留旧层,仅作参照)。验收用例见 docs/测试案例.md 0.5.1 节。
模式(人设)架构(v0.3.0):提示词 = 共享核心硬规则(lib/modes.js 的 CORE_A/CORE_B,含 @ 引用保护、注入防护、纯文本协议,任何模式不可覆盖)+ 模式专属层;模式注册表位于宿主 lib/modes.js,设置落盘 ~/.dsh/settings.yaml(官方 ctx.settings),宿主按当前模式实时组装提示词;客户端通过 GET /prompt-enhance/api/modes 读取模式元数据渲染卡片。增强响应固定携带 suggestedMode 字段(单模式时代恒为 null),为后续「检测到内容更适合某模式时建议切换」预留。
命令插件交互(/plan、/goal 等):用户在声明命令(claimed)时可以点击增强——插件只改写命令之后的正文部分,命令标记与声明状态原样保留,优化结果不影响命令的调用与显示;命令标记无法定位或输入处于判定/提交中时按钮禁用,绝不干扰命令流程。本插件命名空间(prompt-enhance / prompt_enhance_* / pwe-* / /prompt-enhance/*)与这些命令零重叠。
@ 引用保护(@文件名 / @文件路径 / @会话名 等):增强时引用记号被视为不可触碰的占位符——改写提示词硬性规则要求逐字原样保留、顺序不变,输出经确定性校验,未通过则重试一次、仍失败则整体回退原文;客户端回填按「引用间隙」分段替换(仅改写引用之间的正文),引用的 occurrence 状态与发送时的文件序列化能力完全不受影响;撤销同样只恢复各间隙原文。
安全模型与威胁边界(v0.6.0 起建立,v0.7.0 补第二道闸):
API 路由经两道闸门,全部失败关闭(fail-closed):
ctx.connection.requestRejection(req),等价于 isTrustedApiRequest(Host 必须是回环或显式可信主机、Sec-Fetch-Site 非 cross-site、Origin 必须与 Host 同源)+ 浏览器会话鉴权(绑定 Host 的签名 HttpOnly cookie)。未鉴权 → 401,Host/Origin 不受信 → 403。connection 服务缺席 → 503 拒绝,绝不降级为放行。GET /prompt-enhance/api/token(过框架栅栏)取一次、仅存内存(不写 localStorage/sessionStorage),此后每个请求带 X-Prompt-Enhance-Token,服务端用 timingSafeEqual 常量时间比对。缺令牌/错令牌 → 403。✅ 挡得住:未鉴权的本机其他用户/进程、DNS-rebinding 页面、跨站表单与脚本、浏览器侧 XSS/被诱导页面/扩展(它们能借到 cookie 但读不到 DSH 进程内存)、跨 DSH 重启的重放(令牌每进程轮换)。
❌ 挡不住:以你本人身份运行的本地进程。它能读
~/.dsh/.credentials.yaml自取会话 cookie,也就同样能自己走完这两道闸。令牌是纵深防御的一层,不是特权边界——请不要把它当作"本机沙箱"。排障:若浏览器里增强报 401,先看地址栏是
localhost:3080还是127.0.0.1:3080——cookie 名由Host头哈希而来,两者不通用,换地址需用dsh web打印的带?token=的 URL 重新换 cookie。
其余请求级防护:仅接受 application/json(挡简单跨站表单);POST-only;滑动窗口限流 20 次/分钟;并发两道上限(模型调用 2、HTTP 请求 4);请求体上限 4MB;响应 Cache-Control: no-store + X-Content-Type-Options: nosniff;错误响应只回稳定 code + 白名单文案,绝不回显 provider/内部原文;输出净化(剥离 Markdown 装饰、emoji、双向控制符与零宽字符)。
成本闸门(v0.7.0):单次增强最坏触发 4 次模型调用(首调 + 空正文重试 + 校验重试 + 弹窗后重跑)。因此:模型调用数独立计数(MAX_MODEL_INFLIGHT=2),弹窗等待期间释放 HTTP 名额(旧版 90 秒占着名额会把第三个真实请求 429 掉,已降到 45 秒);45 秒超时走框架 deadline() 并真正取消旧流;浏览器关标签 / 切换会话 → 中止在途增强,不再空占;用户取消绝不重试。Agent 可见的 prompt_enhance_selftest 工具默认关闭(它一跑就是 12 个真实模型调用),需要时在组合行加 config: { debugTools: true }。
「客户端断开即中止」的监听对象(v0.7.1 勘误):必须监听
res的'close',不能监听req的。Node 在请求体读完时就触发 req 的'close',监听它会让每一个健康请求在读完 body 的瞬间自我中止;而中止后 catch 分支会判定「客户端已离开」而不回写响应,结果是客户端永久停在加载态。res的'close'在响应结束或连接断开时恰好触发一次,届时res.writableEnded才能可靠区分二者。这条时序替身模拟不出来,对应的回归测试因此建在真实node:httpserver 上。
框架里确实存在「更框架化」的替代品,但本插件刻意不采用,理由如下 —— 它们不是技术债,是权衡结果:
| 官方件 | 本插件现状 | 不采纳的理由 |
|---|---|---|
ctx.connection.fetch.register({path, methods, fetch}) |
自建 exact 路由 + 显式调用 requestRejection |
该 API 的 assertFetchRoute 要求路径必须位于 /api/ 之下且每段匹配 /^[A-Za-z0-9_$.-]+$/。采用它意味着把四处路由从 /prompt-enhance/* 改名为 /api/prompt-enhance/* 并同步改写客户端——用已经实测验证过的栅栏(401/403 行为已固化进测试)去换一个尚未实测的通道,风险不对称。 |
settings.installSection(owner, ns, schema, entry, hooks) |
ctx.inject(['settings'], cb) + register(ns, schema, {base, validate}) |
installSection 面向的是「有组合 entry 作为 base/fallback 的可选设置消费者」;本插件的 base 本来就是 schema 默认值,用它收益为零,反而会改动当前唯一零漂移的部分(设置卡片)。 |
props.useTrajectory(客户端取消息历史) |
宿主侧 sessions.deriveMessages() |
TrajectorySnapshot.eventNodes 确实带 kind/content/blocks,形状够用;但它是事件窗口视图(还带 eventLocations/partial),不是权威派生历史,长会话下会缺头部,且要在客户端重做角色/预算/压缩裁剪。宿主侧那份就是框架喂给模型的历史,并且能用纯单测覆盖。 |
npm 发布 + dsh plugin add |
磁盘常驻 + install.sh 符号链接 |
dsh plugin add 转发给 pnpm,会引入 peerDependencies 解析面(且 prerelease 语义坑多)。当前只服务本机一个 profile,收益不足。 |
dsh-tools 的 PTC 模式(未实测):0.1.6 新增 mode: 'ptc' | 'both'。类型注释明确:PTC 模式下,模型直接发起的原生工具调用会被拒绝(只有带 parent 的调用才允许执行原生工具名)。当前 profile 是默认 native,风险惰性;若将来启用 PTC,本插件的工具将只能经 run_code 抵达。本插件未在 PTC 模式下实测过。patchReload 已空转:~/.dsh/profiles/web/package.json 里的 "patchReload": "live" 在 0.1.6 已从 DshProfileManifest 类型中移除,且全树 grep 无 reader。不要依赖 patch 热重载——改完配置请重启守护。本次升级暴露的真正问题不是「框架改了一个 API」,而是「框架改了,而没有任何东西会告诉你」——引用闸门静默失效、多轮上下文静默降级,48 个单测全部通过。所以本插件把依赖的框架契约写成可执行断言:
npm test # 默认包含哨兵(框架漂移会红)
npm run sentinel # 只跑哨兵
PE_SKIP_SENTINEL=1 npm test # 只验插件自身逻辑时跳过
哨兵逐条断言(共 8 条):connection.requestRejection 仍在且 401/403 语义未变;8 个关键框架包与签名齐全;GenerateOptions 字段名与 purpose 取值域未变;两个会话快照仍不含 nodes;useTrajectory 仍在但其窗口语义未被误用;dsh.client.inject 四项在框架树中可解析;slots 与两个槽位声明仍在;data-ds-dark-theme 与错误色令牌仍有效;顶层 engines.dsh 区间覆盖当前框架版本。
框架升级后跑一次即可:失败即特征(契约漂移),不是噪音 —— 失败信息直接指向要改哪一处。若框架装在非默认位置,用 DSH_FRAMEWORK_DIR 指向 …/node_modules/@deepseek-ai。
MIT © 2026 Kian-Oraish
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。