🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

酒馆世界书 libolunm/dsh-worldbook

DeepSeek Harness
libolunm31 天前有提交已提供中文文档扫描:含敏感能力

用蓝灯常驻与绿灯关键词给模型注入背景设定

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add libolunm/dsh-worldbook
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · skill
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 31 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/1) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-worldbook(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/8 09:42:33

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 14 处,展示前 14 条)
  • 读取本地文件
    worldbook/index.js:43
    export async function readWorldbook(path) { return decode(await readFile(path, 'utf8')) }
  • 读取本地文件
    worldbook/index.js:52
    try { return Date.now() - (await stat(lockPath)).mtimeMs > LOCK_STALE_MS } catch { return false }
  • 删除本地文件
    worldbook/index.js:67
    if (attempt === 0 && await lockIsStale(lockPath)) { await unlink(lockPath).catch(() => {}); continue }
  • 写入本地文件
    worldbook/index.js:91
    await rename(temp, path)
  • 删除本地文件
    worldbook/index.js:94
    await unlink(temp).catch(error => { if (error.code !== 'ENOENT') throw error })
  • 删除本地文件
    worldbook/index.js:96
    await unlink(lockPath)
  • 读取本地文件
    worldbook/index.js:121
    snapshot = decode(readFileSync(path, 'utf8'))
  • 读取本地文件
    worldbook-editor/index.mjs:42
    const raw = await readFile(BOOK, 'utf8')
  • 读取本地文件
    worldbook-editor/index.mjs:72
    const html = await readFile(HTML, 'utf8')
  • 写入本地文件
    worldbook-editor/index.mjs:104
    await writeFile(BOOK + '.bak', lockedCurrent.raw, 'utf8')
  • 写入本地文件
    worldbook-editor/index.mjs:105
    await writeFile(temp, raw, {encoding:'utf8',flag:'wx'})
  • 写入本地文件
    worldbook-editor/index.mjs:108
    await rename(temp, BOOK)
  • 删除本地文件
    worldbook-editor/index.mjs:111
    await unlink(temp).catch(() => {})
  • 删除本地文件
    worldbook-editor/index.mjs:113
    await unlink(lockPath).catch(() => {})
扫描于 2026/11/1(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 蓝灯常驻条目
  • 绿灯关键词注入
  • 可视化编辑器

README

由 DeepSeek 最新模型翻译生成
dsh-worldbook 给 DeepSeek Harness(dsh) 用的酒馆式世界书。两类条目: - 蓝灯(constant):每次模型调用都作为常驻背景出现在系统提示里。 - 绿灯(关键词):用户消息命中触发词时,在那一轮对话里插入一条背景资料消息。 附带一个装进 dsh web 设置面板的可视化编辑器,以及一个让 Agent 自己读写世界书的 worldbook 工具(说一句「记住…」就能存成条目)。 目录结构 | 目录 | 装到哪 | 作用 | | worldbook/ | /plugins/worldbook/ | 引擎(agent 侧):注册常驻提示段、worldbook 工具、agent/pre-step 关键词注入 | | worldbook-editor/ | ~/.dsh/profiles//plugins/worldbook-editor/ | 编辑器(web 侧):提供 /worldbook 页面与 /worldbook/api,并在设置面板挂一个分区 | | examples/worldbook.example.json | 复制成你的 worldbook.json | 示例数据,含蓝灯/绿灯/停用三种形态 |
展开完整文档(README 剩余 1 节)
dsh-worldbook

给 DeepSeek Harness(dsh) 用的酒馆式世界书。两类条目:

- 蓝灯(constant):每次模型调用都作为常驻背景出现在系统提示里。
- 绿灯(关键词):用户消息命中触发词时,在那一轮对话里插入一条背景资料消息。

附带一个装进 dsh web 设置面板的可视化编辑器,以及一个让 Agent 自己读写世界书的 worldbook 工具(说一句「记住…」就能存成条目)。

目录结构

| 目录 | 装到哪 | 作用 |
| worldbook/ | /plugins/worldbook/ | 引擎(agent 侧):注册常驻提示段、worldbook 工具、agent/pre-step 关键词注入 |
| worldbook-editor/ | ~/.dsh/profiles//plugins/worldbook-editor/ | 编辑器(web 侧):提供 /worldbook 页面与 /worldbook/api,并在设置面板挂一个分区 |
| examples/worldbook.example.json | 复制成你的 worldbook.json | 示例数据,含蓝灯/绿灯/停用三种形态 |

两个插件共用同一个 worldbook.json,彼此独立:只装引擎也能用(靠 Agent 工具维护),只装编辑器等于一个顺手的世界书文件编辑器。

安装

1. 引擎(agent 侧)

把 worldbook/ 整个目录拷进你的 preset,例如 ~/.dsh/.agent-presets/tavern/plugins/worldbook/,然后在 preset 的 agent.cordis.yml 里加一行:

- id: worldbook
name: './plugins/worldbook/index.js'
config:
path: './worldbook.json'
sectionOrder: 420

- name 以 ./ 开头 → 相对 preset 目录解析,插件跟着 preset 走,不用额外装 npm 包。
- config.path 同样相对 preset 目录;省略则默认 ./worldbook.json。
- sectionOrder 决定常驻段在系统提示里的排序,默认 420(数值越小越靠前)。
- 这条 row 不发布任何服务、不需要 isolate realm:它只消费宿主的 systemPrompt 与 tools 注册表,并监听 agent/pre-step 瀑布。

preset 里的内联插件在进程启动时加载,装完需要重启 dsh。

2. 编辑器(web 侧)

把 worldbook-editor/ 拷进 profile 的 plugins/ 目录,例如 ~/.dsh/profiles/web/plugins/worldbook-editor/,然后在同一个 profile 的 cordis.patch.yml 里加:

- insert:
- id: worldbook-editor
name: './plugins/worldbook-editor/index.mjs'

重启 dsh(或该 profile 配了 patchReload: live 时热载),打开 http://127.0.0.1:3080/worldbook,或在 设置 → 世界书 里看到它。

世界书文件的路径解析

引擎与编辑器顺序一致,取第一个命中的:

1. config.path(引擎在 preset row 里给,编辑器在 patch entry 里给)
2. 环境变量 DSH_WORLDBOOK_PATH
3. 默认 ~/.dsh/.agent-presets/tavern/worldbook.json

编辑器吃的是绝对路径最稳;相对路径按进程工作目录解析。

数据格式

worldbook.json 就是一个对象包一个 entries 数组:

{
"entries": [
{
"id": "entry-machine-setup",
"title": "本机环境", "content": "ComfyUI 在 E:\\woyao,端口 8188。", "constant": true, "enabled": true,
"keys": [],
"repeat": "once",
"caseSensitive": false
}
]
}

| 字段 | 类型 | 说明 |
| id | string | 必填,非空、全局唯一 |
| title | string | 必填,非空 |
| content | string | 必填,非空;注入时的正文 |
| constant | boolean | true = 蓝灯常驻;否则为绿灯 |
| keys | string[] | 绿灯的触发词;constant !== true 时至少一个非空 |
| caseSensitive | boolean | 默认 false |
| repeat | "once" \| "always" | 默认 once |
| enabled | boolean | 默认 true;false 表示停用 |

校验是严格的:非法结构直接抛错,不会静默修复或丢弃未知字段。手写文件时给 worldbook.json 配上编辑器里的 JSON 校验,比事后猜错在哪快得多。

Agent 工具:worldbook

引擎注册的工具,模型可直接调用:

| op | 必填参数 | 行为 |
| list | — | 列出全部条目(含 modes、关键词) |
| get | id | 读取单条全文与当前 revision |
| add | 视条目而定 | 追加条目;id 省略时自动生成 |
| update | id + expectedRevision | 按 id 改字段(省略的字段保持原样) |
| remove | id + expectedRevision | 删除条目 |
| reload | — | 立即重读文件并刷新内存快照 |

改/删之前先 get 拿 revision,再把它当 expectedRevision 传回;版本不一致会明确报「版本冲突」而不是覆盖别人的修改。

编辑器

- 左侧条目列表:搜索框过滤(标题/正文/关键词),四个筛选页签(全部/蓝灯/绿灯/停用)。
- 右侧表单:标题、激活方式(蓝灯·常驻/绿灯·关键词)、关键词、区分大小写、触发频率(每会话首次命中/每次新消息命中)、启用开关、删除。
- 顶部:重新读取(放弃本页草稿)与保存更改(Ctrl+S 同效)。有未保存修改时关闭页面会拦一下。
- 保存走乐观锁:文件被别人(或 Agent)改过就返回 409,页面上给提示并保留你的草稿,让你重新读取后再合并。
- 备注:修改在保存后才落盘;蓝灯段在下次模型调用时读到新内容,已经进入历史对话的背景资料不会从历史里抹掉。

并发与安全语义

- 修订号:文件内容的 SHA-256。引擎、编辑器、以及所有协作写入者共用同一个修订号做乐观锁。
- 写锁:每次写盘前用 open(path, 'wx') 抢一个 worldbook.json.lock。抢不到就明确失败,绝不偷锁、绝不静默覆盖。
- 原子替换:写临时文件 → fsync → rename 覆盖,读到的永远是完整文件。
- 二次校验:持锁后以及替换前各再读一次修订号,能抓到不守规矩的外部改动。
- 编辑器 HTTP 面:PUT /worldbook/api 要求同源(校验 Origin 与 sec-fetch-site)、Content-Type: application/json、请求体 ≤ 1 MiB;写盘前先备份 worldbook.json.bak;响应带 no-store 与 nosniff,编辑器页面带 CSP。
- 编辑器只监听本机 dsh web 服务器,不额外开端口。

触发语义细节

- 命中判定基于本轮进入的 user 消息文本;插件自己插入的合成消息不参与匹配(不会自我触发)。
- 关键词是纯子串包含,不做分词、不支持正则;caseSensitive: false 时两侧都转小写再比。
- repeat: once:同一个 agent 内,同一版本的条目只注入一次。「版本」是该条目对象的 JSON 哈希 —— 条目内容被改动后,哈希变了,可以再次注入。
- repeat: always:只要命中就注入。
- 合成消息紧跟触发它的那条用户消息之后插入,source.kind 为 plugin,视觉上与用户消息区分开。
- 蓝灯段与绿灯匹配都会在每次模型调用前重读文件,所以手改 worldbook.json 立即生效(除非你改的是插件配置里的路径)。

常见问题

编辑器 404 / 设置里没有「世界书」:确认 worldbook-editor/ 放进了 profile 的 plugins/、patch 里的相对路径对得上、profile 名没错(~/.dsh/profiles//),然后重启 dsh。

改了文件不生效:蓝灯与绿灯都会重读文件;只有改插件配置(config.path、sectionOrder)才需要重启。

保存报 409:文件被其他页面或 Agent 改过,点「重新读取」合并后重存。

提示世界书被锁定:有写入者没释放 worldbook.json.lock。确认没有正在写的进程后删掉这个残留文件即可。

条目明明命中却不注入:检查 enabled 是否为 false、keys 是否写成了别的分词、repeat: once 是否在本会话已经触发过;get 一下看看到底存的是什么。

License

MIT © 2026 libolunm

English summary

A tavern-style world book for DeepSeek Harness (dsh). Two halves:

- worldbook/ — the engine, mounted inside an agent preset via agent.cordis.yml. It renders constant entries as a standing system-prompt section, injects keyword-matched entries as a synthetic message on agent/pre-step, and registers a worldbook read/write tool.
- worldbook-editor/ — a same-origin web editor served by the dsh web server at /worldbook, mounted as a settings section through the profile's cordis.patch.yml.

Both halves share one worldbook.json (SHA-256 revision for optimistic locking, exclusive .lock file, atomic temp-write + rename). Path resolution: config.path → DSH_WORLDBOOK_PATH → ~/.dsh/.agent-presets/tavern/worldbook.json. MIT licensed.
预览分享卡片长什么样 ↓libolunm/dsh-worldbook
分享 · DeepSeek Harness Hub
libolunm/dsh-worldbook

用蓝灯常驻与绿灯关键词给模型注入背景设定

回到顶部