npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@wasd258/dsh-prompt-inject

v0.1.2

Published

Per-session system prompt injection for DSH: template library, per-session picker, default template for new sessions. 会话级系统提示词注入器:模板库、按会话选择、新会话默认模板。

Readme

dsh-prompt-inject

English | 中文

DeepSeek Harness(DSH)的会话级系统提示词注入器:每个会话可独立选择一段注入到系统提示词的文本(渲染在 persona 之后、工具引导之前)。

社区项目——非 DeepSeek 官方插件,不代表 DeepSeek 背书。

功能特性

  • 按会话注入——每个会话独立选择模板(或「无」),不同会话互不干扰。section 从 agent.ctx 注册(cordis caller 绑定 → 该会话的 scope 层),只影响顶层会话。
  • 模板库——保存/编辑/删除命名模板(name + text + order);可设默认模板,新会话自动套用。
  • 输入框工具行下拉——「会话提示词」选择器(conversation.input.right 插槽)直接在输入行为当前会话挑选模板,无需敲命令。
  • 设置页两个区块——设置 →「会话提示词模板」管理模板库与新会话默认模板;设置 →「系统提示词」是只读查看器,展示任意 live 会话完整组装出的系统提示词。
  • 分层查看——按来源分组:全局层(所有模式共有)、preset 层(该模式专有段)、会话层(仅本会话)、注入段(本插件自定义)——每段带名称、order、字数。
  • 变量插值——模板文本支持 {{model}} / {{cwd}}
  • 运行中即时生效——切换模板 = dispose 旧段 + 注册新段,该会话下一个模型请求生效,无需重启。
  • 验证端点——GET /assemble 返回实际组装出的系统提示词,并在 preset 锁定提示词时如实报告 completeBlocksInjection
  • 多入口——/prompt 命令、prompt_inject 工具、HTTP API、UI 全部驱动同一份配置。

安装

这是 bundle 型插件:运行在 DSH web profile 进程内,注册宿主端服务 + web 客户端模块。需要 DSH web profile(@deepseek-ai/dsh-web-app)。

  1. 克隆或下载本仓库:

    git clone https://github.com/WASD258-jpg/dsh-prompt-inject.git
  2. 安装进 DSH profile 依赖目录(二选一):

    Option A:npm 安装(推荐)

    cd "$env:USERPROFILE\.dsh\profiles"
    npm install @wasd258/dsh-prompt-inject --no-save

    Option B:从源码复制

    $src = '.\dsh-prompt-inject'
    $dst = "$env:USERPROFILE\.dsh\profiles\node_modules\@wasd258\dsh-prompt-inject"
    New-Item -ItemType Directory -Force -Path "$dst\lib" | Out-Null
    Copy-Item "$src\package.json", "$src\lib\index.js", "$src\lib\client.js", "$src\LICENSE", "$src\NOTICE" $dst -Force

    Linux/macOS 请把 $env:USERPROFILE\.dsh 换成 ~/.dsh(或 $DSH_HOME)。

  3. 把包加入 profile 的 bundle 列表——在 $DSH_HOME/profiles/<profile>/package.json(如 web)的 dsh.profile.bundles 数组追加 "@wasd258/dsh-prompt-inject"

    {
      "name": "dsh-profile-web",
      "private": true,
      "dependencies": {},
      "dsh": {
        "profile": {
          "bundles": [
            "@deepseek-ai/dsh-base",
            "@deepseek-ai/dsh-web-app",
            "@wasd258/dsh-prompt-inject"
          ]
        }
      }
    }
  4. 重启 DSH web(或热装配 bundle),然后刷新浏览器页面加载客户端模块(lib/client.js——immediately: true,页面加载即注册进 slots 系统)。输入框工具行出现「会话提示词」下拉,设置页出现两个新区块。

使用

命令

在任意会话中执行:

| 命令 | 说明 | |---|---| | /prompt(或 status/list/?) | 查看当前会话提示词、默认模板与模板库 | | /prompt use <模板id\|none> | 当前会话应用 / 移除模板 | | /prompt save <名称> <文本> | 保存模板(名称须为不含空格的一个词;其余整行作为文本) | | /prompt delete <模板id> | 删除模板(若为默认模板则同时清除) | | /prompt default <模板id\|none> | 设置 / 清除新会话默认模板 |

示例会话(输出与插件实际输出一致;模板 id 自动生成:名称 slug 化 + 4 位 base36 时间戳后缀,如 code-reviewer-9k2m):

/prompt
当前会话提示词:「Code Reviewer」(code-reviewer-9k2m)
默认模板:(无)
模板库:
  code-reviewer-9k2m「Code Reviewer」(120 字) ← 当前会话
  safety-auditor-1b7e「安全审查员」(85 字)

用法:
  /prompt use <模板id|none>       —— 当前会话应用 / 移除模板
  /prompt save <名称> <文本>      —— 保存新模板
  /prompt delete <模板id>         —— 删除模板
  /prompt default <模板id|none>   —— 设置新会话默认模板

/prompt use code-reviewer-9k2m
当前会话已应用「Code Reviewer」(下一轮生效)。
/prompt use none
当前会话已移除提示词(下一轮生效)。
/prompt save 安全审查员 You are a strict safety auditor.
模板已保存:安全审查员-abc1「安全审查员」
使用:/prompt use 安全审查员-abc1
/prompt delete safety-auditor-1b7e
模板已删除:safety-auditor-1b7e
/prompt default code-reviewer-9k2m
默认模板已设置:code-reviewer-9k2m(此后新会话自动应用)。
/prompt default none
已清除默认模板。
/prompt use missing-id
模板不存在:missing-id(/prompt list 查看)

UI 操作

  • 输入框工具行 →「会话提示词」下拉:为当前会话挑模板(「提示词:无」= 不注入)。选择立即应用、下一轮请求生效;下拉每 5 秒向服务端刷新一次。
  • 设置 →「会话提示词模板」:新建 / 编辑 / 删除模板(删除带确认)并设置新会话默认模板。
  • 设置 →「系统提示词」:选一个 live 会话,按层(全局 / preset / 会话 / 注入)查看完整组装出的系统提示词;若该会话 preset 是 complete persona,显示琥珀色警告说明注入不生效。

prompt_inject 工具

模型自己也能通过 prompt_inject 工具管理提示词("Per-session system prompt injection… Changes take effect on the NEXT model request of that session"):

| action | 必填参数 | 效果 | |---|---|---| | get | — | 当前会话模板、默认模板、完整模板库 | | apply | templateId"none" 解除) | 设置 / 解除当前会话模板 | | save | nametext;可选 templateIdorder | 新建模板;templateId 命中已有模板则更新 | | delete | templateId | 删除模板 | | default | templateId"none"/"" 清除) | 设置新会话默认模板 |

HTTP API

宿主端在 /api/dsh-prompt-inject 下注册路由:

| 方法 | 路径 | 说明 | |---|---|---| | GET | /status?sessionId= | 会话当前模板 + 默认模板 + 模板库(sessionId 可选) | | GET | /assemble?sessionId= | 完整组装出的系统提示词 + 分层明细 + complete persona 检测 | | GET | /sessions | 运行中的(顶层)会话及 preset id | | POST | /apply | {"sessionId","templateId"} —— 给会话应用模板 | | POST | /save | {"name","text","id"?,"order"?} —— 新建/更新模板 | | POST | /delete | {"id"} —— 删除模板 | | POST | /default | {"templateId"} —— 设置新会话默认模板 |

GET /status

GET /api/dsh-prompt-inject/status?sessionId=abc123
{ "ok": true, "sessionId": "abc123", "current": "code-reviewer-9k2m", "currentName": "Code Reviewer", "defaultTemplate": "", "templates": [{ "id": "code-reviewer-9k2m", "name": "Code Reviewer", "text": "You are a strict code reviewer…", "order": 1 }] }

GET /assemble

GET /api/dsh-prompt-inject/assemble?sessionId=abc123
{ "ok": true, "sessionId": "abc123", "presetId": "standard", "presetName": "Standard",
  "length": 3842, "injectedLength": 120, "injected": "You are a strict code reviewer…",
  "complete": null, "completeBlocksInjection": false,
  "sections": [
    { "name": "persona", "order": 0, "text": "…", "layer": "global", "category": "system" },
    { "name": "tool-guidance", "order": 100, "text": "…", "layer": "standard", "category": "system" },
    { "name": "prompt-inject", "order": 1, "text": "…", "layer": "agent", "category": "injected" } ],
  "prompt": "…" }

sections 是逐段明细:layerglobal / preset id / agentcategoryinjected(本插件自定义段)或 system。遇到 complete persona preset 时,响应含 complete: "<段名>"completeBlocksInjection: true

错误情况

| 条件 | 状态码 | 响应体 | |---|---|---| | 非回环来源 | 403 | {"ok":false,"error":"prompt-inject API is loopback-only"} | | Host 头非法 | 403 | {"ok":false,"error":"invalid host header"} | | 跨域 POST | 403 | {"ok":false,"error":"cross-origin request rejected"} | | Content-Type 非 JSON | 415 | {"ok":false,"error":"Content-Type 必须是 application/json"} | | JSON 无效 / 请求体超限(上限 128 KiB) | 400 | {"ok":false,"error":"请求体不是有效 JSON"} | | 未知路由 | 404 | {"ok":false,"error":"unknown route: <route>"} | | 会话不在运行(/assemble/apply) | 404 | {"ok":false,"error":"会话 <id> 不在运行中"} | | 模板不存在 / 入参非法(业务错误) | 200 | {"ok":false,"error":"模板不存在:<id>"}(或 name 不能为空文本过长(上限 65536 字符)) |

工作原理

  • agent 作用域注入——agent/created 时按 sessions[id] ?? defaultTemplate 解析该会话模板,从 agent.ctx 注册 prompt-inject section;cordis caller 绑定让段落落在该 agent 的 scope 层,只影响这一个会话。只注入顶层(root)会话,agent/disposed 时自动清理。
  • 运行中切换——applyForSession 先 dispose 旧段再注册新段;section 的 text函数,每次组装动态求值,所以下一轮请求即生效——无需重启。
  • 持久化——配置存于 $DSH_HOME/dsh-prompt-inject.jsontemplatessessionsdefaultTemplate),原子写入(临时文件 + rename);resume/重启后 agent 重建,选择自动重新应用。
  • 排序与变量——模板默认 order: 1(persona 在 0、工具引导在 100+);文本支持 {{model}} / {{cwd}};空文本段自动从组装中消失。
  • KV 缓存说明——注入文本进入该会话每个请求的系统提示词;修改会改变 KV 缓存前缀,下一轮缓存复用失效——这是修改的正常代价。
  • 宿主端——注入 systemPrompttoolscommandsagentswebServer;web 端注入 slots 系统(conversation.input.right + 两个 settings.section)。

隐私与安全

  • 威胁模型——本 API 设计上无鉴权,只服务本机:任何本地进程都能读取组装出的系统提示词与模板库,并能驱动写操作。请在可信的本机环境运行 DSH;不要把 DSH 绑到公网接口并指望本插件防护——回环校验是纵深防御,不是认证边界。
  • 仅限回环——来源地址必须是 127.0.0.1::1::ffff:127.0.0.1,否则直接 403。
  • 防 DNS rebinding——Host 头必须是当前端口的回环主机名(无 Host 头回退到地址校验)。GET /assemble 可能返回敏感数据,因此 GET/POST 一视同仁。
  • 写操作防跨站——POST 额外要求同源 Origin 头 + Content-Type: application/json,阻止恶意网页驱动修改。
  • 无遥测——不发起外部请求、不采集统计、不读写凭据。配置明文落盘在 $DSH_HOME/dsh-prompt-inject.json;模板本身可能敏感,请保护好 home 目录。
  • 请求体上限 128 KiB(131072 字节)。

兼容性

  • 需要 DSH(DeepSeek Harness)web profile(@deepseek-ai/dsh-web-app)。
  • Node.js >= 22.19.0。当前版本 0.1.1(npm 包名 @wasd258/dsh-prompt-inject)。
  • 官方仓库 commit 47f9438 时代实测(bundle 接口、web profile、Windows 11)。
  • complete persona 边界——persona 配置 complete: true 的 preset(如 minimalanchored-standard)会把系统提示词锁定为唯一段:注入对这类会话不生效/assemble 通过 completeBlocksInjection 如实报告,设置页查看器显示琥珀色警告。请使用非 complete 的 preset(Standard、Creator…),或把文本写进 preset 的 persona。
  • 查看器默认优先选中非 complete 会话(这类会话才能看到有意义的注入结果)。

官方生态要求

DeepSeek Harness CONTRIBUTING,官方仓库不接受外部 PR;社区插件放在各自仓库并添加 dsh-plugin topic。本仓库遵循此约定:独立社区项目,与 DeepSeek 无隶属或背书关系。

许可

MIT —— 见 LICENSE。部分内容参考 DeepSeek Harness;来源与免责声明见 NOTICE